8. Pgpool 설치 및 구성
설치 계획:
Pgpool은 PostgreSQL 조직에 대해 다음을 담당합니다.
PostgreSQL 마스터 노드로 클라이언트(ThingWorx) 쓰기 트래픽 전달
PostgreSQL 대기 노드로 클라이언트 읽기 트래픽 전달
다양한 장애 조치 시나리오 중 모든 PostgreSQL 노드 관리
따라서 Pgpool-II 노드와 PostgreSQL 노드 간에 신뢰 관계를 설정하는 것이 중요합니다.
이 예제에서 신뢰 관계를 설정하는 방법은 다음과 같습니다.
Pgpool 노드에 Postgresql 구성 요소를 설치하면 postgres 사용자도 만들어집니다.
모든 노드(pgpool 마스터 노드, pgpool 슬레이브 노드, postgresql node0, postgresql node1 및 postgresql node2)의 postgres 사용자에 대해 동일한 암호를 설정합니다.
Pgpool 마스터 노드에 ssh 키를 만들고 모든 노드에 공용 키를 배포합니다.
비공개 키를 Pgpool 대기 노드에도 배포합니다.
모든 노드의 사용자 postgres에 대해 신뢰 관계를 설정합니다.
위 신뢰를 달성하기 위한 주요 단계는 다음과 같습니다.
사용자 postgres에 대해 Pgpool 마스터 노드에 idrsa 및 idrsa.pub를 생성하기 위한 ssh-keygen
idrsa.pub의 콘텐츠를 모든 노드에 있는 postgres 사용자의 ~/.ssh/authorizedkeys에 복사합니다.
사용자 postgres에 대해 모든 노드의 chmod 700 ~/.ssh 입니다.
vim /etc/ssh/sshd_config에 다음 콘텐츠를 사용합니다.
PermitEmptyPasswords yes
PasswordAuthentication yes
postgres 사용자 암호를 모든 노드에서 동일한 값으로 변경합니다.
ssh postgres@remote_IP를 테스트하여 모든 Pgpool-II 노드가 ssh 키를 사용하여 모든 PostgreSQL 노드에 인증할 수 있는지 확인합니다.
Pgpool 설치
RHEL에서 다음 명령을 사용하여 Pgpool을 설치할 수 있습니다.
sudo rpm -ivh http://www.pgpool.net/yum/rpms/3.6/redhat/rhel-6-x86_64/pgpool-II-release-3.6-1.noarch.rpm
sudo yum -y install pgpool-II-pg94
sudo yum -y install pgpool-II-pg94-debuginfo
sudo yum -y install pgpool-II-pg94-devel
sudo yum -y install pgpool-II-pg94-extensions
sudo yum -y install postgresql-contrib
Pgpool 구성
각 Pgpool-II 노드에서 다음 단계를 수행합니다.
단계 1
pgpool.conf를 업데이트합니다.
사용자 pgpool로 로그인합니다.
다음 콘텐츠를 사용하여 pgpool.conf:
vim /etc/pgpool-II/pgpool.conf
를 편집합니다.
서버 노드
구성 항목
구성 값
노드
1
listen_address
*
보안 요구사항에 따라 이 값을 특정 IP 주소로 수정할 수 있습니다.
2
port
5432
3
pcp_listen_addresses
*
보안 요구사항에 따라 이 값을 특정 IP 주소로 수정할 수 있습니다.
4
pcp_port
9898
5
backend_hostname0
'10.91.9.200'
6
backend_port0
5432
7
backend_weight0
1
8
backend_data_directory0
'/db/postgres'
9
backend_flag0
ALLOWTOFAILOVER
10
backend_hostname1
'10.91.9.24'
11
backend_port1
5432
12
backend_weight1
1
13
backend_data_directory1
'/db/postgres'
14
backend_flag1
'ALLOWTOFAILOVER'
15
backend_hostname2
'10.91.9.41'
16
backend_port2
5432
17
backend_weight2
1
18
backend_data_directory2
'/db/postgres'
19
enable_pool_hba
on
20
master_slave_mode
on
21
master_slave_sub_mode
'stream'
22
sr_check_period
10
23
sr_check_user
'replicator'
24
sr_check_password
'replicator'
25
sr_check_database
'postgres'
26
health_check_user
'postgres'
27
health_check_password
'postgres'
28
health_check_database
'postgres'
29
failover_command
'/etc/pgpool-II/failover.sh %d %h %D %m %H %R %M %P'
* 
watchdog 구성에 대한 매개 변수는 아직 이 예제에 포함되어 있지 않습니다.
단계 2
장애 조치 스크립트를 만듭니다.
vim /etc/pgpool-II/failover.sh
에 다음 콘텐츠를 사용합니다.
#!/bin/bash -x
echo ------------------------Begin failover------------------------
#------------------------------------
# Inputs
#------------------------------------
FAILED_NODEID=$1 # %d = node id
FAILED_HOSTNAME=$2 # %h = hostname
FAILED_DBPATH=$3 # %D = database cluster path
NEW_MASTER_NODEID=$4
NEW_MASTER_HOSTNAME=$5
NEW_MASTER_DBPATH=$6
OLD_MASTER_NODEID=$7
OLD_PRIMARY_NODEID=$8
# %m = new master node id
# %H = new master host name
# %R = new master database cluster path
# %M = old master node id
# %P = old primary node id
#------------------------
# Nodes
#------------------------
PGDATA=/db/postgres
PGBIN=/usr/pgsql-10.x/bin
LOCALBIN=/db/bin
NODE0_HOSTNAME=10.91.9.200
NODE0_ARCHIVE=/db/node0archive
NODE1_HOSTNAME=10.91.9.24
NODE1_ARCHIVE=/db/node1archive
NODE2_HOSTNAME=10.91.9.41
NODE2_ARCHIVE=/db/node2archive
if [ $FAILED_NODEID = $OLD_PRIMARY_NODEID ]; then

if ssh -T postgres@$NEW_MASTER_HOSTNAME grep -q "$FAILED_HOSTNAME" /db/postgres/recovery.conf; then
#yes, it is, go ahead to promote
echo Node $NEW_MASTER_HOSTNAME can be promoted safely
else
#otherwise, new master has to be switched.
if [ $FAILED_NODEID = 1 ]; then
if [ $NEW_MASTER_NODEID = 0 ]; then
NEW_MASTER_HOSTNAME=$NODE2_HOSTNAME
NEW_MASTER_NODEID=2
else
NEW_MASTER_HOSTNAME=$NODE0_HOSTNAME
NEW_MASTER_NODEID=0
fi;
fi;
if [ $FAILED_NODEID = 2 ]; then
if [ $NEW_MASTER_NODEID = 0 ]; then
NEW_MASTER_HOSTNAME=$NODE1_HOSTNAME
NEW_MASTER_NODEID=1
else
NEW_MASTER_HOSTNAME=$NODE0_HOSTNAME
NEW_MASTER_NODEID=0
fi;
fi;
if [ $FAILED_NODEID = 0 ]; then
if [ $NEW_MASTER_NODEID = 1 ]; then
NEW_MASTER_HOSTNAME=$NODE2_HOSTNAME
NEW_MASTER_NODEID=2
else
NEW_MASTER_HOSTNAME=$NODE1_HOSTNAME
NEW_MASTER_NODEID=1
fi;
fi;

echo New master has been switched to $NEW_MASTER_HOSTNAME
fi;

TARGET_HOSTNAME=0.0.0.0
TARGET_ARCHIVE=/db/archive
STANDBY1_HOSTNAME_TO_RETARGET=0.0.0.0
if [ $FAILED_NODEID = 0 ]; then
if [ $NEW_MASTER_NODEID = 1 ]; then
TARGET_HOSTNAME=$NEW_MASTER_HOSTNAME
TARGET_ARCHIVE=/db/node1archive
STANDBY1_HOSTNAME_TO_RETARGET=$NODE2_HOSTNAME
else
TARGET_HOSTNAME=$NEW_MASTER_HOSTNAME
TARGET_ARCHIVE=/db/node2archive
STANDBY1_HOSTNAME_TO_RETARGET=$NODE1_HOSTNAME
fi;
fi;
if [ $FAILED_NODEID = 1 ]; then
if [ $NEW_MASTER_NODEID = 0 ]; then
TARGET_HOSTNAME=$NEW_MASTER_HOSTNAME
TARGET_ARCHIVE=/db/node0archive
STANDBY1_HOSTNAME_TO_RETARGET=$NODE2_HOSTNAME
else
TARGET_HOSTNAME=$NEW_MASTER_HOSTNAME
TARGET_ARCHIVE=/db/node2archive
STANDBY1_HOSTNAME_TO_RETARGET=$NODE0_HOSTNAME
fi;
fi;
if [ $FAILED_NODEID = 2 ]; then
if [ $NEW_MASTER_NODEID = 0 ]; then
TARGET_HOSTNAME=$NEW_MASTER_HOSTNAME
TARGET_ARCHIVE=/db/node0archive
STANDBY1_HOSTNAME_TO_RETARGET=$NODE1_HOSTNAME
else
TARGET_HOSTNAME=$NEW_MASTER_HOSTNAME
TARGET_ARCHIVE=/db/node1archive
STANDBY1_HOSTNAME_TO_RETARGET=$NODE0_HOSTNAME
fi;
fi;

ssh -T postgres@$NEW_MASTER_HOSTNAME $PGBIN/pg_ctl promote -D $PGDATA
ssh -T postgres@$STANDBY1_HOSTNAME_TO_RETARGET $LOCALBIN/retargetMaster.sh $TARGET_HOSTNAME $TARGET_ARCHIVE

exit 0;
else
TARGET_HOSTNAME=0.0.0.0
TARGET_ARCHIVE=/db/archive
NEW_STANDBY_HOSTNAME=0.0.0.0
if [ $OLD_PRIMARY_NODEID = 0 ]; then
TARGET_HOSTNAME=$NODE0_HOSTNAME
TARGET_ARCHIVE=$NODE0_ARCHIVE
if [ $FAILED_NODEID = 1 ]; then
NEW_STANDBY_HOSTNAME=$NODE2_HOSTNAME
else
NEW_STANDBY_HOSTNAME=$NODE1_HOSTNAME
fi
fi;
if [ $OLD_PRIMARY_NODEID = 1 ]; then
TARGET_HOSTNAME=$NODE1_HOSTNAME
TARGET_ARCHIVE=$NODE1_ARCHIVE
if [ $FAILED_NODEID = 2 ]; then
NEW_STANDBY_HOSTNAME=$NODE0_HOSTNAME
else
NEW_STANDBY_HOSTNAME=$NODE2_HOSTNAME
fi
fi;
if [ $OLD_PRIMARY_NODEID = 2 ]; then
TARGET_HOSTNAME=$NODE2_HOSTNAME
TARGET_ARCHIVE=$NODE2_ARCHIVE
if [ $FAILED_NODEID = 0 ]; then
NEW_STANDBY_HOSTNAME=$NODE1_HOSTNAME
else
NEW_STANDBY_HOSTNAME=$NODE0_HOSTNAME
fi
fi;

ssh -T postgres@$NEW_STANDBY_HOSTNAME $LOCALBIN/retargetMaster.sh $TARGET_HOSTNAME $TARGET_ARCHIVE
exit 0;
fi;
echo 'Did not complete failover'
echo -------------------End failover---------------
exit 0;
스크립트 실행 파일을 만듭니다.
chmod a+x /etc/pgpool-II/failover.sh
단계 3
pcp.conf.
vim /etc/pgpool-II/pcp.conf
를 다음 콘텐츠로 업데이트합니다.
# Lines beginning with '#' (pound) are comments and will
# be ignored. Again, no spaces or tabs allowed before '#'.postgres:e8a48653851e28c69d0506508fb27fc5
# USERID:MD5PASSWD
PostgreSQL의 기본 암호는 'postgres'이므로 암호를 업데이트해야 합니다.
단계 4
pool_hba.conf.
vim /etc/pgpool-II/pool_hba.conf
를 다음 콘텐츠로 업데이트합니다.
# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 10.91.0.0/16 trust
보안 요구사항에 따라 조정할 수 있습니다.