About
home
Tmax OpenSQL
home
💻

46. pgpool-II (1)

작성자

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
SQL
복사

디렉토리 권한 변경

chown -R opensql:tmax /etc/pgpool-II
SQL
복사

pgpool_status 파일 옵션 수정

vi /etc/sysconfig/pgpool
SQL
복사
OPTS=" -D -n"
SQL
복사

vip 관리를 위한 sudo 설정

visudo -f /etc/sudoers opensql ALL=NOPASSWD: /sbin/ip opensql ALL=NOPASSWD: /usr/sbin/arping
SQL
복사

pgpool-II service 설정

systemctl enable pgpool vi /etc/systemd/system/multi-user.target.wants/pgpool.service .... User=opensql Group=tmax ... systemctl daemon-reload
SQL
복사

log 디렉토리 생성

mkdir /opensql/pg/14/log/pgpool
SQL
복사

노드 ID 지정

vi /etc/pgpool-II/pgpool_node_id
SQL
복사
#primary 0 #standby 1
SQL
복사

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]
PowerShell
복사

pcp.conf 파일 작성

echo 'opensql:'`pg_md5 [PCP PASSWORD]` >>/etc/pgpool-II/pcp.conf
PowerShell
복사

.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]
PowerShell
복사
chmod 600 ~/.pgpass
PowerShell
복사

.pcppass 파일 생성

echo '/var/run/opensql:9898:opensql:[PCP PASSWORD]' > ~/.pcppass
PowerShell
복사
chmod 600 ~/.pcppass
PowerShell
복사

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
PowerShell
복사

pgpool_recovery extension 설치

psql template1 -c "CREATE EXTENSION pgpool_recovery"
PowerShell
복사

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
PowerShell
복사
→ pgpool-remote_start 와 recovery_1st_stage는 데이터 디렉토리 안에 위치해야합니다.
지금까지 PostgreSQL의 pgpool-II (1)에 관해 알아보았습니다
‘PostgreSQL의 pgpool-II (2)’를 바로 이어서 확인해보세요!

자유롭게 댓글을 남겨주세요