48 장. 배경 사설 토토 프로세스

PostgreSQL을 별도의 프로세스에서 사용자 공급 코드를 실행하도록 확장 할 수 있습니다. 이러한 프로세스는 시작, 중지 및 모니터링됩니다.Postgres,이를 통해 서버의 상태와 밀접하게 연결될 수 있습니다. 이 프로세스는에 첨부됩니다.postgresql의 공유 메모리 영역으로 내부적으로 데이터베이스에 연결할 수있는 옵션이 있습니다. 또한 일반 클라이언트 연결 서버 프로세스와 마찬가지로 여러 트랜잭션을 연속적으로 실행할 수 있습니다. 또한 링크libpq서버에 연결하고 일반 클라이언트 응용 프로그램처럼 행동 할 수 있습니다.

경고

배경 사설 토토 프로세스를 사용하는 데 상당한 견고성과 보안 위험이 있습니다.C언어, 그들은 데이터에 대한 무제한 액세스 권한이 있습니다. 배경 사설 토토 프로세스를 포함하는 모듈을 활성화하려는 관리자는 매우주의를 기울여야합니다. 신중하게 감사 된 모듈 만 배경 사설 토토 프로세스를 실행할 수 있어야합니다.

배경 사설 토토는 당시에 초기화 될 수 있습니다PostgreSQL모듈 이름을 포함하여 시작됩니다shared_preload_libraries. 배경 사설 토토를 실행하려는 모듈은 전화하여 등록 할 수 있습니다RegisterBackgroundWorker (배경 worker *노동자)_pg_init ()함수. 통화로 시스템이 시작되고 실행 된 후에도 배경 사설 토토가 시작될 수 있습니다RegisterDynamicbackbackgroundworker (배경 worker *노동자, BackgroundWorkerHandle **핸들). 같지 않은RegisterBackgroundWorker, 포스트 마스터 프로세스 내에서만 호출 할 수 있습니다.RegisterDynamicbackbackgroundworker일반 백엔드 또는 다른 백그라운드 사설 토토에서 호출해야합니다.

구조배경 worker따라서 정의됩니다.

typedef void (*bgworker_main_type) (datum main_arg);
typedef 구조 배경 작업자

    char bgw_name [bgw_maxlen];
    char bgw_type [bgw_maxlen];
    int bgw_flags;
    bgworkerstarttime bgw_start_time;
    int bgw_restart_time;       / * 몇 초 만에 bgw_never_restart */
    char bgw_library_name [bgw_maxlen];
    char bgw_function_name [bgw_maxlen];
    Datum BGW_MAIN_ARG;
    char bgw_extra [bgw_extralen];
    pid_t bgw_notify_pid;
 bekgroundworker;

bgw_nameandbgw_type문자열은 로그 메시지, 프로세스 목록 및 유사한 컨텍스트에 사용할 문자열입니다.bgw_type예를 들어 프로세스 목록에서 해당 사설 토토를 그룹화 할 수 있도록 동일한 유형의 모든 백그라운드 사설 토토에 대해 동일해야합니다.bgw_name반면에 특정 프로세스에 대한 추가 정보가 포함될 수 있습니다. (일반적으로 문자열bgw_name어떻게 든 유형이 포함되어 있지만 엄격하게 필요하지 않습니다.)

bgw_flags는 모듈이 원하는 기능을 나타내는 비트 또는 비트 마스크입니다. 가능한 가치는 다음과 같습니다.

bgworker_shmem_access

공유 메모리 액세스 요청. 이 깃발이 필요합니다.

bgworker_backend_database_connection

나중에 트랜잭션 및 쿼리를 실행할 수있는 데이터베이스 연결을 설정하는 기능을 요청합니다. 사용을 사용하는 백그라운드 사설 토토bgworker_backend_database_connection데이터베이스에 연결하려면를 사용하여 공유 메모리를 첨부해야합니다.bgworker_shmem_access또는 노동자 스타트 업이 실패합니다.

BGW_START_TIME그 동안의 서버 상태입니다Postgres프로세스를 시작해야합니다. 중 하나 일 수 있습니다.bgworkerstart_postmasterstart(곧 시작Postgres13534_13651bgworkerstart_consistentstate(일관된 상태에 도달하자마자 시작하여 프로세스가 데이터베이스에 연결하고 읽기 전용 쿼리를 실행할 수있게 함) 및 및bgworkerstart_recoveryFinished(시스템이 정상적인 읽기 쓰기 상태에 들어가 자마자 시작). 참고 마지막 두 값은 핫 스탠드가 아닌 서버에서 동일합니다. 이 설정은 프로세스가 시작될 때만 나타냅니다. 다른 상태에 도달하면 멈추지 않습니다.

BGW_RESTART_TIME는 몇 초 만에 그 간격입니다Postgres충돌시 프로세스를 다시 시작하기 전에 기다려야합니다. 긍정적 가치가 될 수 있습니다.BGW_NEVER_RESTART, 충돌시 프로세스를 다시 시작하지 않음을 나타냅니다.

bgw_library_name는 백그라운드 사설 토토의 초기 진입 점을 찾아야하는 라이브러리의 이름입니다. 명명 된 라이브러리는 사설 토토 프로세스에 의해 동적으로로드됩니다.bgw_function_name호출 할 함수를 식별하는 데 사용됩니다. 핵심 코드에서 함수를 호출하는 경우로 설정해야합니다."Postgres".

bgw_function_name새로운 백그라운드 사설 토토의 초기 진입 점으로 사용할 함수의 이름입니다. 이 기능이 동적으로로드 된 라이브러리에있는 경우 표시해야합니다.pgdllexport(그리고 아님static).

BGW_MAIN_ARGDatum백그라운드 사설 토토 주요 기능에 대한 인수. 이 주요 기능은 유형의 단일 인수를 취해야합니다Datumand returnvoid. BGW_MAIN_ARG논증으로 전달됩니다. 또한 글로벌 변수MyBgworkerentry사본을 가리 킵니다배경 worker등록 시간에 통과 된 구조; 근로자는이 구조를 조사하는 것이 도움이 될 수 있습니다.

Windows에서 (그리고 다른 곳exec_backend정의 됨) 또는 동적 배경 사설 토토에서는 전달하는 것이 안전하지 않습니다Datum값 만 참조하여. 인수가 필요한 경우 int32 또는 기타 작은 값을 전달하여 공유 메모리에 할당 된 배열로 인덱스로 사용하는 것이 가장 안전합니다. a와 같은 값인 경우cstring또는텍스트전달됩니다. 그러면 새로운 배경 사설 토토 프로세스에서 포인터가 유효하지 않습니다.

bgw_extra배경 작업자에게 전달할 추가 데이터를 포함 할 수 있습니다. 같지 않은BGW_MAIN_ARG,이 데이터는 사설 토토의 주요 기능에 대한 인수로 전달되지 않지만에 액세스 할 수 있습니다MyBgworkerentry, 위에서 논의한대로.

bgw_notify_pidPostgresql 백엔드 프로세스의 PID는 우체국 장이 보내야합니다SigusR1프로세스가 시작되거나 종료 될 때. 우체국 마스터 스타트 업 시간에 등록 된 근로자 또는 근로자 등록이 근로자가 시작되기를 기다리지 않을 때는 0이어야합니다. 그렇지 않으면 초기화되어야합니다.MyProcPid.

일단 실행되면 프로세스가 전화하여 데이터베이스에 연결할 수 있습니다BackgroundWorkerInitializeConnection (char *dbname, char *username, UINT32 플래그)또는BackgroundWorkerInitializeConnectionByoid (OID DBOID, OID USEROOD, UINT32 플래그). 이를 통해 프로세스는를 사용하여 트랜잭션 및 쿼리를 실행할 수 있습니다.SPI인터페이스. 만약에dbnameis null 또는dboidisInvalidoid, 세션은 특정 데이터베이스에 연결되어 있지 않지만 공유 카탈로그에 액세스 할 수 있습니다. 만약에사용자 이름is null 또는useroidisInvalidoid, 프로세스는 |initdb. 만약에bgworker_bypass_allowconn플래그사용자 연결을 허용하지 않는 데이터베이스에 연결하도록 제한을 우회 할 수 있습니다. 배경 사설 토토는이 두 기능 중 하나만 전화 할 수 있으며 한 번만 호출 할 수 있습니다. 데이터베이스를 전환 할 수 없습니다.

제어가 배경 사설 토토의 주요 기능에 도달하면 신호가 처음 차단되며, 이에 의해 차단 해제되어야합니다. 이는 프로세스가 필요한 경우 신호 처리기를 사용자 정의 할 수 있도록하는 것입니다. 새로운 프로세스에서 신호를 차단 해제 할 수 있습니다BackgroundWorkerUnblockSignals전화로 차단BackgroundWorkerBlockSignals.

ifBGW_RESTART_TIME배경 사설 토토의 경우로 구성됩니다.BGW_NEVER_RESTART, 또는 종료 코드가 0으로 종료되거나 종료되는 경우TernatineBackgroundworker, 출구의 우체국 장에 의해 자동으로 등록되지 않습니다. 그렇지 않으면,이를 통해 구성된 시간 이후에 다시 시작됩니다BGW_RESTART_TIME실행을 일시적으로 중단 해야하는 백엔드는 일시적으로 나가기보다는 중단 가능한 수면을 사용해야합니다. 이것은 전화하여 달성 할 수 있습니다Waitlatch (). 확인하십시오wl_postmaster_death해당 함수를 호출 할 때 플래그가 설정되어 있으며 응급 상황에서 신속한 종료에 대한 반환 코드를 확인하십시오.Postgres자체가 종료되었습니다.

19979_20030registerDynamicbackgroundworker함수, 백엔드가 등록을 수행하여 사설 토토의 상태에 관한 정보를 얻을 수 있습니다. 이를 원하는 백엔드는 a의 주소를 전달해야합니다.BackgroundWorkerHandle *두 번째 인수RegisterDynamicbackbackgroundworker. 작업자가 성공적으로 등록되면이 포인터는 불투명 핸들로 초기화되어 이후에 전달할 수 있습니다.getbackgroundworkerpid (BackgroundWorkerHandle *, pid_t *)또는TernatineBackgroundworker (BackgroundWorkerHandle *). getbackgroundworkerpid근로자의 상태를 폴링하는 데 사용될 수 있습니다 : 반환 값BGWH_NOT_YET_STARTED우체국에 의해 직원이 아직 시작되지 않았 음을 나타냅니다.bgwh_stopped그것이 시작되었지만 더 이상 실행되지 않았 음을 나타냅니다. 그리고bgwh_started현재 실행 중임을 나타냅니다. 이 마지막 경우, PID는 두 번째 인수를 통해 반환됩니다.TernatineBackgroundworkerPostmaster가 보내도록Sigterm작동중인 경우 사설 토토에게, 그렇지 않은 즉시 등록 해제합니다.

경우에 따라 배경 사설 토토를 등록하는 프로세스는 사설 토토가 시작되기를 기다릴 수 있습니다. 이것은 초기화함으로써 달성 될 수 있습니다bgw_notify_pidtoMyProcpid그런 다음 전달BackgroundWorkerHandle *등록 시간에 획득Waitforbackgroundworkerstrup (BackgroundWorkerHandle *핸들, pid_t *)함수. 이 기능은 우체국 장이 배경 사설 토토를 시작하려고 시도하거나 우체국이 죽을 때까지 차단됩니다. 백그라운드 사설 토토가 실행중인 경우 반환 값이입니다.bgwh_started, PID는 제공된 주소에 기록됩니다. 그렇지 않으면 반환 값은입니다.bgwh_stopped또는bgwh_postmaster_died.

프로세스는 또한 백그라운드 사설 토토가 종료 될 때까지 기다릴 수 있습니다.Waitforbackgroundworkershutdown (BackgroundWorkerHandle *핸들)기능 및 전달BackgroundWorkerHandle *등록시 획득. 이 기능은 백그라운드 사설 토토가 종료 될 때까지 차단되거나 우체국 장 마스터가 사라질 때까지 차단됩니다. 배경 사설 토토가 종료되면 반환 값이입니다.bgwh_stopped, 포스트 마스터가 죽으면 반환bgwh_postmaster_died.

배경 사설 토토는를 사용하여 비동기식 알림 메시지를 보낼 수 있습니다NotifySPI또는 직접async_notify (). 이러한 알림은 트랜잭션 커밋에서 발송됩니다. 백그라운드 사설 토토는에 비동기 알림을 받기 위해 등록해서는 안됩니다.듣기명령, 사설 토토가 그러한 알림을 소비 할 인프라가 없으므로

theSRC/TEST/MODULES/WORKER_SPI모듈은 몇 가지 유용한 기술을 보여주는 작업 예제를 포함합니다.

등록 된 백그라운드 사설 토토의 최대 수는max_worker_processes.

정정 제출

옳지 않은 문서에 아무것도 표시되면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면