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가 없는지 확인한 뒤에 실행합니다.