6.5 quorum commit
synchronous_mode: on에는 구조적인 약점이 있다. sync standby가 이름으로 지정되므로, 그 노드가 느려지면 primary의 모든 커밋이 그 노드 하나에 묶인다. quorum commit은 이를 ANY 방식으로 보완한다. 특정 노드가 아니라 후보 집합 중 아무나 n개가 확인하면 커밋이 완료되므로, 한 standby의 복제 지연을 다른 standby가 대신 흡수한다. 공식 문서 표현으로는 “quorum commit helps to reduce worst case latencies, even during normal operation"이다. Patroni 4의 quorum 모드는 PostgreSQL의 quorum 기반 synchronous replication을 사용하므로 PostgreSQL 10 이상이 필요하다.
FIRST와 ANY
on 모드와 quorum 모드의 차이는 Patroni가 만들어 주는 synchronous_standby_names 형식에 그대로 드러난다.
# synchronous_mode: on
synchronous_standby_names = 'FIRST 2 (node1,node2)'
# synchronous_mode: quorum
synchronous_standby_names = 'ANY 2 (node1,node2,node3)'FIRST 2는 지정된 두 노드가 각각 확인해야 하지만, ANY 2는 세 노드 중 아무 두 개의 확인이면 된다.
flowchart TD
P["primary 커밋 대기"] --> S1["standby 1 ack"]
P --> S2["standby 2 ack"]
P --> S3["standby 3 지연"]
S1 --> C["아무 2개 확보, 커밋 완료"]
S2 --> C
DCS에 저장되는 quorum 정보
quorum 모드에서 Patroni는 DCS에 마지막으로 알려진 primary, quorum에 필요한 노드 수, 그리고 현재 quorum 투표 자격이 있는 노드 목록을 저장한다. /sync key에는 on 모드의 leader와 sync standby 목록에 더해 quorum 값이 추가된다.
{ "leader": "node0", "sync_standby": "node1,node2,node3", "quorum": 1 }이 예시는 세 standby 중 아무 두 개가 커밋을 확인하는 구성이다. quorum: 1은 승격 검증 시 비교해야 할 다른 노드 수를 뜻한다. 노드를 추가하거나 제거할 때 Patroni는 6.4절의 불변식이 깨지지 않도록 /sync key와 synchronous_standby_names를 단계적으로 갱신하는 전환 절차를 따른다. 이 절차의 단계별 상세는 공식 문서 replication modes 페이지의 quorum 절에 있다.
승격 시 안전성 검증
ANY 2 (node1,node2,node3)에서 커밋은 세 노드 중 어느 두 개가 확인했는지 모른 채 완료된다. 그래서 특정 노드 하나가 최신 커밋을 놓쳤을 가능성이 항상 있다. quorum 모드의 Patroni는 이를 전제로 승격을 검증한다. 후보의 LSN을 /sync key의 quorum 값만큼의 다른 quorum 노드와 비교해, 후보가 성공 커밋된 최신 트랜잭션을 보유했음을 확인한 뒤에만 promote한다. 위 예시라면 최소 한 노드와 대조하는 것으로 충분하다. 아무 두 노드가 확인한 커밋은 임의의 두 노드 집합과 반드시 겹치기 때문이다.
설정
# patronictl edit-config (dynamic configuration)
synchronous_mode: quorum
synchronous_node_count: 2synchronous_node_count(기본 1)가 ANY 뒤의 숫자, 즉 커밋 확인에 필요한 standby 수가 된다. maximum_lag_on_syncnode와 synchronous_mode_strict도 on 모드와 동일하게 동작한다.
failover_priority tag는 quorum 기반 synchronous replication과 호환되지 않는다. quorum 모드에서 승격 우선순위를 이 tag로 통제하려는 설정은 동작하지 않으므로, 6.2 후보 선정의 기본 규칙(WAL position 비교)에 맡겨야 한다.GET /quorum은 해당 노드가 primary의 synchronous_standby_names에 quorum 노드로 올라 있을 때만 200을 반환한다. 로드밸런서에서 quorum 참여 노드만 골라내는 health check로 쓰는 엔드포인트다.정리
quorum commit은 “지정된 노드의 확인"을 “집합 중 아무 n개의 확인"으로 바꿔, 느린 standby 하나가 커밋 지연을 독점하는 문제를 줄인다. 대신 어느 노드가 최신인지 불확정이 되므로, 승격 시 후보 LSN을 quorum 크기의 부분집합과 대조하는 검증이 추가된다. 설정은 synchronous_mode: quorum과 synchronous_node_count 두 줄이면 되지만, failover_priority와의 비호환은 미리 확인해 둘 지점이다.