Database/PostgreSQL

# PostgreSQL HA 구성 - PGPoolⅡ

skysoo1111 2019. 10. 23. 17:04

PostgreSQL Pgpool-Ⅱ 는 무엇인가?

Pgpool-II는 PostgreSQL 서버와 PostgreSQL 데이터베이스 클라이언트 사이에 있는 Proxy 소프트웨어이다. 즉, Pgpool-II가 DB Cluster 역할을 하게 해주는 것이다.

 

google

필요한 것인가?

  • Connection Pool 관리 : Connection의 재사용으로 인한 전체 성능 향상
  • Load Balancing : Replication 기능을 통해 같은 Data를 가지고 있다면, Query를 여러 Server에 나눠서 분산 처리
  • Auto Fail Over : Master Server에 장애 발생시, Slave Server가 그 기능을 대신 수행한다.

이전에 구성한 # PostgreSQL Streaming Replication 구성만으로는 HA가 완벽하지 않다.

 

이를 확인하기 위해 간단한 테스트를 진행해봤다.

 

[테스트 환경]

1. 10초 주기로 데이터를 DBInsert하는 간단한 프로그램 작성

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초 주기로 데이터를 DBInsert하는 간단한 프로그램 작성

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

https://browndwarf.tistory.com/6?category=803646

'Database > PostgreSQL' 카테고리의 다른 글

# PostgreSQL Streaming Replication 구성  (0) 2019.10.23
# PostgreSQL Streaming Replication 개념  (0) 2019.10.23