Innovating today, leading tomorrow

OpenSQL_Technical Guide
[OpenSQL] pgpool-II (1)

[OpenSQL] 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 poolingPostgreSQL 서버에 대한 연결을 저장하고 동일한 연결이 들어올 때마다 재사용하여, 오버헤드를 줄이고 시스템의 전체 처리량을 향상시킵니다.
Replication여러 PostgreSQL 서버를 관리할 수 있습니다. 복제 기능을 사용하면 2개 이상의 물리적 디스크에 실시간 백업을 생성할 수 있으므로 디스크 장애 시, 서버를 중단하지 않고 서비스를 계속할 수 있습니다.
Load Balancing데이터베이스가 replication 인 경우, SELECT 쿼리를 실행하면 여러 서버에 쿼리를 배포하여 서버의 부하를 줄여 시스템의 전체 처리량을 향상시킵니다.
Limiting Exceeding ConnectionsPostgreSQL과의 최대 동시 연결 수에 제한을 할 수 있으며 이 수만큼 연결되면 연결이 거부됩니다.
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 기능 수행 시 실행되는 다음 쉘 스크립트를 환경에 맞게 수정 후, 각 노드에 복사하여 전송합니다.

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)’를 바로 이어서 확인해보세요!

광고성 정보 수신

개인정보 수집, 활용 목적 및 기간

(주)티맥스티베로의 개인정보 수집 및 이용 목적은 다음과 같습니다.
내용을 자세히 읽어보신 후 동의 여부를 결정해 주시기 바랍니다.

  • 수집 목적: 티맥스티베로 뉴스레터 발송 및 고객 관리
  • 수집 항목: 성함, 회사명, 회사 이메일, 연락처, 부서명, 직급, 산업, 담당업무, 관계사 여부, 방문 경로
  • 보유 및 이용 기간: 동의 철회 시까지

※ 위 개인정보 수집 및 이용에 대한 동의를 거부할 권리가 있습니다.
※ 필수 수집 항목에 대한 동의를 거부하는 경우 뉴스레터 구독이 제한될 수 있습니다.

개인정보의 처리 위탁 정보
  • 업체명: 스티비 주식회사
  • 위탁 업무 목적 및 범위: 광고가 포함된 뉴스레터 발송 및 수신자 관리
 

개인정보 수집 및 이용

개인정보 수집, 활용 목적 및 기간

(주)티맥스티베로의 개인정보 수집 및 이용 목적은 다음과 같습니다. 내용을 자세히 읽어보신 후 동의 여부를 결정해 주시기 바랍니다.

  • 수집 목적: 티맥스티베로 뉴스레터 발송 및 고객 관리
  • 수집 항목: 성함, 회사명, 회사 이메일, 연락처, 부서명, 직급, 산업, 담당업무, 관계사 여부, 방문 경로
  • 보유 및 이용 기간: 동의 철회 시까지

※ 위 개인정보 수집 및 이용에 대한 동의를 거부할 권리가 있습니다.
※ 필수 수집 항목에 대한 동의를 거부하는 경우 뉴스레터 구독이 제한될 수 있습니다.

개인정보의 처리 위탁 정보

  • 업체명: 스티비 주식회사
  • 위탁 업무 목적 및 범위: 광고가 포함된 뉴스레터 발송 및 수신자 관리
  •