12.1 tags 전체 정리
patroni.yml의 설정 대부분은 클러스터 전역에 적용되지만, tags 섹션만은 노드 하나의 성격을 정한다. 어떤 노드는 절대 leader가 되면 안 되고, 어떤 노드는 읽기 트래픽을 받지 않아야 하며, 어떤 노드는 새 replica의 복제 소스가 되어야 한다. Patroni 4.1.4에는 이런 노드별 속성으로 예약된 tag 8종이 있고, 그 밖의 임의 key-value도 custom tag로 허용된다. tags는 PATRONI_* 환경변수로는 설정하지 못하고 patroni.yml에만 쓴다. local 설정이므로 파일을 고친 뒤 reload로 반영한다.
tag가 개입하는 결정 지점
예약 tag 8종은 네 갈래의 결정에 개입한다. 어느 tag가 어느 결정을 건드리는지 먼저 지도를 그려 두면 개별 tag의 의미가 빨리 들어온다.
flowchart TD
T["tags 섹션"]
T --> A["leader 선출"]
T --> B["sync standby 선정"]
T --> C["읽기 트래픽 분배"]
T --> D["복제 토폴로지"]
A --> A1["nofailover<br/>failover_priority"]
B --> B1["nosync<br/>sync_priority"]
C --> C1["noloadbalance<br/>custom tags"]
D --> D1["clonefrom<br/>replicatefrom<br/>nostream"]
| tag | 기본값 | 효과 |
|---|---|---|
nofailover | false | leader race 참여와 leader 승격 금지 |
failover_priority | (정수) | failover 후보 간 우선순위. 0 이하는 nofailover와 동일 |
noloadbalance | false | GET /replica가 503 반환 |
clonefrom | false | 새 노드 bootstrap 시 pg_basebackup 소스로 선호 |
nosync | false | synchronous replica로 선택되지 않음 |
sync_priority | (정수) | sync replica 선택 우선순위. 0 이하는 후보에서 제외 |
replicatefrom | (멤버 이름) | 지정한 replica에서 cascading 복제 |
nostream | false | WAL streaming 대신 archive recovery에 의존 |
leader 선출: nofailover와 failover_priority
nofailover: true 노드는 leader race에 참여하지 않으며 어떤 경우에도 leader로 승격되지 않는다. 리포팅 노드나 승격되면 곤란한 원격지 노드에 쓴다.
failover_priority는 더 세밀한 통제다. 6.2에서 본 후보 선정에서, 후보들의 WAL 수신/재생 위치가 같을 때 높은 값을 가진 노드가 우선한다. 단 LSN 차이가 우선순위보다 먼저다. priority가 아무리 높아도 WAL이 더 뒤처진 노드가 앞선 노드를 이기지 못한다. 0 이하의 값은 nofailover: true와 같은 의미가 된다. 두 tag를 한 노드에 함께 지정하지 않는다. nofailover: true는 failover_priority: 0과, nofailover: false는 priority 1과 같은 것으로 해석된다.
failover_priority가 quorum 기반 synchronous replication과는 현재 함께 동작하지 않는다고 명시한다. 6.5의 synchronous_mode: quorum을 쓰는 클러스터라면 이 tag에 기대는 설계를 피한다.sync standby 선정: nosync와 sync_priority
nosync: true 노드는 synchronous replica로 절대 선택되지 않는다. sync_priority는 6.4의 synchronous mode에서 sync replica를 고를 때의 우선순위로, 값이 높을수록 우선한다. 0 이하면 synchronous_standby_names에 기록되지 않아 nosync와 비슷하게 동작한다.
pg_stat_replication.sync_priority는 낮은 값이 우선인데, Patroni의 sync_priority tag는 높은 값이 우선이다. 의미가 반대이므로 tag 값을 모니터링 뷰의 숫자와 직접 비교하면 해석이 뒤집힌다.읽기 트래픽: noloadbalance
noloadbalance: true면 그 노드의 GET /replica health check가 503을 반환한다. HAProxy처럼 /replica로 replica 풀을 구성하는 로드밸런서(9.2)에서 이 노드가 빠진다. 복제 자체는 그대로 유지되므로 데이터는 계속 따라오고, 이 노드로 직접 접속하는 클라이언트까지 막는 것은 아니다.
복제 토폴로지: clonefrom, replicatefrom, nostream
기본적으로 새 노드의 pg_basebackup은 leader에서 뜬다. clonefrom: true 노드가 하나라도 있으면 새 노드는 그 노드에서 basebackup을 뜨고, 여러 대면 그중 랜덤으로 고른다. 대량 노드 증설이나 큰 데이터베이스에서 primary의 I/O 부담을 replica로 옮기는 장치다.
replicatefrom은 멤버 이름을 값으로 받아 cascading replication을 만든다. 지정한 replica가 이 노드의 복제 상류가 된다. leader가 아닌 노드에서 복제를 받으므로 원격지 노드 여러 대가 WAN 구간을 한 번만 건너게 하는 구성에 쓰인다.
nostream: true면 replication protocol로 WAL을 streaming하지 않고, restore_command 기반 archive recovery와 pg_wal 폴링에 의존한다. 따라서 동작하는 WAL archive 구성이 전제다. 부수 효과가 하나 있는데, 이 노드와 그 아래 cascading replica 전체에서 permanent logical slot의 복사/동기화가 비활성화된다. logical slot failover에 의존하는 소비자(CDC 등)가 있다면 이 tag가 그 경로를 끊는다는 점을 확인해야 한다. primary에 설정하면 효과가 없다.
custom tags
예약 tag 외의 임의 key-value도 tags 섹션에 넣는다. custom tag는 REST API와 patronictl list 출력에 노출되고, health check 엔드포인트의 tag 필터 대상이 된다.
tags:
nofailover: false
noloadbalance: false
datacenter: dc2
reporting: true# datacenter=dc2 인 replica 만 200 을 반환
curl -s -o /dev/null -w "%{http_code}\n" "http://10.0.0.13:8008/replica?datacenter=dc2"tag가 정의되지 않았거나 값이 다르면 503을 반환하므로, 로드밸런서의 backend 풀을 tag 조건으로 쪼개는 데 쓰인다. 단 /leader, /standby-leader 계열 엔드포인트에서는 tag 파라미터가 무시된다.
실전 조합
어떤 조합이 정답인지는 공식 문서가 정하지 않는다. 목적별로 흔히 쓰이는 구성을 판단과 함께 적으면 이렇다.
리포팅 전용 노드는 nofailover: true와 noloadbalance: true를 함께 켠 형태가 일반적이다. 무거운 분석 쿼리를 돌리다가 승격되어 primary가 되는 일도, 서비스 읽기 풀에 섞여 응답 시간을 흔드는 일도 막는다. synchronous mode를 쓴다면 nosync: true까지 더해 commit 대기 경로에서도 뺀다.
백업이나 클론 소스로 쓰는 노드는 clonefrom: true를 켜고, 필요하면 noloadbalance로 서비스 트래픽에서 뺀다. 원격지 노드는 nofailover에 replicatefrom으로 같은 지역의 replica를 상류로 지정하는 조합이 흔하다. 원격 DR을 같은 클러스터의 멤버로 둘지 별도 standby cluster로 둘지는 10.4의 비교가 기준이 된다.
nofailover(또는 0 이하의 failover_priority)를 남발하면 primary 장애 시 승격 가능한 후보가 하나도 남지 않아 자동 failover가 성립하지 않는다. tag를 조각할 때는 최악의 장애 조합에서 leader race에 참여할 노드가 몇 대 남는지 먼저 센다.정리
- 예약 tag 8종은 leader 선출, sync 선정, 읽기 트래픽, 복제 토폴로지 네 갈래 결정에 개입한다.
failover_priority와sync_priority는 둘 다 높은 값이 우선이고, 0 이하는 각각 nofailover, sync 제외와 같다.sync_priority는pg_stat_replication과 의미가 반대다.nostream은 archive 구성이 전제이며 그 노드 아래의 permanent logical slot 동기화를 끊는다.- custom tag는
GET /replica?key=value필터와 결합해 노드 그룹별 라우팅 조건으로 쓰인다.