본문으로 건너뛰기
7.4 pause와 유지보수 모드

7.4 pause와 유지보수 모드

pause는 Patroni의 자동 관리를 잠시 멈추는 유지보수 모드다. 공식 문서가 드는 용례는 major version upgrade나 corruption 복구처럼 사람이 PostgreSQL을 직접 만져야 하는 작업이다. 클러스터 상태 정보는 DCS에 그대로 보존한 채 관리 동작만 멈추므로, 작업이 끝나면 resume으로 원래 자리로 돌아온다. Patroni가 멈추는 것과 계속하는 것의 경계를 정확히 아는 것이 이 모드를 쓰는 전제다.

paused 상태에서 Patroni가 하지 않는 것

  • PostgreSQL 상태를 바꾸지 않는다. 정지된 PostgreSQL을 시작하지 않고, 실행 중인 것을 정지하지도 않는다
  • primary가 없어도 replica를 promote하지 않는다. 자동 failover가 정지된다
  • 예약된(scheduled) 동작을 실행하지 않는다
  • replication slot을 제거하지 않는다. 단, 클러스터 멤버를 나타내지 않는 slot은 예외다

이 목록이 pause의 존재 이유다. DBA가 primary를 내리고 pg_upgrade를 실행하는 동안, Patroni가 “primary가 죽었다"고 판단해 replica를 promote해 버리면 작업 전체가 어긋난다. pause는 그 개입을 차단한다.

그래도 계속하는 것

pause는 Patroni를 끄는 것이 아니다. 데몬은 계속 돌면서 다음을 수행한다.

  • DCS의 member key를 read-only 쿼리로 계속 갱신한다. patronictl list는 paused 중에도 최신 상태를 보여준다
  • 현재 primary가 leader lock을 유지하는 동안 lock 갱신을 계속하고, 수동으로 demote되면 lock을 해제한다
  • 수동 명령은 허용된다. 예약 없는 restart, failover, reinitialize는 paused 중에도 실행된다
  • leader lock이 비어 있으면 획득을 처리하고, 수동 promote 뒤에는 replica들이 새 leader를 따라가도록 한다
  • primary가 둘 감지되면 경고 로그만 남기고 어느 쪽도 demote하지 않는다

마지막 항목이 pause의 가장 위험한 성질이다. 평상시라면 Patroni가 정리할 이중 primary 상황이 paused 중에는 경고 로그 한 줄로만 남는다.

켜고 끄기

patronictl pause batman --wait
# ... 유지보수 작업 ...
patronictl resume batman --wait

--wait는 모든 멤버가 paused(resume이면 unpaused) 상태가 될 때까지 기다렸다가 반환한다. 각 노드는 자기 HA 루프에서 pause를 인지하므로, --wait 없이 실행하면 명령이 돌아온 시점에 아직 전환 중인 노드가 있을 수 있다.

pause는 dynamic configuration의 일부라서 REST API로도 같은 일을 한다.

curl -s -XPATCH -d '{"pause": true}' http://localhost:8008/config

해제는 false 또는 null을 지정한다.

resume 전에 primary가 하나뿐인지 반드시 확인한다. paused 중에는 수동 promote나 직접 조작으로 primary가 둘이 되어도 Patroni는 경고만 남길 뿐 정리하지 않는다. 남길 쪽을 정하고 다른 쪽을 수동으로 demote하거나 정지한 뒤에 resume을 실행한다.

pause를 활용하는 major upgrade 전체 절차는 Part X의 major upgrade에서 다룬다.

정리

pause는 자동 failover와 상태 변경을 멈추되, 감시(member key 갱신)와 수동 명령은 유지하는 모드다. 사람이 개입하는 작업 동안 Patroni와 충돌하지 않기 위한 장치이고, resume은 이중 primary가 없는지 확인한 뒤에 실행한다.