PostgreSQL Pgpool-Ⅱ 는 무엇인가?
Pgpool-II는 PostgreSQL 서버와 PostgreSQL 데이터베이스 클라이언트 사이에 있는 Proxy 소프트웨어이다. 즉, Pgpool-II가 DB Cluster 역할을 하게 해주는 것이다.
왜 필요한 것인가?
- Connection Pool 관리 : Connection의 재사용으로 인한 전체 성능 향상
- Load Balancing : Replication 기능을 통해 같은 Data를 가지고 있다면, Query를 여러 Server에 나눠서 분산 처리
- Auto Fail Over : Master Server에 장애 발생시, Slave Server가 그 기능을 대신 수행한다.
이전에 구성한 # PostgreSQL Streaming Replication 구성만으로는 HA가 완벽하지 않다.
이를 확인하기 위해 간단한 테스트를 진행해봤다.
[테스트 환경]
1. 10초 주기로 데이터를 DB에 Insert하는 간단한 프로그램 작성
2. 프로그램 기동 후, Master DB 기동 중지
3. 상태 확인
=> Replication Streaming 구성한 서버 중 Master Server가 Down 됐을 때, 당연하게도 Read-only Server인 Slave Server는 조회는 가능하나, 저장이 안되면서 runtime error가 발생했다.
이제 이 테스트가 성공하도록 구성해보자.
Step 1. Pgpool-II 설치
$ yum install http://www.pgpool.net/yum/rpms/4.1/redhat/rhel-7-x86_64/pgpool-II-pg11-debuginfo-4.1RC1-1pgdg.rhel7.x86_64.rpm
$ yum install pgpool-II-pg11
Step 2. Pgpool-II Load Balancer 설정
# 설정 파일 백업
$ cp /etc/pgpool-II/pgpool.conf /etc/pgpool-II/pgpool.conf.backup
$ cp /etc/pgpool-II/pgpool.conf.sample-stream /etc/pgpool-II/pgpool.conf
# Pgpool-II 파일 설정
$ vi /etc/pgpool-II/pgpool.conf
#------------------------------------------------------------------------------
# CONNECTIONS
#------------------------------------------------------------------------------
# - pgpool Connection Settings -
listen_addresses = '*'
port = 5433
socket_dir = '/var/run/postgresql'
...
# - Backend Connection Settings -
backend_hostname0 = '<MasterIP>'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/var/lib/pgsql/11/data'
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_hostname1 = '<SlaveIP>'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/var/lib/pgsql/11/data'
backend_flag1 = 'ALLOW_TO_FAILOVER'
...
#------------------------------------------------------------------------------
# FILE LOCATIONS
#------------------------------------------------------------------------------
pid_file_name = '/var/run/pgpool/pgpool.pid'
logdir = '/usr/pgpool-11/log'
...
#------------------------------------------------------------------------------
# LOAD BALANCING MODE
#------------------------------------------------------------------------------
load_balance_mode = on
...
#------------------------------------------------------------------------------
# MASTER/SLAVE MODE
#------------------------------------------------------------------------------
master_slave_mode = on
master_slave_sub_mode = 'stream'
...
# - Streaming -
sr_check_period = 5
sr_check_user = 'postgres'
sr_check_password = 'postgres'
[pgpool 로그 폴더 생성]
mkdir /usr/pgpool-11/log
[방화벽]
firewall-cmd --zone=public --add-port=5433/tcp --permanent
firewall-cmd --reload
Step 3. Pgpool-II 기동
# pgpool 기동
systemctl enable pgpool.service
systemctl start pgpool.service
systemctl status pgpool.service
# pgpool 기동 상태 확인
$ psql -h localhost -p 5433 -U postgres
$ show pool_nodes;
=> 이까지 진행하면 Load Balancing 기능은 설정 완료 되었다.
Step 4. Pgpool-II Fail Over 설정
$ vi /etc/pgpool-II/pgpool.conf
#------------------------------------------------------------------------------
# FAILOVER AND FAILBACK
#------------------------------------------------------------------------------
failover_command = '/usr/pgsql-11/share/failover.sh %d %H /var/lib/pgsql/11/data/failover_trigger'
# failover 스크립트 작성
$ cd /usr/pgsql-11/share
$ vi failover.sh
------
if [ $# -ne 3 ]
then
echo "failover failed_node new_master trigger_file"
exit 1
fi
FAILED_NODE=$1
NEW_MASTER=$2
TRIGGER_FILE=$3
# Do nothing if standby server goes down
if [$FAILED_NODE = 1]; then
echo "Standby Server is downed\n" >> /usr/pgpool-11/log/failover.log
exit 0
fi
echo "failover.sh FAILED_NODE:${FAILED_NODE}; NEW_MASTER:${NEW_MASTER}; at $(date)\n" >> /usr/pgpool-11/log/failover.log
sudo -u postgres ssh -T postgres@$NEW_MASTER touch $TRIGGER_FILE
exit 0
# failover.sh 권한 변경
$ chmod 755 /usr/pgsql-1/share/failover.sh
Step 5. SSH 인증 - A ( SSH 인증 방법을 두가지 모두 포스팅하겠다. A는 예전 방식, B는 요즘 방식 )
# Master Node
$ su - postgres
$ rm -rf /var/lib/pgsql/.ssh/*
$ ssh <MasterIP> pwd
$ ssh <SlaveIP> rm -rf /var/lib/pgsql/.ssh/*
$ ssh <SlaveIP> mkdir -p /var/lib/pgsql/.ssh/
$ scp /var/lib/pgsql/.ssh/known_hosts postgres@<SlaveIP>:/var/lib/pgsql/.ssh/
$ ssh-keygen -t rsa -P '' -f /var/lib/pgsql/.ssh/id_rsa
$ cat /var/lib/pgsql/.ssh/id_rsa.pub >> /var/lib/pgsql/.ssh/authorized_keys
$ scp /var/lib/pgsql/.ssh/authorized_keys postgres@<SlaveIP>:/var/lib/pgsql/.ssh/
Slave Node
$ ssh-keygen -t rsa -P '' -f /var/lib/pgsql/.ssh/id_rsa
$ cat /var/lib/pgsql/.ssh/id_rsa.pub >> /var/lib/pgsql/.ssh/authorized_keys
$ scp /var/lib/pgsql/.ssh/authorized_keys postgres@<MasterIP>:/var/lib/pgsql/.ssh/
접속 테스트
# ssh -A <MasterIP>
# ssh -A <SlaveIP>
SSH 인증 - B
$ su - postgres
$ ssh-keygen
# ssh key 확인
$ ls -al /var/lib/pgsql/.ssh
# Slave Server로 key 복사
$ ssh-copy-id postgres@<SlaveIP>
# Slave Server에서 key 확인
ls -al /var/lib/pgsql/.ssh
# 접속 테스트
ssh -A postgres@<SlaveIP>
Step 6. Fail Over Test
[테스트 환경]
1. 10초 주기로 데이터를 DB에 Insert하는 간단한 프로그램 작성
2. 프로그램 기동 후, Master DB 기동 중지
3. 상태 확인
# master Node
$ psql -h localhost -p 5433 -U postgres
$ show pool_nodes;
=> 상태 확인
# Master DB 서비스 중지
$ systemctl stop postgresql-9.6.service
$ systemctl status postgresql-9.6.service
# slave Node
$ psql -h localhost -p 5433 -U postgres
$ show pool_nodes;
=> 상태 확인
# pgpool 로그 확인
$ tail -f /var/lib/pgsql/11/data/log/postgresql-Mon.log
# failover 로그 확인
cd /usr/pgpool-11/log
=> DB Insert 중간에 Master Server를 중지해도 프로그램 기동에 아무런 이슈가 없다. Test 성공!
<참고>
SSH 인증 단계에서 설정을 올바르게 다 끝냈는데도 비밀번호를 계속 입력하라고 나오면 아래 명령어 실행
$ restorecon -R /var/lib/pgsql/11/data/.ssh/
참조 사이트
https://www.pgpool.net/docs/latest/en/html/intro-whatis.html
'Database > PostgreSQL' 카테고리의 다른 글
# PostgreSQL Streaming Replication 구성 (0) | 2019.10.23 |
---|---|
# PostgreSQL Streaming Replication 개념 (0) | 2019.10.23 |