PostgreSQL auto Failover 에 대한 방법을 정리 하였다.(이전 작업에 대한 복구)
구성 : Master, Slave 서버 각 1대. Replication 방법은 PostgreSQL 설치부터 이중화까지 참조
PostgreSQL는 이중화 방식으로 Stream 방식과 WAL(Write Ahead Log) 방식을 지원 한다.
https://ssup2.github.io/theory_analysis/PostgreSQL_Replication/
위의 설명 대로 PostgreSQL 자체적으로 Replication 방법을 제공 하고 있다. 그런데 auto fail over 기능은 제공하지 않는다. 제3의 software를 사용하여 구현햐야 한다. PGPool은 auto fail over 및 load balance 기능을 제공한다. PGPool은 PostgreSQL와 App 사이에서 다양한 역할을 수향하는 Middleware 이다. 주요 제공하는 기능은 아래와 같다.
- Connection Pooling
- Replication
- Load Balancing
- Limiting Exceeding Connections
- Watchdog
- In Memory Query Cache
- Auto failover
이번 프로젝트에서 주로 사용될 기능은 auto failover 기능이다. PGPool은 Query를 이용하여 PostgreSQL 상태를 감시하여 만약 Mater가 가용하지 않으면 ssh를 이용하여 미리 설정된 trigger를 Slave쪽으로 보내여 Slave가 Master 역할을 하도록 한다.
PGPool 설치
설치 기준은 Ubuntu 16.04 기준으로 설명 한다.
- 설치 패키지 업데이트Ubuntu 기준 설치 완료 되면 /etc/pgpool2/ 목록에 설치 된다.
sudo apt-get install
wget ca-certificates
sudo apt-get update
sudo apt-get install pgpool2
install pgpool
- 설정 파일 설정(master, slave 설정 파일은 같다, 유일하게 다른 점은 hostname[서로의 IP를 설정] 부분이다. )
- 기본 설정 파일 pgpool.conf
# CONNECTIONS listen_addresses = '*' #서비스 할 주소 입력 port = 9999 pcp_listen_addresses = '*' pcp_port = 9898 # - Backend Connection Settings - #PostgreSQL 정보 입력 backend_hostname0 = '172.31.12.52' # server0 backend_port0 = 5432 backend_weight0 = 1 backend_data_directory0 = '/var/lib/postgresql/10/main' backend_flag0 = 'ALLOW_TO_FAILOVER' backend_hostname1 = '172.31.12.27' # server1 backend_port1 = 5432 backend_weight1 = 1 backend_data_directory1 = '/var/lib/postgresql/10/main' backend_flag1 = 'ALLOW_TO_FAILOVER' # - Authentication - enable_pool_hba = on pool_passwd = 'pool_passwd' # FILE LOCATIONS pid_file_name = '/opt/pgpool/pgpool.pid' replication_mode = off load_balance_mode = on master_slave_mode = on master_slave_sub_mode = 'stream' sr_check_period = 5 sr_check_user = 'repluser' sr_check_password = 'test!!!' sr_check_database = 'postgres' #------------------------------------------------------------------------------ # HEALTH CHECK #------------------------------------------------------------------------------ health_check_period = 10 # Health check period # Disabled (0) by default health_check_timeout = 20 # Health check timeout # 0 means no timeout health_check_user = 'postgres' # Health check user health_check_password = 'test!!!' # Password for health check user health_check_database = 'postgres' #------------------------------------------------------------------------------ # FILE LOCATIONS #------------------------------------------------------------------------------ pid_file_name = '/var/log/pgpool/pgpool.pid' logdir = '/var/log/pgpool/' #------------------------------------------------------------------------------ # FAILOVER AND FAILBACK #------------------------------------------------------------------------------ failover_command = '/etc/pgpool2/failover_stream.sh %H ' #------------------------------------------------------------------------------ # WATCHDOG #------------------------------------------------------------------------------ # - Enabling - use_watchdog = on # - Watchdog communication Settings - wd_hostname = '172.31.12.27' # Host name or IP address of this watchdog # (change requires restart) wd_port = 9000 # port number for watchdog service # (change requires restart) # - Virtual IP control Setting - delegate_IP = '172.31.12.223' # delegate IP address # If this is empty, virtual IP never bring up. # (change requires restart) if_cmd_path = '/sbin' # path to the directory where if_up/down_cmd exists # (change requires restart) if_up_cmd = 'ifconfig ens3:0 inet $_IP_$ netmask 255.255.255.0' # startup delegate IP command # (change requires restart) if_down_cmd = 'ifconfig ens3:0 down' # shutdown delegate IP command # (change requires restart) arping_path = '/usr/sbin' # arping command path # (change requires restart) arping_cmd = 'arping -w 1-U $_IP_$' #wd setting wd_heartbeat_port = 9694 # Port number for receiving heartbeat signal # (change requires restart) wd_heartbeat_keepalive = 2 # Interval time of sending heartbeat signal (sec) # (change requires restart) wd_heartbeat_deadtime = 30 # Deadtime interval for heartbeat signal (sec) # (change requires restart) heartbeat_destination0 = '172.31.12.52' # Host name or IP address of destination 0 # for sending heartbeat signal. # (change requires restart) heartbeat_destination_port0 = 9694 # Port number of destination 0 for sending # heartbeat signal. Usually this is the # same as wd_heartbeat_port. # (change requires restart) heartbeat_device0 = '' #failover_require_consensus=off enable_consensus_with_half_votes = on # 만약 두대로 서비스를 구성 한다면 현재 옵션을 on으로 # leader 선출 시 과반 투표 아니여도 선출 할 수 있도록 설정 # - Other pgpool Connection Settings - wd_life_point = 3 wd_lifecheck_query = 'SELECT 1' wd_lifecheck_dbname = 'postgres' wd_lifecheck_user = 'rep' wd_lifecheck_password = 'rep' other_pgpool_hostname0 = '172.31.12.52' # Host name or IP address to connect to for other pgpool 0 # (change requires restart) other_pgpool_port0 = 9999 # Port number for othet pgpool 0 # (change requires restart) other_wd_port0 = 9000 # Port number for othet watchdog 0 # (change requires restart)
- 기본 설정 파일 pgpool.conf
- PGPool 로그인 설정(/etc/pgpool2)
- pg_md5 test!!!
- 생성된 문자 복사
- vim pcp.conf 에 생성된 문자 입력
postgres: 6b07583ba8af8e03043a1163147faf6a
- pgpool에 생성된 password 추가
pg_md5 -p -m -u postgres pool_passwd
- ssh 설정( failover 시 사용) [master, slave 모두 적용 ] - 적용 후 비번 없이 로그인 가능 여부 확인
ssh-keygen -t rsa ssh-copy-id -i .ssh/id_rsa.pub root@172.31.12.52 ssh-copy-id -i .ssh/id_rsa.pub root@172.31.12.27
- ifconfig, arping 에 실행 권한 주기
chmod u+s /sbin/ifconfig 2chmod u+s /usr/sbin
- 서비스 구동, 정지
- 서비스 구동
pgpool -n -d -D > /var/log/pgpool/pgpool.log 2>&1 &
- 서비스 정지
pgpool -m fast stop
- 서비스 구동
'DataBase' 카테고리의 다른 글
PostgreSQL Transaction isolation level (0) | 2021.12.13 |
---|---|
ORM 장단점 (0) | 2021.12.12 |
PostgreSQL 설치부터 이중화까지 (0) | 2021.12.12 |
MongoDB 기본적인 사용법 (0) | 2021.11.07 |
MongoDB 개념 및 docker로 서비스 (0) | 2021.11.07 |
Comment