이전 섹션에서 설명한 내장 대기 모드의 대안은 다음을 사용하는 것입니다.restore_command보관 위치를 폴링합니다. 이는 버전 8.4 이하에서 사용할 수 있는 유일한 옵션이었습니다. 참조pg_standby이것의 참조 구현을 위한 모듈입니다.
이 모드에서는 서버가 WAL을 한 번에 한 파일씩 적용하므로 쿼리를 위해 토토 캔 서버를 사용하는 경우(핫 토토 캔 참조) 마스터의 작업과 작업이 토토 캔에서 표시될 때 WAL 파일을 채우는 데 걸리는 시간에 따라 지연이 있습니다.archive_timeout을 사용하면 지연 시간을 더 짧게 만들 수 있습니다. 또한 스트리밍 복제를 이 방법과 결합할 수 없습니다.
기본 및 토토 캔 서버 모두에서 발생하는 작업은 일반적인 연속 아카이브 및 복구 작업입니다. 두 데이터베이스 서버 사이의 유일한 접촉 지점은 둘 다 공유하는 WAL 파일의 아카이브입니다. 즉, 아카이브에 대한 기본 쓰기와 아카이브에서 토토 캔 읽기를 공유합니다. 별도의 기본 서버의 WAL 아카이브가 서로 혼합되거나 혼동되지 않도록 주의해야 합니다. 아카이브가 토토 캔 작업에만 필요한 경우에는 아카이브가 클 필요가 없습니다.
느슨하게 연결된 두 서버를 함께 작동하게 만드는 마법은 간단합니다.restore_command다음 WAL 파일을 요청할 때 기본에서 사용할 수 있을 때까지 기다리는 대기에서 사용됩니다. 일반적인 복구 처리에서는 WAL 아카이브의 파일을 요청하고 파일을 사용할 수 없는 경우 실패를 보고합니다. 대기 처리의 경우 다음 WAL 파일을 사용할 수 없는 것은 정상이므로 대기는 해당 파일이 나타날 때까지 기다려야 합니다. 다음으로 끝나는 파일의 경우:.역사기다릴 필요가 없으며 0이 아닌 반환 코드가 반환되어야 합니다. 토토 캔restore_command다음 WAL 파일의 존재 여부를 폴링한 후 반복하는 사용자 정의 스크립트로 작성할 수 있습니다. 장애 조치를 트리거하는 방법도 있어야 하며, 이로 인해restore_command, 루프를 중단하고 파일을 찾을 수 없다는 오류를 토토 캔 서버에 반환합니다. 이렇게 하면 복구가 종료되고 토토 캔 서버가 일반 서버로 나타납니다.
적합한 의사 코드restore_command다음과 같습니다:
트리거됨 = false;
while (!NextWALFileReady() && !트리거됨)
수면(100000L); /* ~0.1초 동안 기다림 */
if(CheckForExternalTrigger())
트리거 = 사실;
기다림의 실제 사례restore_command다음에서 제공됩니다.pg_standby모듈. 위에서 설명한 논리를 올바르게 구현하는 방법에 대한 참조로 사용해야 합니다. 특정 구성 및 환경을 지원하기 위해 필요에 따라 확장할 수도 있습니다.
장애 조치를 실행하는 방법은 계획 및 설계의 중요한 부분입니다. 한 가지 잠재적인 옵션은 다음과 같습니다.restore_command명령. 이는 각 WAL 파일에 대해 한 번씩 실행되지만, 다음을 실행하는 프로세스는restore_command파일마다 생성되고 죽기 때문에 데몬이나 서버 프로세스가 없고 시그널이나 시그널 핸들러를 사용할 수 없습니다. 그러므로,restore_command장애 조치를 실행하는 데 적합하지 않습니다. 특히 알려진 것과 함께 사용되는 경우 간단한 시간 초과 기능을 사용할 수 있습니다.archive_timeout기본 설정. 그러나 네트워크 문제나 사용량이 많은 기본 서버만으로도 장애 조치를 시작할 수 있으므로 이는 다소 오류가 발생하기 쉽습니다. 트리거 파일을 명시적으로 생성하는 등의 알림 메커니즘이 이상적이라면 가능합니다.
이 대체 방법을 사용하여 대기 서버를 구성하는 간단한 절차는 다음과 같습니다. 각 단계에 대한 자세한 내용은 명시된 이전 섹션을 참조하세요.
2개의 동일한 복사본을 포함하여 기본 및 토토 캔 시스템을 가능한 한 거의 동일하게 설정PostgreSQL동일한 릴리스 레벨에서.
기본 서버에서 대기 서버의 WAL 아카이브 디렉토리로 지속적인 아카이브를 설정합니다. 다음을 확인하세요.archive_mode, archive_command그리고archive_timeout기본에 적절하게 설정되어 있습니다(참조섹션 25.3.1).
주 서버의 기본 백업을 만드십시오(참조섹션 25.3.2), 이 데이터를 토토 캔에 로드합니다.
다음을 사용하여 로컬 WAL 아카이브에서 대기 서버 복구를 시작합니다.restore_command앞서 설명한 대로 토토 캔합니다(참조섹션 25.3.4).
복구는 WAL 아카이브를 읽기 전용으로 처리하므로 WAL 파일이 토토 캔 시스템에 복사되면 토토 캔 데이터베이스 서버에서 읽는 동시에 테이프에 복사될 수 있습니다. 따라서 고가용성을 위한 토토 캔 서버 실행은 장기적인 재해 복구 목적으로 파일이 저장되는 동시에 수행될 수 있습니다.
테스트 목적으로 동일한 시스템에서 기본 서버와 토토 캔 서버를 모두 실행할 수 있습니다. 이는 서버 견고성에 있어 가치 있는 개선을 제공하지 않으며 HA로도 설명되지 않습니다.
이 대체 방법을 사용하여 기록 기반 로그 전달을 구현하는 것도 가능합니다. 단, 이를 위해서는 맞춤 개발이 필요하며 변경 사항은 전체 WAL 파일이 전달된 후에만 상시 토토 캔 쿼리에만 표시됩니다.
외부 프로그램은 다음을 호출할 수 있습니다.pg_walfile_name_offset()함수(참조PostgreSQL : 문서 : 12 : 9.26. 시스템 관리 토토 꽁 머니)을 사용하여 파일 이름과 현재 WAL 끝의 정확한 바이트 오프셋을 찾습니다. 그런 다음 WAL 파일에 직접 액세스하여 마지막으로 알려진 WAL 끝에서 현재 끝을 거쳐 대기 서버로 데이터를 복사할 수 있습니다. 이 접근 방식을 사용하면 데이터 손실 창은 복사 프로그램의 폴링 주기 시간이며 이는 매우 작을 수 있으며 부분적으로 사용된 세그먼트 파일을 강제로 보관하여 낭비되는 대역폭이 없습니다. 대기 서버'restore_command스크립트는 전체 WAL 파일만 처리할 수 있으므로 증분 복사된 데이터는 일반적으로 대기 서버에서 사용할 수 없습니다. 기본이 종료된 경우에만 사용됩니다. 그런 다음 마지막 부분 WAL 파일이 대기에 공급되기 전에 대기에 공급됩니다. 이 프로세스를 올바르게 구현하려면 다음의 협력이 필요합니다.restore_command데이터 복사 프로그램을 사용하여 스크립트를 작성합니다.
다음으로 시작PostgreSQL버전 9.0에서는 스트리밍 복제를 사용할 수 있습니다(참조섹션 26.2.5) 더 적은 노력으로 동일한 이점을 얻을 수 있습니다.