본문으로 건너뛰기

2.3 DCS에 저장되는 것들

Patroni가 DCS에 쓰는 데이터는 전부 정해진 경로 아래에 모여 있습니다. 모든 키는 namespace 설정값과 scope(클러스터 이름)를 프리픽스로 하는 경로에 저장됩니다. namespace의 기본값은 /service이므로, scope: demo인 클러스터라면 키 트리는 /service/demo/ 아래에 만들어집니다. 하나의 DCS를 여러 Patroni 클러스터가 공유해도 scope가 다르면 경로가 겹치지 않습니다.

키 트리​

etcd 기준으로 3노드 클러스터의 키 트리는 다음 형태입니다.

  • service/
    • demo/
      • initialize
      • config
      • leader
      • members/
        • node1
        • node2
        • node3
      • failover
      • history
      • optime/
        • leader
      • status
      • sync
      • failsafe

Patroni DCS 키 트리

키별 역할​

키저장 내용
initialize클러스터 초기화 마커 (PostgreSQL system identifier)
configdynamic configuration
leaderleader lock. 현재 leader 멤버의 이름, TTL 부여
members/멤버 이름별 하위 키. 각 멤버의 상태 정보
failover수동 failover와 switchover 요청
historytimeline 전환 이력
optime/leaderleader의 WAL 위치
statuslast_lsn(leader LSN), slots(permanent slot별 confirmed_flush_lsn), retain_slots
syncleader, sync_standby(쉼표 구분 목록), quorum
failsafefailsafe 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이고, 파일은 복구용 사본입니다.

노트

설정에는 우선순위가 있습니다. DCS의 dynamic configuration이 가장 낮고, 로컬 설정 파일(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/demo

config, initialize, leader, members/ 하위의 멤버 키 등이 위 표의 이름 그대로 나열됩니다. --keys-only를 빼고 조회하면 각 키에 저장된 값까지 보입니다.

정리​

Patroni가 클러스터에 대해 아는 것은 전부 namespace와 scope 아래의 키 십여 개에 들어 있습니다. 누가 leader인지(leader), 어떤 설정이 적용 중인지(config), WAL이 어디까지 갔는지(status)를 이 키들이 답하고, 장애 대응 중 DCS를 직접 들여다볼 일이 생겼을 때도 여기서 출발하면 됩니다.