PostgreSQL

pgpool-II(6) | pgpool-II Switch Over / Auto Failback

울라불라오미짱 2023. 6. 23. 10:15
반응형

Switch Over

  • 장애가 발생하면 failover가 수행되지만 수동으로 failover을 트리거할 수 있습니다. 이것을 Switch Over라고 합니다.
  • pcp_promote_node 명령어를 통해 실행할 수 있으며, pgpool-II은 옵션으로 지정한 노드를 새로운 Primary로 승격시킬 수 있습니다.
  • 현재 primary 노드를 down으로 변경하고, 그러면 failover_command가 실행되어 지정된 노드가 새 primary 노드로 승격됩니다.
  • switch over를 실행 하려면 이전 primary노드가 standby노드로 전환되고, standby노드가 새로운 primary 를 바라봐야 하기 때문에 follow_primary_command가 반드시 올바르게 설정되어 있어야 합니다.

Switch Over Test

Switch over는 pcp_promote_node 커맨드를 통해 실행하며, 반드시 -s 옵션을 같이 사용해야 실행할 수 있습니다.

  1. Switch over 수행 전, pcp_node_info 커맨드를 통해 노드 상태를 확인합니다.
[test@localhost:pgpool-II]$ pcp_node_info -h /var/run/test -w
192.168.40.133 5432 2 0.500000 up up standby standby 0 streaming async 2023-06-21 18:09:21
192.168.40.134 5432 2 0.500000 up up primary primary 0 none none 2023-06-21 17:07:44
  1. pcp_promote_node 커맨드를 실행합니다.
[test@localhost:~]$ pcp_promote_node -n  0 -h /var/run/test -w -s
pcp_promote_node -- Command Successful
  1. Switch over 수행 후, pcp_node_info 커맨드를 통해 노드 상태를 확인합니다.
[test@localhost:pgpool-II]$ pcp_node_info -h /var/run/test -w
192.168.40.133 5432 2 0.500000 up up primary primary 0 none none 2023-06-22 09:46:13
192.168.40.134 5432 2 0.500000 up up standby standby 0 streaming async 2023-06-22 09:46:13

primary 와 standby 가 바뀌어 운영되고 있는 상태에서 switch over을 통해 다시 서버 구성을 원복시켰습니다. 장애가 발생하기 이전의 상태와 같은 상태로 복원된 것을 확인할 수 있습니다.

이 처럼 서버의 role을 서로 바꾸려면 pcp_promote_command 에서 -s 로 switch over기능을 사용해야합니다.


Auto Failback

  • pgpool-II 은 PostgreSQL의 상태를 모니터링하고 장애가 감지되면 auto failover을 수행하거나 degeneration을 수행할 수 있습니다.
  • 그렇기 때문에 정상적으로 운영이 되고 있었지만 일시적인 네트워크 문제로 인해 PostgreSQL 서버가 pgpool-II 에서 분리될 수 있습니다. 분리된 standby 서버를 다시 연결하려면 장애가 없는 서버인지 확인한 다음에 pcp_attach_node 커맨드를 실행하거나 pgpool-II 을 다시 실행해야합니다.
  • pgpool-II 4.1 부터는 auto_failback 파라미터를 활성화 하여 정상적인 PostgreSQL 서버를 자동으로 다시 연결할 수 있습니다.
  • 이 기능을 사용하려면 pgpool-II health check 및 streaming replication check를 활성화 해야됩니다. 그리고 primary서버와 standby 서버간의 연결을 확인하기 위해 주기적으로 정보를 검색해야하기 때문에 PostgreSQL 버전은 9.1 이상이여야 합니다.
  • replication slot 을 사용하는 경우 failover_command에 의해 삭제되어 auto failback이 제대로 작동하지 않을 가능성이 있습니다.

Auto Failback 조건

  • pgpool-II auto failback은 다음 조건이 충족되는 경우 PostgreSQL 서버를 자동으로 연결합니다.
    • standby PostgreSQL 서버일 때
    • PostgreSQL 서버가 down 상태일 때
    • pg_stat_replication.state 가 streaming 일 때
  • auto failback 을 활성화 하려면 다음 파라미터를 구성해야 됩니다.
auto_failback = on 
auto_failback_interval 
health_check_user 
health_check_password 
sr_check_user 
sr_check_password 
backend_application_name*
파라미터  설명
auto_failback on 으로 설정하면 노드 상태가 down이지만 streaming replication이 정상적으로 작동하는 경우, standby 노드가 자동으로 장애 복구 됩니다.
auto_failback_internal auto failback 실행 간격의 최소 시간을 지정합니다.
health_check_user 상태 확인을 수행할 사용자 이름을 지정 모든 PostgreSQL 백엔드에 동일한 사용자가 있어야 함
health_check_password 상태 확인을 수행하기 위해 health_check_user에 구성된 사용자의 비밀번호를 지정
sr_check_user 스트리밍 복제 검사를 수행할 PostgreSQL 사용자 이름을 지정
sr_check_password 스트리밍 복제 검사를 수행할 사용자의 암호를 지정
backend_application_name* Primary 노드에서 WAL 로그를 수신하는 walreceiver의 애플리케이션 이름 지정

Auto Failback Test

현재 노드 상태는 다음과 같습니다.

Node ID IP pgpool-II role
0 192.168.40.133 primary Active(VIP를 가지고있음)
1 192.168.40.134 standby Standby

테스트 전 필수 구성 요소

  • streaming replication check에 사용되는 PostgreSQL 유저는 superuser이거나 pg_monitor 권한이 있어야합니다.
  • pg_hba.conf 에 데이터베이스 접속을 허용할 항목을 추가합니다.
  • 저는 테스트 목적이기 때문에 trust로 설정하고 진행합니다. pg_hba.conf 내용은 이전 streaming replication 구성할 때 작성한 그대로입니다.
  • standby 서버를 구별하는데 application_name을 사용하기 때문에 primary_conninfo 에 application_name을 설정해주어야합니다.
  • pgpool.conf 파라미터를 추가합니다.
auto_failback = on
auto_failback_interval = 1min

health_check_period = 10
health_check_user = 'postgres'
sr_check_period = 10
sr_check_user = 'postgres'

backend_hostname0 = '192.168.40.133'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/test/pg/14/data'
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_application_name0 = '192.168.40.133'

backend_hostname1 = '192.168.40.134'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/test/pg/14/data'
backend_flag1 = 'ALLOW_TO_FAILOVER'
backend_application_name1 = '192.168.40.134'

trust가 아닌 다른 인증방법을 사용하려면 health_check_password 와 sr_check_password 설정을 해주어야합니다.

설정 해준 후, pgpool-II 을 재기동 해주어 변경된 설정을 적용해줍니다.

 

이제 auto failback 테스트를 해보도록 하겠습니다!

 

1. show pool_nodes 를 이용해 노드 상태를 확인합니다.

postgres=# show pool_nodes;
 node_id |    hostname    | port | status | pg_status | lb_weight |  role   | pg_role | select_cnt | load_balance_node | replication_
delay | replication_state | replication_sync_state | last_status_change
---------+----------------+------+--------+-----------+-----------+---------+---------+------------+-------------------+-------------
------+-------------------+------------------------+---------------------
 0       | 192.168.40.133 | 5432 | up     | up        | 0.500000  | primary | primary | 0          | false             | 0
      |                   |                        | 2023-06-22 16:05:01
 1       | 192.168.40.134 | 5432 | up     | up        | 0.500000  | standby | standby | 0          | true              | 0
      | streaming         | async                  | 2023-06-22 16:05:01
(2 rows)

2. replication slot을 사용 중인지 확인합니다.

postgres=# SELECT * FROM pg_replication_slots ;
   slot_name    | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | conf
irmed_flush_lsn | wal_status | safe_wal_size | two_phase
----------------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+-----
----------------+------------+---------------+-----------
 192_168_40_134 |        | physical  |        |          | f         | t      |      95641 |      |              | 0/DB000148  |
                | reserved   |               | f
(1 row)

‘192_168_40_134 ‘ 이라는 replication slot을 사용하고 있음을 알 수 있습니다.

 

3. 그런 다음 standby PostgreSQL 서버를 중지합니다.

pg_ctl stop

4. standby 서버의 상태 변화를 확인하기 위해, show pool_nodes 를 이용해 노드 상태를 확인합니다.

postgres=# show pool_nodes;
 node_id |    hostname    | port | status | pg_status | lb_weight |  role   | pg_role | select_cnt | load_balance_node |
 replication_delay | replication_state | replication_sync_state | last_status_change
---------+----------------+------+--------+-----------+-----------+---------+---------+------------+-------------------+
-------------------+-------------------+------------------------+---------------------
 0       | 192.168.40.133 | 5432 | up     | up        | 0.500000  | primary | primary | 0          | true              |
 0                 |                   |                        | 2023-06-22 16:09:55
 1       | 192.168.40.134 | 5432 | down   | down      | 0.500000  | standby | unknown | 0          | false             |
 0                 |                   |                        | 2023-06-22 16:09:14
(2 rows)

1번 노드의 상태가 up상태에서 down으로 변경된 것을 확인할 수 있습니다.

 

5. replication slot을 사용 했다면, 서버를 다시 기동하기 전에 먼저 replication slot을 생성해줍니다.

psql -h 192.168.40.133 -c "SELECT * FROM pg_create_physical_replication_slot('192_168_40_134');"

6. 중지한 standby 서버를 다시 기동합니다.

pg_ctl start

7. standby 서버의 상태 변화를 확인하기 위해, show pool_nodes 를 이용해 노드 상태를 확인합니다.

postgres=# show pool_nodes;
 node_id |    hostname    | port | status | pg_status | lb_weight |  role   | pg_role | select_cnt | load_balance_node |
 replication_delay | replication_state | replication_sync_state | last_status_change
---------+----------------+------+--------+-----------+-----------+---------+---------+------------+-------------------+
-------------------+-------------------+------------------------+---------------------
 0       | 192.168.40.133 | 5432 | up     | up        | 0.500000  | primary | primary | 0          | true              |
 0                 |                   |                        | 2023-06-22 16:09:55
 1       | 192.168.40.134 | 5432 | down   | up        | 0.500000  | standby | standby | 0          | false             |
 0                 |                   |                        | 2023-06-22 16:39:24
(2 rows)

서버는 시작 됐지만 아직 pgpool-II 클러스터에 연결 되지 않은 상태임을 알 수 있습니다. 이럴 때 수동으로 pcp_attach_node 커맨드를 사용하면 다시 클러스터에 추가시킬 수 있습니다.

 

8. 약 1분 뒤 show pool_nodes 를 이용해 노드 상태를 확인합니다.

postgres=# show pool_nodes;
 node_id |    hostname    | port | status | pg_status | lb_weight |  role   | pg_role | select_cnt | load_balance_node |
 replication_delay | replication_state | replication_sync_state | last_status_change
---------+----------------+------+--------+-----------+-----------+---------+---------+------------+-------------------+
-------------------+-------------------+------------------------+---------------------
 0       | 192.168.40.133 | 5432 | up     | up        | 0.500000  | primary | primary | 0          | false             |
 0                 |                   |                        | 2023-06-22 16:09:55
 1       | 192.168.40.134 | 5432 | up     | up        | 0.500000  | standby | standby | 0          | true              |
 0                 | streaming         | async                  | 2023-06-22 16:40:50
(2 rows)

auto_failback 기능을 통해 정상적으로 운영되는 standby 서버를 자동으로 pgpool-II 클러스터에 연결되고 상태도 up으로 변경 된 내용을 볼 수 있습니다.

반응형