pgpool-II (1) 개요
pgpool-II은 PostgreSQL tool이며 많은 기능을 제공하며 많이 쓰이는 툴 중 하나 입니다. 양이 방대하여 파트를 나누어서 업로드 하려고 합니다.
pgpool-II 이란?
- PostgreSQL 서버와 PostgreSQL 데이터베이스 클라이언트 (사용자) 사이에서 작동하는 미들웨어입니다.
- client(어플리케이션, user단)에서는 pgpool을 PostgreSQL 서버로 인식하고, PostgreSQL 서버에서는 pgpool을 client로 인식합니다.

pgpool-II 기능
pgpool-II은 아래와 같은 다양한 기능을 제공합니다.
기능 | 기능설명 |
---|---|
Connection pooling | PostgreSQL 서버에 대한 연결을 저장하고 동일한 연결이 들어올 때마다 재사용하여, 오버헤드를 줄이고 시스템의 전체 처리량을 향상시킵니다. |
Replication | 여러 PostgreSQL 서버를 관리할 수 있습니다. 복제 기능을 사용하면 2개 이상의 물리적 디스크에 실시간 백업을 생성할 수 있으므로 디스크 장애 시, 서버를 중단하지 않고 서비스를 계속할 수 있습니다. |
Load Balancing | 데이터베이스가 replication 인 경우, SELECT 쿼리를 실행하면 여러 서버에 쿼리를 배포하여 서버의 부하를 줄여 시스템의 전체 처리량을 향상시킵니다. |
Limiting Exceeding Connections | PostgreSQL과의 최대 동시 연결 수에 제한을 할 수 있으며 이 수만큼 연결되면 연결이 거부됩니다. |
Watchdog | 여러개의 pgpool-II을 관리하고 heartbeat를 체크하여 pgpool-II 서버의 문제를 확인 후, 장애 복구를 할 수 있습니다. |
In Memory Query Cache | 메모리 쿼리 캐시에서 SELECT 문과 그 결과 쌍을 저장할 수 있습니다. 동일한 SELECT가 들어오면 pgpool-II은 캐시에서 값을 반환합니다. |
pgpool-II 설치 및 구성
RPM 설치
yum install -y https://www.pgpool.net/yum/rpms/4.3/redhat/rhel-7-x86_64/pgpool-II-pg14-4.3.3-1pgdg.rhel7.x86_64.rpm
yum install -y https://www.pgpool.net/yum/rpms/4.3/redhat/rhel-7-x86_64/pgpool-II-pg14-debuginfo-4.3.3-1pgdg.rhel7.x86_64.rpm
yum install -y https://www.pgpool.net/yum/rpms/4.3/redhat/rhel-7-x86_64/pgpool-II-pg14-extensions-4.3.3-1pgdg.rhel7.x86_64.rpm
디렉토리 권한 변경
chown -R opensql:tmax /etc/pgpool-II
pgpool_status 파일 옵션 수정
vi /etc/sysconfig/pgpool
OPTS=” -D -n”
vip 관리를 위한 sudo 설정
visudo -f /etc/sudoers
opensql ALL=NOPASSWD: /sbin/ip
opensql ALL=NOPASSWD: /usr/sbin/arping
pgpool-II service 설정
systemctl enable pgpool
vi /etc/systemd/system/multi-user.target.wants/pgpool.service
….
User=opensql
Group=tmax
…
systemctl daemon-reload
log 디렉토리 생성
mkdir /opensql/pg/14/log/pgpool
노드 ID 지정
vi /etc/pgpool-II/pgpool_node_id
#primary
0
#standby
1
SSH 설정
mkdir ~/.ssh
chmod 700 ~/.ssh
cd ~/.ssh
ssh-keygen -t rsa
ssh-copy-id -i id_rsa.pub opensql@[primary IP]
ssh-copy-id -i id_rsa.pub opensql@[standby IP]
pcp.conf 파일 작성
echo ‘opensql:’
pg_md5 [PCP PASSWORD]
>>/etc/pgpool-II/pcp.conf
.pgpass 파일 생성
[Primary IP]:5432:postgres:postgres: [PASSWORD]
[Standby IP]:5432:postgres:postgres:[PASSWORD]
[Primary IP]:5432:postgres:repluser:[PASSWORD]
[Standby IP]:5432:postgres:repluser:[PASSWORD]
chmod 600 ~/.pgpass
.pcppass 파일 생성
echo ‘/var/run/opensql:9898:opensql:[PCP PASSWORD]’ > ~/.pcppass
chmod 600 ~/.pcppass
pgpool.conf 설정
cat << EOF >> /etc/pgpool-II/pgpool.conf
——————————————————————————
OpenSQL for PostgreSQL PGPOOL CONFIG
——————————————————————————
CONNECTION
————
backend_clustering_mode = ‘streaming_replication’
listen_addresses = ‘‘ port = 9999 pcp_listen_addresses = ‘‘
pcp_port = 9898—————
AUTEHNTICATION
—————
enable_pool_hba = on
———
BACKEND
———
backend_hostname0 = ‘[primary IP]’
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = ‘/opensql/pg/14/data’
backend_flag0 = ‘ALLOW_TO_FAILOVER’
backend_application_name0 = ‘[primary IP]’backend_hostname1 = ‘[standby IP]’
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = ‘/opensql/pg/14/data’
backend_flag1 = ‘ALLOW_TO_FAILOVER’
backend_application_name1 = ‘[standby IP]’————-
HEALTH CHECK
————-
health_check_period = 10
health_check_timeout = 30
health_check_user = ‘postgres’
health_check_password = ”
health_check_database = ‘postgres’
health_check_max_retries = 5—————————-
STREAMING REPLICATION CHECK
—————————-
sr_check_period = 10
sr_check_user = ‘postgres’
sr_check_password = ”
sr_check_database = ‘postgres’———-
Escalation Settings
———-
enable_consensus_with_half_votes=on
———-
WATCHDOG
———-
use_watchdog = on
delegate_IP = ‘[VIP]’
if_cmd_path = ‘/sbin’
arping_path = ‘/usr/sbin’
if_up_cmd = ‘/usr/bin/sudo /sbin/ip addr add [VIP]/24 dev ens32 label ens32:0’
if_down_cmd = ‘/usr/bin/sudo /sbin/ip addr del [VIP]/24 dev ens32’
arping_cmd = ‘/usr/bin/sudo /usr/sbin/arping -U $ -w 1 -I ens32‘WATCHDOG COMMUNICATION SETTINGS
hostname0 = ‘192.168.245.134’
wd_port0 = 9000
pgpool_port0 = 9999
hostname1 = ‘192.168.245.135’
wd_port1 = 9000
pgpool_port1 = 9999
wd_lifecheck_method = ‘heartbeat’
wd_interval = 10
wd_heartbeat_keepalive = 2
wd_heartbeat_deadtime = 30
heartbeat_hostname0 = ‘[primary IP]’
heartbeat_port0 = 9694
heartbeat_device0 = ”
heartbeat_hostname1 = ‘[standby IP]’
heartbeat_port1 = 9694
heartbeat_device1 = ”
wd_escalation_command = ‘/etc/pgpool-II/escalation.sh’———
LOGGING
———
log_destination = ‘stderr’
logging_collector = on
log_directory = ‘/opensql/pg/14/log/pgpool’
log_filename = ‘pgpool-%Y-%m-%d_%H%M%S.log’
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 10MB—————–
SOCKET DIRECTORY
—————–
socket_dir = ‘/var/run/opensql’
pcp_socket_dir = ‘/var/run/opensql’
wd_ipc_socket_dir = ‘/var/run/opensql’
pid_file_name = ‘/var/run/opensql/pgpool.pid’—————–
FAILOVER COMMAND
—————–
failover_command = ‘/etc/pgpool-II/failover.sh %d %h %p %D %m %H %M %P %r %R %N %S’
—————
FOLLOW COMMAND
—————
follow_primary_command = ‘/etc/pgpool-II/follow_primary.sh %d %h %p %D %m %H %M %P %r %R’
—————-
ONLINE RECOVERY
—————-
recovery_user = ‘postgres’
recovery_password = ”
recovery_1st_stage_command = ‘recovery_1st_stage’
EOF
pgpool_recovery extension 설치
psql template1 -c “CREATE EXTENSION pgpool_recovery”
pgpool-II 쉘 스크립트 작성
pgpool-II 기능 수행 시 실행되는 다음 쉘 스크립트를 환경에 맞게 수정 후, 각 노드에 복사하여 전송합니다.
- failover.sh
- follow_primary.sh
- escalation.sh
- pgpool_remote_start
- recovery_1st_stage
cp pgpool_remote_start.sample /opensql/pg/14/data/pgpool_remote_start
cp recovery_1st_stage.sample /opensql/pg/14/data/recovery_1st_stage
cp follow_primary.sh.sample follow_primary.sh
cp failover.sh.sample failover.sh
cp escalation.sh.sample escalation.sh
→ pgpool-remote_start 와 recovery_1st_stage는 데이터 디렉토리 안에 위치해야합니다.
지금까지 PostgreSQL의 pgpool-II (1)에 관해 알아보았습니다
‘PostgreSQL의 pgpool-II (2)’를 바로 이어서 확인해보세요!