본문 바로가기
DBMS

[PostgreSQL 이중화] #6. PostgreSQL Pgpool2+Watchdog 이중화 Failover와 Failback

by 이미존재 2022. 11. 10.
반응형

■ PostgreSQL 이중화(Pgpool2+Watchdog) Failover와 Failback


▶ 지난 포스팅에 이어 Auto Failover 테스트와 Failback 작업을 진행해 보겠습니다.
▶ pgpool-II version 4.1.4 버전을 사용하였습니다.(Ubuntu 22.04 Repository에 등록된 패키지 버전입니다. 2022년 11월 기준)
▶ pgpool2과 연동하여 사용한 Watchdog 버전은 5.16 버전입니다.
▶ 구성 환경은 Ubuntu 22.04 LTS 버전에서 PostgreSQL 14.5 버전을 apt install 한 환경입니다.
Primary+Slave 2개 DB-Node로 구성 테스트 결과입니다. pgpool에서는 3개 DB-node 이상을 권장하고 있으며, 2개 Node로 구성시 동작이 원활하지 않음을 확인하였습니다. 2개 DB-Node로 이중화 구성하는 방법과 테스트는 참고용으로만 사용하시기 바랍니다.


1. 정상 상태 확인

Master Server VIP
DB Node Status
Watchdog Status


2. Master 서버 장애(Auto Failover 테스트)

 1) 사례1. Master pgpool 장애
  - Master 서버의 Postgresql은 기동 된 상태에서 pgpool만 장애가 발생한 상황입니다.

Master VIP Down
VIP Connection Fail

  - Master쪽 pgpool이 다운되었다가 일정 시간(health check) 후 다시 기동 하면 VIP가 Salve로 넘어갑니다.

  - Master Postgresql Down > Master Pgpool Down > Master Pgpool Start 순서로 진행해야 VIP가 Slave로 넘어갑니다.
  - Primary pgpool이 다운되면 Postgresql Master와 Slave는 유지되나 VIP가 활성화되지 않아 VIP를 이용한 서비스는 불가합니다.
  - VIP의 failover 기능은 Primary 서버와 Standby 서버에 pgpool이 기동 되어 있어야 합니다.
    pgpool.net에 "VIP will not be brought up in case the quorum does not exist."라는 내용이 있습니다.
  - VIP가 Slave로 넘어가도 pgpool에서 DB Wirte는 LB 처리되어 서비스는 정상 운영되었습니다.
  - DB노드가 최소 2개가 기동된(의사결정 정족수 만족) 상태여야 VIP를 이용한 서비스가 정상 동작하는 하는 것이 확인됩니다.
  - 3개 DB-Node 운영시 아래와 같이 Slave1, Slave2가 모두 다운 되어도 VIP가 활성화되는 것을 확인하였습니다.

3Node VIP Work


 2) 사례2. postgresql 장애
  - Pgpool이 기동 된 상태에서 Master 서버의 PostgreSQL을 다운시켰을 때

Master Node Quarantine
Master Node Down & Slave Node Waiting

  - Slave 서버가 Primary DB로 승격되고 VIP를 이용한 서비스(Port 5433)는 정상 운영됩니다.

Slave 서버 Primary로 승격

  - PostgreSQL의 경우 Primary가 Master에서 Slave로 Auto Failover 되는 것이 확인됩니다.


 3) 사례3. 서버 장애
  - Master 서버 OS가 Shutdown 된 상황입니다.
  - Pgpool이 2대 이상 운영되지 않아 VIP가 기동 되지 않습니다. 정상적인 서비스가 되지 않습니다.
  - Master pgpool에서 failover를 시켜줘야 하나 서버가 다운되어 스크립트가 실행되지 않습니다.
  - Slave 서버 pgpool에서 Master server Status를 "quarantine' 변경시키고 Role은 모두 "Standby" 상태가 되어 버립니다.

Master 서버는 격리되고 2개 DB 서버 모두 Standby상태가 됨

  - Slave 서버를 Primary로 수동 승격 시켜줘야 합니다.

touch /data/postgres14-data/promte_trigger_file.txt

  - 어플리케이션단에서 서비스 포트 및 IP를 Slave 서버로 변경하는 등 조치가 필요합니다.
  - 3개 노드 구성시는 1대 서버 OS가 shutdown 되어도 정상 동작합니다.


3. Master 서버 복구(Failback 테스트)

 - Auto Failback을 설정하지 않았기 때문에 수동으로 Master서버를 Online recovery(Slave) 작업을 해야 합니다.
 - Failback은 Slave가 Primary로 운영되고 장애가 발생했던 Master 서버를 Standby로 복구하는 것을 의미합니다.
 - Online recovery 작업은 기존 Master 서버에서 진행하며 기존 Slave 서버(Primary) $PGDATA 하위에 recovery_1st_stage, pgpool_remote_start 스크립트가 있는지 다시 한번 확인합니다.

 1) Online recovery(Slave) 작업

 - 온라인 복구의 경우 복구 대상 노드가 분리 상태여야 합니다. 즉, 장애 조치의 결과로 노드가 pcp_detach_node에 의해 수동으로 분리되거나 Pgpool-II에 의해 자동으로 분리되어야 합니다.

sudo -u postgres pcp_detach_node -h 192.168.48.121 -p 9898 -U postgres -n 0

 - postgres 계정으로 실행해야 합니다.(-n 옵션 뒤에 숫자는 복구할 Node 번호 입니다.)

 pcp_recovery_node -h 192.168.48.121 -p 9898 -U pgpool -n 0


 2) Online recovery(Slave) 정상적으로 진행되지 않을 경우(Master 서버)
  2)-1. 기존 데이터 삭제

rm -f  /var/log/postgresql/pgpool_status
rm -f /data/postgres14-data/archive/*
rm -rf /data/postgres14-data/main

 

  2)-2. Master Node attach

sudo -u postgres pcp_attach_node -h 192.168.48.129 -p 9898 -U postgres -n 0

 

  2)-3. ps_basebackup

pg_basebackup -h 192.168.48.130 -D /data/postgres14-data/main -U repluser -v -P -R -X stream


  2)-4. postgresql start

 

4. 결론

 - Pgpool2 4.1 버전으로 이중화 구성시 3개 DB-Node 이상으로 구성해야 원활한 이중화 서비스가 되는 것을 확인할 수 있었습니다.
 - 2개 DB-Node 이중화 구성시 Pgpool의 Watchdog을 이용하지 않고 Keepalived를 이용한 VIP 서비스를 구성하는 사례도 있으나 직접 확인은 못해봤습니다.
 - Pgpool2는 최신 4.3에서 많은 부분이 개선된 것으로 확인되니 가급적 최신 버전으로 구성을 권장합니다.
 - Failback시에 Online recovery를 진행했으나 다양한 상황에서 시도 시 실패하는 경우가 다수 있었습니다. 수동으로 pg_basebackup을 이용하여 복구하는 것이 마음 편할 수 있습니다.
 - 여건이 허락되어 3개 DB-node로 HA를 구성하는 것이 아니라면 VIP 이용을 하지 않고 Master 서버의 Real IP 서비스와 Slave로 Auto Failover 기능 정도를 사용하는 것이 좋을 듯합니다.

※ 참고 및 출처
https://www.pgpool.net/docs/latest/en/html/tutorial.html
https://www.pgpool.net/docs/41/en/html/example-cluster.html

728x90

댓글