PostgreSQL을 확장하여 별도의 토토 캔에서 사용자가 공급 한 코드를 실행할 수 있습니다. 이러한 토토 캔는 시작, 중지 및 모니터링됩니다.Postgres,이를 통해 서버의 상태와 밀접하게 연결될 수 있습니다. 이 토토 캔에는 첨부 할 수있는 옵션이 있습니다.PostgreSQL의 공유 메모리 영역과 내부적으로 데이터베이스에 연결합니다. 또한 일반 클라이언트 연결 서버 토토 캔와 마찬가지로 여러 트랜잭션을 연속적으로 실행할 수 있습니다.libpq서버에 연결하고 일반 클라이언트 응용 프로그램처럼 행동 할 수 있습니다.
경고 |
배경 작업자 토토 캔를 사용하는 데 상당한 견고성과 보안 위험이 있습니다.C언어, 데이터에 대한 무제한 액세스가 있습니다. 배경 작업자 토토 캔를 포함하는 모듈을 활성화하려는 관리자는 매우주의를 기울여야합니다. |
배경 작업자는 당시에 초기화 될 수 있습니다PostgreSQL모듈 이름을 포함하여 시작됩니다shared_preload_libraries. 배경 작업자를 실행하려는 모듈은 전화하여 등록 할 수 있습니다RegisterBackgroundWorker (BackgroundWorker *Worker)
에서_pg_init ()
. 백그라운드 작업자는 시스템을 시작한 후에도 시작될 수 있으며 함수를 호출하여 실행할 수 있습니다.RegisterDynamicbackbackgroundworker (BackgroundWorker *Worker, BackgroundWorkerHandle ** 핸들)
. 같지 않은RegisterBackgroundWorker
, 우체국 내에서만 호출 할 수 있습니다.RegisterDynamicbackbackgroundworker
정기적 인 백엔드에서 호출해야합니다.
구조배경 worker따라서 정의됩니다.
typedef void (*bgworker_main_type) (datum main_arg);
bgw_name로그 메시지, 토토 캔 목록 및 유사한 컨텍스트에 사용되는 문자열입니다.
bgw_flags는 모듈이 원하는 기능을 나타내는 비트 또는 비트 마스크입니다. 가능한 가치는 다음과 같습니다.
공유 메모리 액세스 요청. 공유 메모리 액세스가없는 작업자는에 액세스 할 수 없습니다.postgresql 's헤비급 또는 경량 잠금, 공유 버퍼 또는 작업자 자체가 생성 및 사용하려는 사용자 정의 데이터 구조와 같은 공유 데이터 구조.
나중에 트랜잭션 및 쿼리를 실행할 수있는 데이터베이스 연결을 설정하는 기능을 요청합니다. 사용을 사용하는 백그라운드 작업자bgworker_backend_database_connection데이터베이스에 연결하려면 공유 메모리를 사용하여 첨부해야합니다.bgworker_shmem_access또는 노동자 스타트 업이 실패합니다.
BGW_START_TIME그 동안의 서버 상태입니다Postgres토토 캔를 시작해야합니다. 중 하나 일 수 있습니다.bgworkerstart_postmasterstart(곧 시작Postgres자체 자체 초기화를 마쳤습니다. 이를 요청하는 토토 캔는 데이터베이스 연결에 적합하지 않습니다),bgworkerstart_consistentstate(일관된 상태가 핫 스탠드에서 도달하자마자 시작하여 프로세스가 데이터베이스에 연결하고 읽기 전용 쿼리를 실행할 수있게 함) 및bgworkerstart_recoveryFinished(시스템이 정상적인 읽기 쓰기 상태에 들어가 자마자 시작). 참고 마지막 두 값은 핫 스탠드가 아닌 서버에서 동일합니다.
BGW_RESTART_TIME는 몇 초 만에 그 간격입니다Postgres충돌시 토토 캔를 다시 시작하기 전에 기다려야합니다. 긍정적 가치가 될 수 있습니다.BGW_NEVER_RESTART, 충돌시 토토 캔를 다시 시작하지 않음을 나타냅니다.
bgw_main프로세스가 시작될 때 실행되는 기능에 대한 포인터입니다. 이 필드는 공유 라이브러리가 다른 백엔드 프로세스의 다른 시작 주소로로드 될 수 있기 때문에 핵심 서버 내에서 기능을 시작하는 데 안전하게 사용할 수 있습니다.shared_preload_libraries. 해당 메커니즘이 사용 되더라도 주소 공간 레이아웃 변형은 Windows에서 여전히 발생하며exec_backend사용됩니다. 따라서이 API의 대부분의 사용자는이 필드를 NULL로 설정해야합니다.bgw_library_nameandbgw_function_name.
bgw_library_name배경 작업자의 초기 진입 점을 찾아야하는 라이브러리의 이름입니다. 명명 된 라이브러리는 작업자 토토 캔에 의해 동적으로로드됩니다.bgw_function_name호출 할 함수를 식별하는 데 사용됩니다. 핵심 코드에서 함수를로드하는 경우bgw_main대신 설정해야합니다.
bgw_function_name동적으로로드 된 라이브러리의 함수 이름은 새로운 백그라운드 작업자의 초기 진입 점으로 사용되어야합니다.
BGW_MAIN_ARGDatum백그라운드 작업자 주요 기능에 대한 인수. 그 함수가 |bgw_main또는 조합을 통해bgw_library_name
andbgw_function_name
,이 주요 함수는 유형의 단일 인수를 취해야합니다Datumand returnvoid. BGW_MAIN_ARG인수로 전달됩니다. 또한 글로벌 변수MyBgworkerentry사본을 가리 킵니다배경 worker등록 시간에 통과 된 구조; 근로자는이 구조를 조사하는 것이 도움이 될 수 있습니다.
Windows에서 (그리고 다른 곳exec_backend정의 됨) 또는 동적 배경 작업자에서는 전달하는 것이 안전하지 않습니다Datum참조 적으로만 값으로 만. 인수가 필요한 경우 int32 또는 기타 작은 값을 전달하여 공유 메모리에 할당 된 배열로 인덱스로 사용하는 것이 가장 안전합니다.cstring또는텍스트전달됩니다. 그러면 새 배경 작업자 프로세스에서 포인터가 유효하지 않습니다.
bgw_extra배경 작업자에게 전달할 추가 데이터를 포함 할 수 있습니다. 같지 않은BGW_MAIN_ARG,이 데이터는 작업자의 주요 기능에 대한 인수로 전달되지 않지만에 액세스 할 수 있습니다MyBgworkerentry, 위에서 논의한대로.
bgw_notify_pidPostgresql 백엔드 프로세스의 PID는 Postmaster가 보내야 할 Postgresql 백엔드 프로세스의 PID입니다sigusr1프로세스가 시작되거나 종료 될 때. 우체국 마스터 스타트 업 시간에 등록 된 근로자 또는 근로자 등록이 근로자가 시작되기를 기다리지 않을 때는 0이어야합니다.MyProcPid.
일단 실행되면 토토 캔가 전화하여 데이터베이스에 연결할 수 있습니다BackgroundWorkerInitializeConnection (char *dbname, char *username)
또는BackgroundWorkerInitializeConnectionByoid (OID DBOID, OID Useroid)
. 이를 통해 토토 캔는를 사용하여 트랜잭션 및 쿼리를 실행할 수 있습니다.SPI인터페이스. 만약에dbnameis null 또는dboidisinvalidoid, 세션은 특정 데이터베이스에 연결되어 있지 않지만 공유 카탈로그에 액세스 할 수 있습니다. 만약에사용자 이름is null 또는useroidisinvalidoid, 토토 캔는 |initdb. 배경 작업자는이 두 기능 중 하나만 전화 할 수 있으며 한 번만 호출 할 수 있습니다.
제어가 도달하면 신호가 처음 차단됩니다bgw_main함수, 이에 의해 차단 해제되어야합니다. 이는 토토 캔가 필요한 경우 신호 처리기를 사용자 정의 할 수 있도록하는 것입니다.BackgroundWorkerUnblockSignals
전화로 차단BackgroundWorkerBlockSignals
.
ifBGW_RESTART_TIME배경 작업자의 경우로 구성됩니다.BGW_NEVER_RESTART또는 종료 코드가 0으로 종료되거나 종료되는 경우TernatineBackgroundworker
, 출구의 우체국 장에 의해 자동으로 등록되지 않습니다. 그렇지 않으면,이를 통해 구성된 시간 이후에 다시 시작됩니다BGW_RESTART_TIME또는 즉시 백엔드 실패로 인해 우체국 장이 클러스터를 다시 화하는 경우 즉시. 실행을 일시적으로 중단 해야하는 백엔드는 일시적으로 나가기보다는 중단 가능한 수면을 사용해야합니다.Waitlatch ()
. 확인하십시오wl_postmaster_death해당 함수를 호출 할 때 플래그가 설정되어 있으며 응급 상황에서 신속한 종료에 대한 반환 코드를 확인하십시오.Postgres자체가 종료되었습니다.
배경 작업자가 등록 된 경우RegisterDynamicbackbackgroundworker
함수, 등록을 수행하는 백엔드가 작업자의 상태에 관한 정보를 얻을 수 있습니다. 이를 원하는 백엔드는 a의 주소를 전달해야합니다.BackgroundWorkerHandle *두 번째 논쟁으로RegisterDynamicbackbackgroundworker
. 작업자가 성공적으로 등록되면이 포인터는 불투명 핸들로 초기화되어 이후에 전달할 수 있습니다.getbackgroundworkerpid (BackgroundWorkerHandle *, pid_t *)
또는TernatineBackgroundworker (BackgroundWorkerHandle *)
. getbackgroundworkerpid
근로자의 상태를 폴링하는 데 사용될 수 있습니다 : 반환 값bgwh_not_yet_started근로자가 아직 우체국에 의해 시작되지 않았 음을 나타냅니다.bgwh_stopped그것이 시작되었지만 더 이상 실행되지 않았 음을 나타냅니다. 그리고bgwh_started현재 실행 중임을 나타냅니다. 이 마지막 경우, PID는 두 번째 인수를 통해 반환됩니다.TernatineBackgroundworker
Postmaster가 보내도록Sigterm근로자가 실행중인 경우 근로자에게, 그렇지 않은 즉시 등록하지 않도록합니다.
경우에 따라 배경 작업자를 등록하는 토토 캔는 작업자가 시작되기를 기다릴 수 있습니다. 이것은 초기화함으로써 달성 될 수 있습니다bgw_notify_pidtoMyProcPid그런 다음 전달BackgroundWorkerHandle *등록 시간에 획득Waitforbackgroundworkerstrup (BackgroundWorkerHandle *핸들, pid_t *)
함수. 이 기능은 우체국 장이 배경 작업자를 시작하려고 시도하거나 우체국이 죽을 때까지 차단됩니다.bgwh_started, PID는 제공된 주소에 기록됩니다. 그렇지 않으면 반환 값은입니다.bgwh_stopped또는bgwh_postmaster_died.
백그라운드 작업자가 비동기 알림을 보내는 경우Notify서버 프로그래밍 인터페이스를 통한 명령 (SPI), 호출해야ProcessCompleTedNotifies
알림을 전달할 수 있도록 동봉 된 트랜잭션을 저지른 후 명시 적으로. 배경 작업자가 등록하여에 비동기 알림을받는 경우듣기throughSPI, 작업자는 해당 알림을 기록하지만 작업자가 해당 알림을 가로 채고 응답하는 프로그래밍 방식은 없습니다.
thesrc/test/modules/worker_spi모듈은 유용한 기술을 보여주는 작업 예제를 포함합니다.
등록 된 백그라운드 작업자의 최대 수는에 의해 제한됩니다.max_worker_processes.