10.4 standby cluster
standby cluster는 원격 primary를 따라가는 별도의 Patroni 클러스터다. 재해 복구(DR)용으로 다른 리전이나 데이터센터에 두는 구성이 대표적이다. 핵심은 이것이 주 클러스터에 딸린 replica 묶음이 아니라 독립된 클러스터라는 점이다. 자체 DCS를 쓰고 자체 leader lock을 가지며, 구성원 중 하나가 standby leader가 되어 원격 primary에서 복제하고, 나머지 cascade replica들은 standby leader에서 복제한다.
flowchart TD
subgraph MAIN["주 클러스터 (자체 DCS)"]
P["primary"]
R1["replica"]
P --> R1
end
subgraph SB["standby cluster (자체 DCS)"]
SL["standby leader"]
C1["cascade replica"]
C2["cascade replica"]
SL --> C1
SL --> C2
end
P -->|"WAL 복제"| SL
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_methods | standby leader를 원격 primary에서 생성할 때 쓸 방법의 순서 목록. 일반 모드의 목록과 별개 |
restore_command | 원격 primary의 WAL을 standby cluster 노드로 복원하는 명령 |
archive_cleanup_command | standby leader에서 실행할 archive 정리 명령 |
recovery_min_apply_delay | standby leader가 WAL 적용을 지연할 시간 |
새 클러스터를 처음부터 standby cluster로 세울 때는 bootstrap.dcs에 넣는다. 공식 문서의 예시다.
bootstrap:
dcs:
standby_cluster:
host: 1.2.3.4
port: 5432
primary_slot_name: patroni
create_replica_methods:
- basebackupbootstrap.dcs의 값은 클러스터 최초 초기화 때 한 번만 DCS에 기록된다. 이미 동작 중인 클러스터에서 standby_cluster 섹션을 넣고 빼는 작업은 patronictl edit-config로만 한다.승격과 강등
주 클러스터가 재해로 사라졌거나 계획된 DR 전환이라면 standby cluster를 일반 클러스터로 승격한다.
patronictl promote-cluster batman-drpromote-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 관리가 구축 전에 정해 둘 항목이다.