본문으로 건너뛰기

5.2 replication quorum과 candidate priority

number_sync_standbys가 "몇 대의 응답을 기다릴까"를 정한다면, 노드 단위 설정 두 개는 "어느 노드가 응답 후보인가"와 "어느 노드를 승격할까"를 정합니다. replication quorum은 동기 복제 참여 여부를 정하고 candidate priority는 failover 때의 승격 우선순위를 정합니다. 두 값은 독립적입니다. 동기 복제에는 참여하지만 승격하지 않는 노드도 만들 수 있습니다. 반대로 동기 복제에는 참여하지 않지만 승격하는 노드도 만들 수 있습니다.

두 설정이 쓰이는 곳​

replication quorum​

기본값은 true입니다. true인 standby만 primary의 synchronous_standby_names 목록에 포함됩니다. false인 노드는 목록에서 제외되므로 비동기 복제로 동작합니다. 모든 노드를 false로 설정하면 formation 전체가 비동기로 동작합니다. 문서는 현재 primary에도 같은 값을 설정하도록 권장합니다. 현재 primary도 failover 후에는 standby가 되기 때문입니다.

# 해당 노드에서 실행. 실습 노드처럼 PG_AUTOCTL_MONITOR가 설정되어 있으면 --name이 필요하다
pg_autoctl set node replication-quorum --name node3 false
pg_autoctl get node replication-quorum --name node3

quorum에서 제외하면 N+1 규칙을 다시 검사합니다. 실습에서 number_sync_standbys = 1이고 quorum standby가 두 대인 상태에서 node3를 제외하려 했지만 monitor가 거부했습니다.

05:40:21 1536 ERROR Monitor ERROR: can't set replication quorum to false
05:40:21 1536 ERROR Monitor DETAIL: At least 2 standby nodes are required in formation default with number_sync_standbys = 1, and only 1 would be participating in the replication quorum

먼저 number_sync_standbys를 0으로 낮추거나 quorum standby를 하나 더 추가해야 합니다.

candidate priority​

0~100 사이의 정수이며 기본값은 50입니다. monitor가 failover를 결정하면 이 값이 높은 노드부터 후보로 검토합니다. v2.2 multi-standby 문서의 선출 규칙은 다음과 같습니다.

  • priority 0 노드는 자동 failover에서 승격하지 않음. 다른 후보가 건강해질 때까지 기다림
  • priority가 같으면 monitor에 보고된 LSN이 가장 앞선 standby를 선택
  • LSN까지 같으면 무작위로 선택
  • 선택된 후보의 LSN이 가장 앞서지 않으면 fast_forward 단계에서 앞선 standby로부터 WAL을 받은 뒤 승격

실습의 3노드 failover에서는 node1과 node3의 priority와 LSN이 같았고 node1이 선택되었습니다(7.1). priority를 100으로 높인 node3가 LSN에서 뒤졌을 때는 fast_forward를 거친 뒤 node3가 승격되었습니다(3.4).

pg_autoctl set node candidate-priority --name node3 0
pg_autoctl get node candidate-priority --name node3
node | node3 | candidate priority | 0
경고

v2.2 문서는 priority가 0이 아닌 노드가 두 대 이상 있어야 한다고 설명합니다(현재 primary 포함). 이 제한은 v1.5.2부터 강제 규칙이 아닙니다. v2.2 소스에서는 조건에 맞지 않는 설정도 거부하지 않습니다. setting candidate priority to zero, preventing automated failover NOTICE를 출력하고 그대로 반영합니다. 명령이 성공해도 failover 후보가 남아 있다는 뜻은 아닙니다. 따라서 show settings로 다시 확인합니다.

실습에서 본 옵션 문제​

실습 노드 컨테이너에는 PG_AUTOCTL_MONITOR 환경 변수가 있습니다. 이때 --name 없이 set node를 실행하면 --pgdata가 무시되어 실패합니다.

05:39:45 1405 WARN Given --monitor URI, the --pgdata option is ignored
05:39:45 1405 INFO Connecting to monitor at "postgres://autoctl_node@monitor:5432/pg_auto_failover?sslmode=require"
05:39:45 1405 FATAL Please use either --name or --pgdata to target a specific node

환경 변수의 monitor URI를 --monitor 옵션처럼 취급하기 때문입니다. 이에 따라 "원격에서 monitor에 접속한 것"으로 판단합니다. --name으로 대상 노드를 지정하면 해결됩니다. systemd로 운영하는 노드에는 보통 이 환경 변수가 없습니다. 따라서 --pgdata로도 동작할 것입니다. 이 경우는 실습하지 않았습니다.

수동 승격과 priority​

pg_autoctl perform promotion --name <노드>는 지정한 노드를 승격시킵니다. 대상은 secondary나 report_lsn 상태여야 합니다. 2노드에서는 primary와 secondary가 안정된 상태여야 합니다. 노드가 3대 이상이면 v2.2 소스는 대상 노드의 priority를 일시적으로 101만큼 높입니다. 대상 노드가 선출에서 이기도록 한 뒤, 선출이 끝나면 원래 값으로 되돌립니다. 2노드에서는 priority를 바꾸지 않고 perform_failover로 바로 처리합니다. 반대로 모든 노드가 건강한 상태에서 perform failover를 실행하면 현재 primary의 priority를 같은 폭만큼 낮춥니다. 이전 primary가 다시 선택되지 않도록 하기 위해서입니다. CHANGELOG v1.5.2에는 "priority 0 노드도 수동 승격 허용" 항목이 있습니다.

실습에서 node3를 priority 0으로 설정한 채 node1을 수동 승격했습니다. 명령은 4.0초 뒤 반환했고, node1이 primary가 되었습니다.

팁

DR 센터 노드나 리포팅 전용 노드에는 replication-quorum false, candidate-priority 0 조합을 주로 사용합니다. 동기 복제 지연에 영향을 주지 않으며 자동 승격 대상에서도 제외됩니다. 이 조합의 토폴로지는 5.3에서 살펴봅니다.

정리​

replication quorum은 synchronous_standby_names 목록의 참여 여부를 정합니다. candidate priority는 승격 순서를 정합니다. quorum에서 제외하는 변경은 N+1 규칙에 맞지 않으면 거부됩니다. 반면 priority를 0으로 바꾸는 변경은 NOTICE만 출력하고 반영됩니다. 선출에서는 priority를 먼저 비교하고, 같으면 LSN을 비교합니다. LSN까지 같으면 무작위로 선택합니다. 실습 환경처럼 PG_AUTOCTL_MONITOR가 설정된 노드에서는 --name을 지정합니다.