본문 바로가기
DBMS

[PostgreSQL 이중화] #5. PostgreSQL 14.5 Pgpool2+Watchdog을 이용한 이중화(2)

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

■ PostgreSQL 이중화 구성(Pgpool2+Watchdog)

▶ Pgpool2 + Watchdog을 이용한 PostgreSQL 이중화 구성을 Active+Standby 형태로 구성합니다.
▶ pgpool-II version 4.1.4 버전을 사용하였습니다.
▶ pgpool2과 연동하여 사용한 Watchdog 버전은 5.16 버전입니다.
▶ 구성 환경은 Ubuntu 22.04 LTS 버전에서 PostgreSQL 14.5 버전을 apt install 한 환경입니다.
▶ Failover 되면 Master DB에 장애가 발생한 상태이므로, 원인이 확인되지 않은 상태에서 원복 되는 상황을 방지하기 위해 Auto Failback은 구성하지 않았습니다.
※유의 : pgpool2 4.1.4 버전의 경우 DB노드 3개 이상으로 클러스터 구성 해야 VIP를 이용한 서비스 및 Master Server Online Recovery 등이 원활하게 테스트 되는 것으로 확인됩니다. pgpool 4.3 이상 사용을 권장드립니다.
  - pgpool2는 버전마다 설정이 다소 상이한 부분이 있습니다. https://www.pgpool.net 에서 참고하시기 바랍니다.

▶ Master 서버는 현재 운영 중인 서버이며, Slave서버는 신규로 PostgreSQL설치 후 pg_baseback으로 Master 데이터를 가져온 상태입니다.
▶ pgpool은 Failover와 Failback과 관련한 스크립트가 정교하게 작성되어야 하며 버전 및 OS환경에 따라 달라질 수 있으므로 많은 사이트를 참고하여 최적화시켜야 합니다.


10. Slave 서버 Watchdog 설정

 - Slave 서버의 pgpool.conf 파일을 slave에 맞게 변경합니다.

#------------------------------------------------------------------------------
# WATCHDOG
#------------------------------------------------------------------------------

# - Watchdog communication Settings -


wd_hostname = '192.168.48.130' # Watchdog 체크 IP입니다. Slave(berasix-2) 서버는 '192.168.48.130'을 넣어줍니다.

# -- heartbeat mode --

heartbeat_destination0 = '192.168.48.129' # heartbeat 체크 IP입니다. Slave에서는 Master 서버 IP를 '192.168.48.130'을 넣어줍니다.

# - Other pgpool Connection Settings -
other_pgpool_hostname0 = '192.168.48.129' #Master(berasix) 서버 정보를 넣어줍니다.
other_pgpool_port0 = 5433
other_wd_port0 = 9000
#------------------------------------------------------------------------------

 


11. DB pgpool-recovery 함수 활성화(Master 서버)

 - Master 서버의 시스템 장애 복구 후 DB 온라인 복구를 위한 설정입니다.
 - pgpool_recovery, pgpool_remote_start, pgpool_switch_xlog의 기능이 필요하므로 Postgre의 template1에 pgpool_recovery를 설치해야 합니다.
 - Master서버에 활성화 하면 Slave에는 자동 설정됩니다.

 1)  EXTENSION pgpool_recovery 활성화

root@berasix:/data/pgpool/script# su - postgres 
postgres@berasix:~$ psql template1 -c "CREATE EXTENSION pgpool_recovery"
CREATE EXTENSION
postgres@berasix:~$


 2) 오류 조치
  - 아래와 같은 오류 발생시 사전에 Master와 Slave에 "postgresql-14-pgpool2" 패키지를 설치해야 합니다.

root@berasix:/data/pgpool/script# su - postgres 
postgres@berasix:~$ psql template1 -c "CREATE EXTENSION pgpool_recovery"
ERROR:  could not open extension control file "/usr/share/postgresql/14/extension/pgpool_recovery.control": No such file or directory

# apt install postgresql-14-pgpool2

 


12. 접속 인증을 위한 설정(Master, slave 서버 모두)

 1) pg_hba.conf

host    all             pgpool          0.0.0.0/0         scram-sha-256
host    replication     all             192.168.48.0/24       scram-sha-256


 2) pool_hba.conf
  - pool_hba.conf 파일을 사용하려면 pgpool.conf 파일의 "enable_pool_hba = on" 으로 사전에 수정해야 합니다.

root@berasix:/etc/pgpool2# cp -arp /etc/pgpool2/pool_hba.conf /etc/pgpool2/pool_hba.conf.org

root@berasix:/etc/pgpool2# vi /etc/pgpool2/pool_hba.conf

## add berasix
host    all         pgpool           0.0.0.0/0          scram-sha-256
host    all         postgres         0.0.0.0/0          scram-sha-256


13. pgpool_node_id 생성(Master, slave 서버 모두)

 - Master 서버는 0, Slave 서버는 1로 합니다.

# vi /etc/pgpool2/pgpool_node_id




14. Replication & Recovery 관리계정 인증 적용(Master, slave 서버 모두)

  - Streaming replication과 Online Recovery 수행을 위해 데이터베이스에 repluser, postgres 계정으로 암호 인증 없이 접속을 위한 .pgss를 생성합니다.
  - 개인적인 의견으로는 pg_hba.conf에 상대측 서버 계정을 truth로 설정하는게 암호 노출이 없어 나은 게 아닐까 생각합니다.
  - Master, Slave 서버 모두 진행합니다.

root@berasix:~#  su - postgres
postgres@berasix:~$ vi /var/lib/pgsql/.pgpass
berasix:5432:replication:repluser:<repl user password>
berasix-2:5432:replication:repluser:<repl user password>
berasix:5432:postgres:postgres:<postgres user password>
berasix-2:5432:postgres:postgres:<postgres user password>
postgres@berasix:~$ chmod 600  /var/lib/pgsql/.pgpass


15. 방화벽 오픈(Master, Slave 서버 모두)

 - Master 서버와 Slave 서버 간에 이중화를 위한 포트가 오픈 되어 있어야 합니다.
 - Ubuntu ufw 서비스 예제입니다.

ufw allow from 192.168.48.0/23 to any port 5432 proto tcp
ufw allow from 192.168.48.0/23 to any port 5433 proto tcp
ufw allow from 192.168.48.0/23 to any port 9898 proto tcp
ufw allow from 192.168.48.0/23 to any port 9000 proto tcp
ufw allow from 192.168.48.0/23 to any port 9694 proto udp


16. pgpool 접속 권한 설정(Master, Slave 서버 모두)

 - pgpool을 통해 데이터베이스 접속 인증을 위한 설정을 합니다.
 - 데이터베이스 scram-sha-256 인증을 위한 암호 해독키를 생성한 후 db user와 함께 등록합니다.

postgres@berasix:~$ echo '패스워드' > ~/.pgpoolkey
postgres@berasix:~$ chmod 600 ~/.pgpoolkey 

postgres@berasix:~$ pg_enc -m -k ~/.pgpoolkey -u pgpool -p
db password:   DB계정 패스워드
trying to read key from file /var/lib/postgresql/.pgpoolkey
postgres@berasix:~$ 

postgres@berasix:~$ pg_enc -m -k ~/.pgpoolkey -u postgres -p
db password:   DB계정 패스워드
trying to read key from file /var/lib/postgresql/.pgpoolkey


17. pcp 명령 실행을 위한 설정(Master, Slave 서버 모두)

 - failback 기능을 수행하는 스크립트에서 pcp 명령을 사용하기 위해 md5 암호화 알고리즘 인증 설정을 합니다.
 1) pcp.conf 파일에 항목을 생성합니다.(비밀번호는 DB 계정 비밀번호입니다.)

echo 'pgpool:'`pg_md5 비밀번호` >> /etc/pgpool2/pcp.conf
echo 'postgres:'`pg_md5 비밀번호` >> /etc/pgpool2/pcp.conf

echo 'pgpool:'`pg_md5 pgpool-2` >> /etc/pgpool2/pcp.conf
echo 'postgres:'`pg_md5 ESGit#001` >> /etc/pgpool2/pcp.conf


 2) 데이터베이스 인증 설정

root@berasix:/data/pgpool/script# su - postgres 
postgres@berasix:~$ pwd
/var/lib/postgresql
postgres@berasix:~$ vi /var/lib/postgresql/.pcppass
#아래 내용을 넣습니다.
localhost:9898:pgpool:비밀번호
watchdog vip:9898:pgpool:비밀번호
localhost:9898:postgres:비밀번호
watchdog vip:9898:postgres:비밀번호

postgres@berasix:~$ chmod 600 /var/lib/postgresql/.pcppass


18. 서비스 재기동

 1) 서비스 중지
  1)-1. Slave 서버의 pgpool, posgresql 순서로 중지합니다.

root@berasix-2:~# systemctl stop pgpool2.service 
root@berasix-2:~# systemctl stop postgresql.service


  1)-2. Master 서버의 pgpool, posgresql 순서로 중지 합니다.

root@berasix:~# systemctl stop pgpool2.service 
root@berasix:~# systemctl stop postgresql


 2) 서비스 기동
  2)-1. Master 먼저 기동 합니다. 이때 pgpool 로그 경로에 있는 pgpool_status 파일을 지워 Status를 초기화합니다.

root@berasix:~# rm -f /var/log/postgresql/pgpool_status 
root@berasix:~# systemctl start pgpool2.service


  2)-2. Master가 정상 기동 되었는지 확인하고 Slave를 기동 합니다. 이때 pgpool 로그 경로에 있는 pgpool_status 파일을 지워 Status를 초기화합니다.

root@berasix-2:~# rm -f /var/log/postgresql/pgpool_status 
root@berasix-2:~# systemctl start pgpool2.service


19. 기동 및 접속 오류 조치


 1) slave 로그에

FATAL: could not receive data from WAL stream: ERROR: requested WAL segment xxxx has already been removed

  - Slave가 Master와 끊어졌을 때 발생하는 에러입니다.
  - 위의 에러는 Slave 서버의 DB가 장시간 내려가 있거나, Master 대량의 작업이 빠르게 발생했다면 서버도 max_wal_size 파라미터 값에 의해 WAL파일이 재활용되기 때문에 pg_wal 디렉터리에는 이미 덮어 써질 수 있습니다.
  - Slave에서 아카이빙 된 WAL 데이터를 따라잡을 수 있을 만큼 충분히 재생하면 읽기 전용 복제본으로의 스트리밍이 다시 시작됩니다
  - 스트리밍이 다시 시작되지 않을 경우 아래 방법으로 조치할 수 있습니다.
   : 아카이브가 복잡하게 꼬여 있거나 조치가 어려운 상태라면  pg_basebackup을 통해 Slave를 재구성해주시는 것이 편할 수 있습니다.

 2) pgpool 접속 오류

postgres@berasix:~$ psql -h localhost -p 5433 -U postgres
psql: error: connection to server at "localhost" (127.0.0.1), port 5433 failed: ERROR:  failed to authenticate with backend using SCRAM
DETAIL:  valid password not found

  - pgpool을 통한 데이터베이스 접속 인증을 위한 기본 암호 파일을 이름은 pool_passwd. 데이터베이스 scram-sha-256 인증을 위한 암호 해독 키를 생성한 후 db user와 함께 pool_passwd 파일에 등록

postgres@berasix:~$ echo '패스워드' > ~/.pgpoolkey
postgres@berasix:~$ chmod 600 ~/.pgpoolkey 

postgres@berasix:~$ pg_enc -m -k ~/.pgpoolkey -u pgpool -p
db password:   DB계정 패스워드
trying to read key from file /var/lib/postgresql/.pgpoolkey
postgres@berasix:~$ 

postgres@berasix:~$ pg_enc -m -k ~/.pgpoolkey -u postgres -p
db password:   DB계정 패스워드
trying to read key from file /var/lib/postgresql/.pgpoolkey

  - 아래와 같은 오류 발생 시 파일 권한을 확인하고 변경합니다.

postgres@berasix:~$ pg_enc -m -k ~/.pgpoolkey -u pgpool -p
db password: 
trying to read key from file /var/lib/postgresql/.pgpoolkey
ERROR: pid 13217: initializing pool password, failed to open file:"/etc/pgpool2/pool_passwd"

조치 : 권한을 postgres로 맞춘다
root@berasix:~# chown -R postgres.postgres /etc/pgpool2/*


20. 서비스 상태 확인

 1) pool의 상태 확인
  - Master 서버는 Primary, Slave 서버는 Standby 상태여야 합니다.

postgres@berasix:~$ psql -h 192.168.48.121 -p 5433 -U postgres
Password for user postgres: 
psql (14.5 (Ubuntu 14.5-0 ubuntu0.22.04.1))
Type "help" for help.

postgres=# show pool_nodes;


  2)-1. pool_nodes 상태 값 오류(1) 조치
  - 'show pool_nodes;' 결과값 중 status field 값이 unused나 down으로 나오게 되면 Standby Server가 Down이나 Unused로 나올 때가 있습니다.
  - Standby Server는 정상 동작 중이고, Streaming Replication도 문제가 없다면 PGPool log 폴더에 생성되는 pgpool_status 값이 갱신이 안되어 발생할 수 있습니다.
  - 해당 파일을 삭제한 후에 다시 Restart하니 정상적으로 Load Balancing이 적용됩니다.

var/log/postgresql# rm -f /var/log/postgresql/pgpool_status 
var/log/postgresql# 
var/log/postgresql# 
var/log/postgresql# systemctl stop pgpool2.service 
var/log/postgresql# systemctl stop postgresql.service 
var/log/postgresql# 
var/log/postgresql# systemctl start pgpool2.service


  2)-2. pool_nodes 상태 값 오류(2) 조치
  - node를 detach 후에 attach 해 봅니다.

sudo -u postgres pcp_detach_node -h 192.168.48.130 -p 9898 -U postgres -n 1
sudo -u postgres pcp_attach_node -h 192.168.48.130 -p 9898 -U postgres -n 1


 3) 서비스용 VIP 접속
 - 서비스를 위한 VIP로 정상 접속되는지 확인합니다.



※ 참고 및 출처
https://www.pgpool.net/docs/41/en/html/example-cluster.html
https://www.pgpool.net/docs/42/en/html/example-cluster.html
https://www.pgpool.net/docs/41/en/html/runtime-watchdog-config.html


 

728x90

댓글