pgpool-II(6) | pgpool-II Switch Over / Auto Failback
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 옵션을 같이 사용해야 실행할 수 있습니다.
- 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
- pcp_promote_node 커맨드를 실행합니다.
[test@localhost:~]$ pcp_promote_node -n 0 -h /var/run/test -w -s
pcp_promote_node -- Command Successful
- 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으로 변경 된 내용을 볼 수 있습니다.