본문으로 건너뛰기

10.4 standby cluster

standby cluster는 원격 primary를 따라가는 별도의 Patroni 클러스터입니다. 재해 복구(DR)용으로 다른 리전이나 데이터센터에 두는 구성이 대표적입니다. 핵심은 이것이 주 클러스터에 딸린 replica 묶음이 아니라 독립된 클러스터라는 점입니다. 자체 DCS를 쓰고 자체 leader lock을 가지며, 구성원 중 하나가 standby leader가 되어 원격 primary에서 복제하고, 나머지 cascade replica들은 standby leader에서 복제합니다.

standby leader의 동작​

standby leader는 원격 primary 기준으로는 replica이고, 자기 클러스터 기준으로는 leader lock을 보유한 leader입니다. standby leader가 장애로 lock을 잃으면 cascade replica들이 자기들끼리 새 standby leader를 선출합니다. 즉 주 클러스터와 통신이 끊겨도 standby cluster 내부의 고가용성은 독립적으로 동작합니다. REST API에서는 GET /standby-leader가 이 role 전용 health check입니다.

standby_cluster 설정 키​

standby_cluster는 dynamic configuration 섹션입니다. 이 섹션이 정의되어 있으면 클러스터가 standby cluster로 동작하고, 제거하면 일반 클러스터로 승격됩니다.

키설명
host원격 primary 주소. comma로 구분해 다중 endpoint 지정 지원
port원격 primary 포트
primary_slot_name원격에서 사용할 replication slot 이름. 생략하면 인스턴스 이름에서 유도
create_replica_methodsstandby leader를 원격 primary에서 생성할 때 쓸 방법의 순서 목록. 일반 모드의 목록과 별개
restore_command원격 primary의 WAL을 standby cluster 노드로 복원하는 명령
archive_cleanup_commandstandby leader에서 실행할 archive 정리 명령
recovery_min_apply_delaystandby leader가 WAL 적용을 지연할 시간

새 클러스터를 처음부터 standby cluster로 세울 때는 bootstrap.dcs에 넣습니다. 공식 문서의 예시입니다.

bootstrap:
dcs:
standby_cluster:
host: 1.2.3.4
port: 5432
primary_slot_name: patroni
create_replica_methods:
- basebackup
노트

bootstrap.dcs의 값은 클러스터 최초 초기화 때 한 번만 DCS에 기록됩니다. 이미 동작 중인 클러스터에서 standby_cluster 섹션을 넣고 빼는 작업은 patronictl edit-config로만 합니다.

승격과 강등​

주 클러스터가 재해로 사라졌거나 계획된 DR 전환이라면 standby cluster를 일반 클러스터로 승격합니다.

patronictl promote-cluster batman-dr

promote-cluster는 dynamic configuration에서 standby_cluster 섹션을 제거하고, leader가 primary로 동작할 때까지 기다립니다. 같은 일을 수동으로 하려면 patronictl edit-config에서 standby_cluster 섹션을 지웁니다(null 지정).

반대 방향인 demote-cluster는 일반 클러스터를 standby cluster로 변환합니다. --host, --port, --restore-command 중 최소 하나를 지정해야 합니다.

patronictl demote-cluster batman --host 1.2.3.4 --port 5432

구축 전에 확인할 세 가지​

첫째, 멤버 이름은 주 클러스터와 standby cluster를 통틀어 globally unique해야 합니다. 공식 문서가 synchronous replication의 모호성을 이유로 요구하는 조건입니다.

둘째, 원본 클러스터 쪽 replication slot은 Patroni가 자동으로 만들어 주지 않습니다. primary_slot_name에 해당하는 slot을 원본 클러스터에서 수동으로 생성하거나, 원본 클러스터의 slots 섹션에 permanent slot으로 정의해 둡니다. permanent slot으로 정의하면 원본 쪽에서 failover가 일어나도 slot이 유지됩니다. permanent slot의 정의 방법은 10.5 백업 도구 통합에서 다룹니다.

셋째, pg_rewind를 쓰려면 data checksums 또는 wal_log_hints=on이 필요하고, 다른 standby에서 cascade 복제하는 노드에서는 pg_rewind가 동작하지 않습니다. pg_rewind의 동작 조건은 Part VI. Failover와 Switchover를 참고합니다.

정리​

standby cluster는 자체 DCS와 leader lock을 가진 독립 클러스터이고, standby leader가 원격 primary를 따라가며 그 아래에 cascade replica가 붙습니다. 전환은 promote-cluster와 demote-cluster 한 쌍으로 처리합니다. 멤버 이름의 globally unique 조건과 원본 쪽 slot 관리가 구축 전에 정해 둘 항목입니다.