47장. 백그라운드 배트맨 토토 프로세스

PostgreSQL을 확장하여 별도의 프로세스에서 사용자 제공 코드를 실행할 수 있습니다. 이러한 프로세스는 다음에 의해 시작, 중지 및 모니터링됩니다.포스트그레, 이는 서버 상태와 긴밀하게 연결된 수명을 허용합니다. 이러한 프로세스에는 다음에 연결할 수 있는 옵션이 있습니다.포스트그레SQL의 공유 메모리 영역과 내부적으로 데이터베이스에 연결합니다. 또한 일반 클라이언트 연결 서버 프로세스처럼 여러 트랜잭션을 직렬로 실행할 수도 있습니다. 또한, 다음으로 연결하여libpq서버에 연결하여 일반 클라이언트 애플리케이션처럼 작동할 수 있습니다.

경고

백그라운드 작업자 프로세스를 사용하면 상당한 견고성과 보안 위험이 있습니다. 왜냐하면 다음에서 작성되기 때문입니다.C언어를 사용하면 데이터에 무제한으로 접근할 수 있습니다. 백그라운드 배트맨 토토 프로세스가 포함된 모듈을 활성화하려는 관리자는 매우 주의해야 합니다. 신중하게 감사된 모듈만 백그라운드 배트맨 토토 프로세스를 실행하도록 허용되어야 합니다.

백그라운드 배트맨 토토는 해당 시점에 초기화될 수 있습니다.포스트그레SQL다음에 모듈 이름을 포함하여 시작됩니다.shared_preload_libraries. 백그라운드 배트맨 토토를 실행하려는 모듈은 호출하여 등록할 수 있습니다.RegisterBackgroundWorker(BackgroundWorker *노동자)그것으로부터_PG_init()함수. 시스템이 가동되고 실행된 후에 백그라운드 배트맨 토토를 호출하여 시작할 수도 있습니다.DynamicBackgroundWorker 등록(BackgroundWorker *노동자, BackgroundWorkerHandle **처리). 달리BackgroundWorker 등록, 포스트마스터 프로세스 내에서만 호출할 수 있습니다.DynamicBackgroundWorker 등록일반 백엔드 또는 다른 백그라운드 배트맨 토토에서 호출해야 합니다.

구조BackgroundWorker다음과 같이 정의됩니다.

typedef void (*bgworker_main_type)(Datum main_arg);
typedef 구조체 BackgroundWorker

    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];
    데이텀 bgw_main_arg;
    char bgw_extra[BGW_EXTRALEN];
    int bgw_notify_pid;
 BackgroundWorker;

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

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

BGWORKER_SHMEM_ACCESS

공유 메모리 접근을 요청합니다. 공유 메모리에 액세스할 수 없는 작업자는 다음 항목에 액세스할 수 없습니다.PostgreSQL의무거운 또는 가벼운 잠금, 공유 버퍼 또는 작업자가 직접 만들고 사용하려는 사용자 정의 데이터 구조와 같은 공유 데이터 구조.

BGWORKER_BACKEND_DATABASE_CONNECTION

나중에 트랜잭션과 쿼리를 실행할 수 있는 데이터베이스 연결을 설정하는 기능을 요청합니다. 다음을 사용하는 백그라운드 작업자BGWORKER_BACKEND_DATABASE_CONNECTION데이터베이스에 연결하려면 다음을 사용하여 공유 메모리도 연결해야 합니다.BGWORKER_SHMEM_ACCESS, 그렇지 않으면 배트맨 토토 시작이 실패합니다.

bgw_start_time이동하는 동안의 서버 상태입니다포스트그레스프로세스를 시작해야 합니다. 다음 중 하나일 수 있습니다.BgWorkerStart_PostmasterStart(즉시 시작포스트그레스자체 초기화가 완료되었습니다. 이를 요청하는 프로세스는 데이터베이스 연결에 적합하지 않습니다),BgWorkerStart_CondependentState(상시 대기에서 일관된 상태에 도달하자마자 시작하여 프로세스가 데이터베이스에 연결하고 읽기 전용 쿼리를 실행할 수 있도록 허용) 및BgWorkerStart_RecoveryFinished(시스템이 정상적인 읽기-쓰기 상태에 진입하자마자 시작). 마지막 두 값은 상시 대기가 아닌 서버에서 동일합니다. 이 설정은 프로세스가 시작되는 시기만 나타냅니다. 다른 상태에 도달해도 멈추지 않습니다.

bgw_restart_time초 단위의 간격입니다.포스트그레충돌이 발생할 경우 프로세스를 다시 시작하기 전에 기다려야 합니다. 양수 값일 수 있습니다. 또는BGW_NEVER_RESTART, 충돌 발생 시 프로세스를 다시 시작하지 않음을 나타냅니다.

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

bgw_function_name은 새 백그라운드 배트맨 토토의 초기 진입점으로 사용해야 하는 동적으로 로드된 라이브러리의 함수 이름입니다.

bgw_main_arg이것은데이텀백그라운드 작업자 기본 기능에 대한 인수입니다. 이 기본 함수는 다음 유형의 단일 인수를 취해야 합니다.데이텀그리고 돌아옴무효. bgw_main_arg인수로 전달됩니다. 또한 전역 변수MyBgworkerEntry다음의 사본을 가리킵니다.BackgroundWorker등록 시 구조가 전달되었습니다. 작업자는 이 구조를 조사하는 것이 도움이 될 수 있습니다.

Windows(및 기타 모든 곳에서)EXEC_BACKEND이 정의됨) 또는 동적 백그라운드 배트맨 토토에서는 a를 전달하는 것이 안전하지 않습니다.데이텀참조로, 값으로만. 인수가 필요한 경우 int32 또는 기타 작은 값을 전달하고 이를 공유 메모리에 할당된 배열에 대한 인덱스로 사용하는 것이 가장 안전합니다. a와 같은 값인 경우cstring또는텍스트이 전달되면 포인터는 새 백그라운드 배트맨 토토 프로세스에서 유효하지 않습니다.

bgw_extra백그라운드 작업자에게 전달될 추가 데이터를 포함할 수 있습니다. 달리bgw_main_arg, 이 데이터는 작업자의 기본 함수에 인수로 전달되지 않지만 다음을 통해 액세스할 수 있습니다.MyBgworkerEntry, 위에서 설명한 대로입니다.

bgw_notify_pid포스트마스터가 보내야 하는 PostgreSQL 백엔드 프로세스의 PID입니다.SIGUSR1프로세스가 시작되거나 종료될 때. 포스트마스터 시작 시간에 등록된 작업자의 경우 또는 작업자를 등록하는 백엔드가 작업자가 시작될 때까지 기다리지 않으려는 경우 0이어야 합니다. 그렇지 않으면 다음으로 초기화되어야 합니다.MyProcPid.

실행되면 프로세스는 호출을 통해 데이터베이스에 연결할 수 있습니다.BackgroundWorkerInitializeConnection(char *dbname, char *사용자 이름, uint32 플래그)또는BackgroundWorkerInitializeConnectionByOid(오이드 드보이드, Oid 유저로이드, uint32 플래그). 이를 통해 프로세스는 다음을 사용하여 트랜잭션과 쿼리를 실행할 수 있습니다.SPI인터페이스. 만일db이름NULL이거나doidisInvalidOid, 세션이 특정 데이터베이스에 연결되어 있지 않지만 공유 카탈로그에 액세스할 수 있습니다. 만일사용자 이름NULL이거나유저로이드isInvalidOid, 프로세스는 동안 생성된 수퍼유저로 실행됩니다.initdb. 만일BGWORKER_BYPASS_ALLOWCONN다음과 같이 지정됨플래그사용자 연결을 허용하지 않는 데이터베이스에 연결하는 제한을 우회할 수 있습니다. 백그라운드 배트맨 토토는 이 두 함수 중 하나만, 한 번만 호출할 수 있습니다. 데이터베이스를 전환할 수 없습니다.

신호는 제어가 백그라운드 작업자의 주요 기능에 도달할 때 처음에 차단되며 이에 의해 차단 해제되어야 합니다. 이는 필요한 경우 프로세스가 신호 처리기를 사용자 정의할 수 있도록 하기 위한 것입니다. 다음을 호출하여 새 프로세스에서 신호를 차단 해제할 수 있습니다.BackgroundWorkerUnblockSignals전화로 차단됨BackgroundWorkerBlockSignals.

만약bgw_restart_time백그라운드 작업자의 경우 다음과 같이 구성됩니다.BGW_NEVER_RESTART, 또는 종료 코드 0으로 종료되거나에 의해 종료되는 경우BackgroundWorker 종료, 종료 시 포스트마스터가 자동으로 등록을 취소합니다. 그렇지 않으면 다음을 통해 구성된 기간 후에 다시 시작됩니다.bgw_restart_time또는 백엔드 오류로 인해 포스트마스터가 클러스터를 다시 초기화하는 경우 즉시 발생합니다. 실행을 일시적으로만 일시 중지해야 하는 백엔드는 종료하는 대신 중단 가능한 절전 모드를 사용해야 합니다. 이는 다음을 호출하여 달성할 수 있습니다.대기 래치(). 다음을 확인하세요.WL_POSTMASTER_DEATH플래그는 해당 함수를 호출할 때 설정되며 긴급 상황에서 프롬프트 종료를 위한 반환 코드를 확인합니다.포스트그레자체가 종료되었습니다.

백그라운드 작업자가 다음을 사용하여 등록된 경우DynamicBackgroundWorker 등록함수를 사용하면 등록을 수행하는 백엔드에서 작업자 상태에 관한 정보를 얻을 수 있습니다. 이를 수행하려는 백엔드는 a의 주소를 전달해야 합니다.BackgroundWorkerHandle *두 번째 인수로DynamicBackgroundWorker 등록. 배트맨 토토가 성공적으로 등록되면 이 포인터는 이후에 전달될 수 있는 불투명 핸들로 초기화됩니다.GetBackgroundWorkerPid(BackgroundWorkerHandle *, pid_t *)또는BackgroundWorker 종료(BackgroundWorkerHandle *). GetBackgroundWorkerPid배트맨 토토의 상태를 폴링하는 데 사용할 수 있습니다. 반환 값은BGWH_NOT_YET_STARTED포스트마스터가 배트맨 토토를 아직 시작하지 않았음을 나타냅니다.BGWH_STOPPED시작되었지만 더 이상 실행되지 않음을 나타냅니다. 그리고BGWH_STARTED현재 실행 중임을 나타냅니다. 이 마지막 경우에는 PID가 두 번째 인수를 통해서도 반환됩니다.BackgroundWorker 종료우체국장이 보내도록 합니다SIGTERM실행 중인 경우 배트맨 토토에게 전달하고 그렇지 않은 경우 즉시 등록을 취소합니다.

어떤 경우에는 백그라운드 배트맨 토토를 등록하는 프로세스가 배트맨 토토가 시작될 때까지 기다리기를 원할 수도 있습니다. 이는 초기화를 통해 수행할 수 있습니다.bgw_notify_pidMyProcPid그런 다음 전달BackgroundWorkerHandle *등록 시 획득WaitForBackgroundWorkerStartup(BackgroundWorkerHandle *핸들, pid_t *)함수. 이 함수는 포스트마스터가 백그라운드 작업자를 시작하려고 시도하거나 포스트마스터가 죽을 때까지 차단됩니다. 백그라운드 작업자가 실행 중인 경우 반환 값은 다음과 같습니다.BGWH_STARTED, 제공된 주소에 PID가 기록됩니다. 그렇지 않으면 반환 값은 다음과 같습니다.BGWH_STOPPED또는BGWH_POSTMASTER_DIED.

프로세스는 다음을 사용하여 백그라운드 작업자가 종료될 때까지 기다릴 수도 있습니다.WaitForBackgroundWorkerShutdown(BackgroundWorkerHandle *핸들)함수 및 전달BackgroundWorkerHandle *등록 시 획득합니다. 이 함수는 백그라운드 작업자가 종료되거나 포스트마스터가 죽을 때까지 차단됩니다. 백그라운드 작업자가 종료되면 반환 값은 다음과 같습니다.BGWH_STOPPED, 우체국장이 죽으면 반환됩니다.BGWH_POSTMASTER_DIED.

백그라운드 작업자는 다음 중 하나를 사용하여 비동기 알림 메시지를 보낼 수 있습니다.알림명령을 통해SPI또는 직접 경유Async_Notify(). 이러한 알림은 트랜잭션 커밋 시 전송됩니다. 백그라운드 작업자는를 사용하여 비동기 알림을 수신하도록 등록하면 안 됩니다.듣기명령, 작업자가 이러한 알림을 사용할 수 있는 인프라가 없기 때문입니다.

src/test/modules/worker_spi모듈에는 몇 가지 유용한 기술을 보여주는 작업 예제가 포함되어 있습니다.

등록된 백그라운드 작업자의 최대 수는 다음에 의해 제한됩니다.max_worker_processes.

수정사항 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.