2.3 DCS에 저장되는 것들
Patroni가 DCS에 쓰는 데이터는 전부 정해진 경로 아래에 모여 있다. 모든 키는 namespace 설정값과 scope(클러스터 이름)를 프리픽스로 하는 경로에 저장된다. namespace의 기본값은 /service이므로, scope: demo인 클러스터라면 키 트리는 /service/demo/ 아래에 만들어진다. 하나의 DCS를 여러 Patroni 클러스터가 공유해도 scope가 다르면 경로가 겹치지 않는다.
키 트리
etcd 기준으로 3노드 클러스터의 키 트리는 다음 형태다.
- initialize
- config
- leader
- node1
- node2
- node3
- failover
- history
- leader
- status
- sync
- failsafe
키별 역할
| 키 | 저장 내용 |
|---|---|
initialize | 클러스터 초기화 마커 (PostgreSQL system identifier) |
config | dynamic configuration |
leader | leader lock. 현재 leader 멤버의 이름, TTL 부여 |
members/ | 멤버 이름별 하위 키. 각 멤버의 상태 정보 |
failover | 수동 failover와 switchover 요청 |
history | timeline 전환 이력 |
optime/leader | leader의 WAL 위치 |
status | last_lsn(leader LSN), slots(permanent slot별 confirmed_flush_lsn), retain_slots |
sync | leader, sync_standby(쉼표 구분 목록), quorum |
failsafe | failsafe mode용 전체 멤버 목록 (permanent key) |
이 가운데 leader가 2.2에서 본 leader lock 그 자체다. members/ 하위 키는 매 HA 사이클 갱신되는 각 노드의 상태 보고이고, failover는 patronictl switchover 같은 수동 전환 요청이 기록되는 자리다. sync는 synchronous replication 구성에서 동기 standby가 누구인지 추적하며, failsafe는 DCS 장애 대비용으로 2.5에서 다룬다.
config 키와 patroni.dynamic.json
config 키에 저장되는 dynamic configuration은 클러스터 전체에 적용되는 설정이다. patronictl edit-config 또는 REST API로 언제든 변경 가능하다. 그런데 이 설정의 원본이 DCS에만 있다면 DCS 데이터가 유실됐을 때 설정도 함께 사라진다. 그래서 각 노드는 설정이 바뀔 때마다 DCS 옵션의 상태를 PostgreSQL 데이터 디렉토리 안의 patroni.dynamic.json 파일로 덤프해 둔다.
이 디스크 덤프에서 설정을 복원하는 것은 leader에게만 허용되며, 그마저도 해당 옵션이 DCS에서 완전히 사라졌거나 유효하지 않을 때로 제한된다. 평상시의 정본은 어디까지나 DCS이고, 파일은 복구용 사본이다.
patroni.yml)이 그 위를 덮으며, 환경변수가 다시 그 위에 온다. 3계층 구조의 상세는 Part IV. 설치와 구성에서 다룬다.etcd에서 직접 확인
공식 저장소의 docker-compose 데모(etcd 3대, Patroni 3대, HAProxy 1대)에서 키 트리를 직접 확인해 본다.
docker exec -ti demo-patroni1 bash
etcdctl get --keys-only --prefix /service/democonfig, initialize, leader, members/ 하위의 멤버 키 등이 위 표의 이름 그대로 나열된다. --keys-only를 빼고 조회하면 각 키에 저장된 값까지 보인다.
정리
Patroni가 클러스터에 대해 아는 것은 전부 namespace와 scope 아래의 키 십여 개에 들어 있다. 누가 leader인지(leader), 어떤 설정이 적용 중인지(config), WAL이 어디까지 갔는지(status)를 이 키들이 답하고, 장애 대응 중 DCS를 직접 들여다볼 일이 생겼을 때도 여기서 출발하면 된다.