본문으로 건너뛰기
5.2 기존 클러스터 인수

5.2 기존 클러스터 인수

모든 Patroni 도입이 빈 서버에서 시작하지는 않는다. 이미 서비스 중인 standalone PostgreSQL이나 수동으로 구성한 streaming replication 위에 Patroni를 얹는 경로가 있고, 공식 문서는 이를 convert a standalone이라고 부른다. 별도 모드 전환이 필요한 것은 아니다. Patroni는 시작할 때 PostgreSQL이 이미 실행 중임을 감지하고, 새로 만드는 대신 그 인스턴스의 모니터링을 시작한다.

전환 절차

계정 사전 생성

Patroni가 쓸 superuser 계정과 replication 계정을 기존 인스턴스에 만들어 두고 postgresql.authentication에 채운다. use_pg_rewind를 켤 예정이면 rewind 계정도 만든다. rewind 계정에는 pg_rewind가 호출하는 함수 pg_ls_dir, pg_stat_file, pg_read_binary_file에 대한 EXECUTE 권한을 부여한다.

기존 시작 경로 차단

systemd 같은 서비스 관리자가 PostgreSQL을 직접 띄우지 않도록 unit을 비활성화한다. 시작과 정지의 주체가 Patroni로 바뀌므로, 두 주체가 같은 인스턴스를 다투는 상황을 미리 막는다.

sudo systemctl disable postgresql

patroni.yml 작성

실행 중인 인스턴스에서 설정 초안을 뽑아 주는 patroni --generate-config를 활용한다.

patroni --generate-config --dsn "host=127.0.0.1 port=5432 user=postgres" /etc/patroni/patroni.yml

이 명령은 cluster_namescope로, listen_addressesportpostgresql.listen으로 매핑하고, 나머지 GUC 대부분을 bootstrap.dcs에 채운다. pg_hba.conf와 pg_ident.conf 내용도 소스 인스턴스에서 수집한다.

primary부터 Patroni 시작

primary 노드에서 먼저 Patroni를 시작하고, 이어서 standby 노드에서 차례로 시작한다. 각 노드의 Patroni는 실행 중인 인스턴스를 감지해 관리에 들어간다.

시작 절차 이관

마지막으로 patronictl restart를 실행해 PostgreSQL을 Patroni가 직접 재시작하게 한다. 이 재시작을 거치면 PostgreSQL 프로세스의 시작 절차가 Patroni로 넘어간다.

patronictl -c /etc/patroni/patroni.yml restart mycluster

기존 replication slot 보존

Patroni는 자신이 관리하지 않는 replication slot을 drop한다. 기존 클러스터에서 standby나 외부 도구가 쓰던 slot을 아무 조치 없이 두면 전환 직후 제거 대상이 된다.

보존 요령은 permanent slot을 임시 정거장으로 쓰는 것이다.

  1. postgresql.use_slots(기본 true)를 유지한 채, 기존 slot을 dynamic configuration의 slots에 permanent slot으로 등록한다.
  2. Patroni가 멤버용으로 새로 만든 slot의 restart_lsn이 기존 slot의 위치를 따라잡을 때까지 기다린다.
  3. 따라잡은 뒤 patronictl edit-config로 permanent 등록을 제거한다.
# patronictl edit-config
slots:
  old_standby_slot:
    type: physical

permanent slot의 동작 자체는 5.4 replication slot 관리에서 자세히 다룬다.

pg_upgrade 이후에는 initialize 키를 지운다

pg_upgrade는 내부적으로 initdb를 실행하므로 클러스터의 system identifier가 바뀐다. DCS의 initialize 키에는 이전 identifier 기준의 초기화 기록이 남아 있어 그대로는 업그레이드된 클러스터와 맞지 않는다. major 업그레이드 후에는 DCS에서 initialize 키를 제거하거나 patronictl remove로 클러스터 상태 전체를 지운 뒤 Patroni를 다시 시작한다.

patronictl remove는 노드 하나를 빼는 명령이 아니라 DCS에서 해당 클러스터 정보 전체를 삭제하는 명령이다. 실수 방지를 위해 클러스터 이름, 확인 문구, leader 이름을 차례로 입력하는 3중 확인을 요구한다. 구 데이터 디렉토리의 patroni.dynamic.json을 새 데이터 디렉토리로 복사해 두면 기존 dynamic configuration을 유지하는 데 도움이 된다.

정리

기존 클러스터 인수는 계정 준비, systemd 비활성화, patroni --generate-config, primary 우선 시작, patronictl restart의 순서로 진행된다. 절차 자체보다 조심할 곳은 부수 상태다. Patroni가 모르는 replication slot은 drop되므로 permanent slot으로 임시 보존해야 하고, pg_upgrade를 거쳤다면 system identifier가 바뀌었으므로 DCS의 initialize 키를 지우고 시작해야 한다.