Postgres Failover 방법

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 로그인 설정(/etc/pgpool2)
    1. pg_md5 test!!!
    2. 생성된 문자 복사
    3. vim pcp.conf 에 생성된 문자 입력postgres: 6b07583ba8af8e03043a1163147faf6a
    4. 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