본문으로 건너뛰기
10.3 노드 추가와 제거

10.3 노드 추가와 제거

Patroni 클러스터의 증설에는 별도의 등록 명령이 없다. 새 노드에서 같은 scope와 같은 DCS를 가리키는 설정으로 Patroni를 시작하면, DCS에 이미 initialize key가 있으므로 그 노드는 bootstrap 대신 replica 생성 경로를 타고 자동으로 합류한다. 반대로 제거는 명령이 아니라 시간이 완성한다. Patroni를 멈추면 member key가 TTL로 만료되어 목록에서 사라진다.

노드 추가

새 노드의 patroni.yml에서 중요한 것은 기존 클러스터와 같은 scope, 같은 DCS 접속 정보, 그리고 클러스터 전체에서 unique한 name이다.

scope: batman        # 기존 클러스터와 같은 값
name: pg-node4       # 클러스터 전체에서 unique
etcd3:
  hosts: 10.0.0.11:2379,10.0.0.12:2379,10.0.0.13:2379

replica의 실제 생성은 create_replica_methods 목록이 담당한다. 목록을 지정하지 않으면 pg_basebackup을 쓰는 basebackup이 기본이고, 백업 저장소 복원으로 대체하는 방법은 10.5 백업 도구 통합에서 다룬다. 생성 계약의 상세(전달 인자, exit code)는 Part V. 클러스터 부트스트랩을 참고한다.

basebackup의 소스는 기본적으로 leader다. primary의 부하를 피해 특정 replica에서 복제본을 뜨게 하려면 그 노드에 clonefrom tag를 준다.

tags:
  clonefrom: true

clonefrom: true인 노드가 여러 대면 그중 랜덤으로 선택된다.

노드 제거

제거 절차는 해당 노드에서 Patroni를 정지하는 것으로 시작하고, 이후는 자동이다.

    flowchart TD
  A["노드에서 Patroni 정지"] --> B["ttl(기본 30초) 경과"]
  B --> C["member key 만료"]
  C --> D["patronictl list에서 제외"]
  D --> E["member_slots_ttl<br/>(기본 30분) 경과"]
  E --> F["upstream의 member slot 제거"]
  

upstream에 남은 member slot이 바로 지워지지 않는 것은 의도된 동작이다. member_slots_ttl(기본 30min, Patroni 4.0.0 이상)은 짧은 정지나 재부팅에서 slot이 지워져 WAL이 사라지는 사고를 막기 위한 유예다. 0으로 설정하면 member key 만료 즉시 slot을 지우는 구버전 동작으로 돌아간다.

patronictl remove를 노드 제거 명령으로 오해하면 안 된다. 이 명령은 DCS에서 클러스터 전체 정보를 삭제한다. 실수를 막기 위해 클러스터 이름 입력, “Yes I am aware” 문구 입력, leader 노드 이름 입력의 3중 확인을 요구하지만, 확인을 통과하면 클러스터 상태가 통째로 사라진다. 개별 노드 제거에는 어떤 patronictl 명령도 필요 없다. Patroni 정지가 곧 제거다.

장기 다운 노드의 slot과 WAL

노드가 member_slots_ttl을 넘겨 다운되어 있으면 upstream의 member slot이 제거되고, 그 slot이 잡아 두던 WAL은 재활용된다. 노드가 나중에 돌아와도 필요한 WAL이 이미 없으므로 스트리밍 복제로 따라잡지 못하고, patronictl reinit로 데이터 디렉토리를 다시 만들어야 한다.

patronictl reinit batman pg-node4 --from-leader

--from-leader는 basebackup 소스를 leader로 고정하는 옵션이다.

계획된 장기 정지라면 선택지가 두 방향이다. member_slots_ttl을 늘려 slot을 더 오래 보존하거나, 멤버 이름과 같은 permanent physical slot을 정의해 member key가 사라져도 slot이 유지되게 한다(Patroni 3.2.0 이상). 다만 slot이 남아 있는 동안 upstream은 해당 WAL을 지우지 못하므로, pg_wal 디스크 사용량을 함께 지켜봐야 한다.

정리

  • 추가는 같은 scope, 같은 DCS로 Patroni를 시작하는 것이 전부다. replica 생성은 create_replica_methods(기본 basebackup)가 담당하고, clonefrom tag로 소스를 지정한다.
  • 제거는 Patroni 정지 후 member key TTL 만료로 완료된다. member slot은 member_slots_ttl(기본 30분)이 지나야 제거된다.
  • patronictl remove는 클러스터 전체 삭제 명령이다. 노드 제거에 쓰면 안 된다.
  • 장기 다운이 예정된 노드는 slot 보존(WAL 누적 위험)과 slot 제거(reinit 필요)의 트레이드오프를 미리 정해 둔다.