본문으로 건너뛰기

6.4 노드 추가, 삭제, 교체

노드를 추가할 때는 새 서버에서 pg_autoctl create postgres를 실행하면 됩니다. monitor가 새 노드의 역할을 정합니다. 이어서 primary의 HBA 규칙과 replication slot을 준비하고 pg_basebackup으로 standby를 만듭니다. 삭제할 때는 pg_autoctl drop node를 실행합니다. 두 경우 모두 monitor가 formation의 복제 설정을 노드 수에 맞게 자동으로 조정한다는 점을 알아두어야 합니다.

노드 추가 흐름​

실습에서 2노드 구성에 node3를 추가한 기록입니다.

05:31:28.902 | node3 | wait_standby | catchingup | Setting goal state of node 3 ... to catchingup and node 2 ... to primary to edit synchronous_standby...
05:31:28.902 | node2 | primary | apply_settings | Setting goal state of node 3 ... to catchingup and node 2 ... to primary to edit synchronous_standby...
05:31:30.288 | node3 | catchingup | secondary | Setting goal state of node 3 "node3" (node3:5432) to secondary after it caught up.
node3 reached secondary in 1.6s

primary에서 checkpoint가 막 실행된 시점이어서 pg_basebackup의 checkpoint 대기가 거의 없었습니다. up부터 secondary까지는 2.0초가 걸렸습니다. 쓰기가 오래 누적된 primary라면 checkpoint 대기가 길어집니다(1.4).

추가가 끝나자 formation 설정이 다음과 같이 바뀌었습니다.

formation | default | number_sync_standbys | 1
primary | node2 | synchronous_standby_names | 'ANY 1 (pgautofailover_standby_1, pgautofailover_standby_3)'

2노드일 때 0이던 number_sync_standbys가 두 번째 quorum standby의 추가와 함께 1이 되었습니다. v2.2 문서에서 설명하는 자동 증가입니다. 이 값의 의미는 5.1에서 다룹니다.

drop node의 두 가지 모드​

# 1) 삭제할 노드에서 직접 실행 (노드가 살아 있을 때)
pg_autoctl drop node # monitor에서 제거
pg_autoctl drop node --destroy # PGDATA까지 삭제

# 2) 다른 곳에서 원격으로 실행 (노드가 사라졌을 때)
pg_autoctl drop node --monitor <uri> --formation default --name node3
pg_autoctl drop node --monitor <uri> --hostname node3 --pgport 5432
pg_autoctl drop node --monitor <uri> --formation default --name node3 --force

살아 있는 노드에서 실행하면 monitor가 해당 노드에 dropped 목표를 지정합니다. keeper가 로컬 정리를 마치고 결과를 보고하면 레코드를 지웁니다. 노드가 이미 사라져 결과를 보고할 수 없으면 --force로 레코드만 지웁니다. 명령은 기본 60초(--wait) 동안 삭제 완료를 기다립니다.

실습에서 node3에서 직접 실행한 결과입니다.

05:40:51 INFO Removing node with name "node3" in formation "default" from the monitor
05:40:51 INFO Waiting until the node with id 3 in group 0 has been dropped from the monitor, or for 60s, whichever comes first
05:40:51 INFO New state for this node (node 3, "node3") (node3:5432): dropped ➜ dropped
05:40:51 INFO Node with id 3 in group 0 has been successfully dropped from the monitor
returned 0.6s
formation | default | number_sync_standbys | 0
primary | node1 | synchronous_standby_names | 'ANY 1 (pgautofailover_standby_2)'

삭제 후 number_sync_standbys는 1에서 0으로 내려갔습니다. 남은 quorum standby가 하나뿐이어서 1을 유지할 수 없기 때문입니다. node3 컨테이너의 pg_autoctl은 종료 코드 0으로 끝났습니다.

경고

운영자가 number_sync_standbys를 명시적으로 올려 둔 경우에도 노드를 삭제하면 값이 자동으로 내려갑니다. 노드를 교체한 뒤에는 show settings로 값을 다시 확인해야 합니다. 필요하면 pg_autoctl set formation number-sync-standbys로 되돌려야 합니다.

노드 교체 절차​

서버를 새 장비로 바꾸려면 먼저 추가하고 나중에 삭제합니다. 이 순서를 따르면 교체 중에도 standby 수가 줄지 않습니다.

  1. 새 서버에 패키지를 설치하고 pg_autoctl create postgres --name nodeN ...으로 등록합니다.
  2. show state에서 새 노드가 secondary에 도달했는지 확인합니다.
  3. 옛 노드가 primary라면 perform promotion --name <다른 노드>로 먼저 역할을 옮깁니다.
  4. 옛 노드에서 pg_autoctl drop node --destroy를 실행하거나, 이미 사라졌다면 원격 drop node --force를 사용합니다.
  5. show settings로 number_sync_standbys, candidate priority, replication quorum을 확인합니다.
노트

같은 호스트명으로 노드를 다시 만들 때는 옛 레코드를 먼저 지워야 합니다. 또한 역방향 DNS가 없는 환경에서는 pg_autoctl이 HBA 규칙에 호스트명 대신 IP를 기록합니다. 새 서버의 IP가 다르면 다른 노드의 HBA 규칙과 맞지 않을 수 있습니다. 실습에서는 컨테이너를 다시 만들어 IP가 바뀌자 replication 연결이 no pg_hba.conf entry로 거부되었습니다(9.4).

정리​

노드 추가와 삭제는 각 노드에서 명령 하나로 끝납니다. 다만 monitor가 number_sync_standbys를 노드 수에 맞춰 올리거나 내립니다. 교체는 추가 후 삭제 순서로 진행하고, 끝난 뒤 복제 설정을 다시 확인합니다.