pgpool-II 을 이용하여 postgresql과 구성을 완성 했다면 pgpool-II 에서 지원하는 기능인 auto failover 와 online recovery 를 사용해보도록 하겠습니다.
Auto Failover
failover란 pgpool-II 에서 더 이상 접근할 수 없는 PostgreSQL 백엔드 노드를 자동으로 분리하는 것입니다. 이 기능은 파라미터 설정에 관계없이 자동으로 발생하며 이를 auto failover 라고 합니다. pgpool-II 은 다음 방법을 사용하여 PostgreSQL 가 접근 불가능한 상태인 것을 확인합니다.
- health check 프로세스가 pgpool-II 에서 PostgreSQL 노드로 상태확인을 위해 연결을 시도합니다. 연결에 실패하면 pgpool-II 과 PostgreSQL 사이의 네트워크에 문제가 있거나 PostgreSQL이 제대로 작동하지 않을 수 있습니다.
- PostgreSQL에 연결하는 동안 오류가 발생하거나 통신에 문제가 생겼을때, failover_on_backend_error 파라미터가 꺼져있으면 pgpool-II이 클라이언트에 대한 세션 연결을 끊습니다.
- 클라이언트가 이미 pgpool-II 에 연결되어 있고 PostgreSQL이 종료된 경우
failover_command가 설정되어 있고, failover 가 실행되면 failover_command에 지정된 커맨드가 실행됩니다. failover command는 기존 standby 서버에서 새로운 primary 서버를 선택하고 승격해주는 것이 주된 역할입니다.
Auto Failover 테스트
현재 노드 상태는 다음과 같습니다.
| node ID | IP | role | pgpool-II role |
| 0 | 192.168.40.133 | primary | Active(VIP를 가지고있음) |
| 1 | 192.168.40.134 | standby | Standby |
1. 테스트 시작 전 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-21 16:53:44
192.168.40.134 5432 2 0.500000 up up standby primary 0 none none 2023-06-21 16:53:44
2. VIP 소유 여부를 확인합니다.
[test@localhost:data]$ ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mt u 1500
inet 192.168.40.133 netmask 255.255.255.0 b roadcast 192.168.40.255
inet6 fe80::888:efed:a6b5:e04 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:1d:1e:cc txqueuelen 1000 (Et hernet)
RX packets 1400436 bytes 1720271861 (1.6 GiB )
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1515520 bytes 3304220694 (3.0 GiB )
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.40.200 netmask 255.255.255.0 b roadcast 0.0.0.0
ether 00:0c:29:1d:1e:cc txqueuelen 1000 (Et hernet)
3. 0번 노드 서버를 중단합니다.
reboot
4. 1번 노드에서 pcp_node_info 커맨드를 통해 노드 상태를 확인합니다.
[test@localhost:pgpool-II]$ pcp_node_info -h /var/run/test -w
192.168.40.133 5432 3 0.500000 down down standby unknown 0 none none 2023-06-21 17:03:41
192.168.40.134 5432 2 0.500000 up up primary primary 0 none none 2023-06-21 17:07:44
0번 노드는 down 상태가 되었으며 1번 노드는 primary 서버가 되었고 상태는 up인 것을 확인할 수 있습니다. 이로서 failover가 잘 수행 되었다는 것을 파악할 수 있습니다.
5. 1번노드에서 VIP 확인합니다.
[test@localhost:pgpool-II]$ ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.40.134 netmask 255.255.255.0 broadcast 192.168.40.255
inet6 fe80::888:efed:a6b5:e04 prefixlen 64 scopeid 0x20<link>
inet6 fe80::ace4:4a45:7afa:a50b prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:1c:98:40 txqueuelen 1000 (Ethernet)
RX packets 1312982 bytes 1730710844 (1.6 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1299705 bytes 3149802035 (2.9 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.40.200 netmask 255.255.255.0 broadcast 0.0.0.0
ether 00:0c:29:1c:98:40 txqueuelen 1000 (Ethernet)
0번 노드의 pgpool-II 노드가 더이상 사용이 불가능한 상태가 되자 0번 노드의 VIP가 1번노드로 잘 넘어온 것을 확인할 수 있습니다.
Online Recovery
pgpool-II 은 서비스를 중지하지 않고, 데이터베이스 노드를 동기화 하고 연결할 수 있습니다. 이 기능을 Online Recovery 라고 합니다. Online Recovery 는 pcp_recovery_node 명령어를 통해 실행할 수 있습니다.
Online Recovery를 위해서는 복구 대상 노드가 분리되어 있고, 복구 대상의 PostgreSQL 서버가 실행되고 있지 않아야합니다.
Online Recovery는 두 단계로 수행될 수 있습니다. 대부분은 첫번째 단계만 수행하며, native_replication_mode 및 snapshot_isolation_mode에만 두번재 단계가 필요합니다. streaming replication에서는 이 단계가 수행되지 않으며 스크립트를 제공할 필요 없고 빈 string 으로 남겨두면 됩니다.
Online Recovery을 실행하면 다음 단계가 수행됩니다.
- CHECKPOINT
- 첫번째 단계 ( pg_basebackup 을 사용한 standby 노드 생성 )
- 모든 클라이언트 연결을 끊는다 (native_replication_mode/snapshot_isolation_mode)
- CHECKPOINT (native_replication_mode/snapshot_isolation_mode)
- 두번째 단계 (native_replication_mode/snapshot_isolation_mode)
- pgpool_remote_start 스크립트를 통한 standby 노드의 PostgreSQL 서버 시작
- pgpool_remote_start는 복구 대상의 PostgreSQL 노드를 시작하는 스크립트입니다 . pgpool_remote_start는 다음 2개의 매개변수를 수신합니다.
- 복구할 백엔드 노드의 호스트와 primary 노드의 데이터베이스 클러스터 경로
- pgpool_remote_start는 복구 대상의 PostgreSQL 노드를 시작하는 스크립트입니다 . pgpool_remote_start는 다음 2개의 매개변수를 수신합니다.
- 노드 연결
Online Recovery 테스트
현재 노드 상태는 다음과 같습니다.
| node ID | IP | role | pgpool-II role |
| 0 | 192.168.40.133 | X | X |
| 1 | 192.168.40.134 | primary | Active(VIP를 가지고있음) |
1. 테스트 시작 전 pcp_node_info 커맨드를 통해 노드 상태를 확인합니다.
[test@localhost:pgpool-II]$ pcp_node_info -h /var/run/test -w
192.168.40.133 5432 3 0.500000 down down standby unknown 0 none none 2023-06-21 17:03:41
192.168.40.134 5432 2 0.500000 up up primary primary 0 none none 2023-06-21 17:07:44
2. pcp_recovery_node 커맨드를 이용해 online recovery 를 진행합니다.
[test@localhost:pgpool-II]$ pcp_recovery_node -n 0 -h /var/run/test -w
pcp_recovery_node -- Command Successful
-n 옵션으로 복구할 노드 ID를 입력합니다.
3. 복구 완료 후, 다시 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
4. 0번과 1번 노드에서 PostgreSQL 프로세스를 확인합니다.
- 1번 노드 (primary)
[test@localhost:pgpool-II]$ ps -ef | grep postgres
test 24824 1 0 16:57 ? 00:00:01 /usr/pgsql-14/bin/postgres -D /test/pg/14/data
test 24825 24824 0 16:57 ? 00:00:00 postgres: logger
test 24835 24824 0 16:57 ? 00:00:00 postgres: checkpointer
test 24837 24824 0 16:57 ? 00:00:00 postgres: background writer
test 24838 24824 0 16:57 ? 00:00:00 postgres: stats collector
test 25390 24824 0 17:03 ? 00:00:00 postgres: walwriter
test 25391 24824 0 17:03 ? 00:00:00 postgres: autovacuum launcher
test 25392 24824 0 17:03 ? 00:00:00 postgres: logical replication launcher
test 49125 24824 0 18:06 ? 00:00:00 postgres: walsender repluser 192.168.40.133(42798) streaming 0/D1000060
- 0번 노드(standby)
[test@localhost:~]$ ps -ef | grep postgres
test 1776 1 0 18:06 ? 00:00:00 /usr/pgsql-14/bin/postgres -D /test/pg/14/data
test 1777 1776 0 18:06 ? 00:00:00 postgres: logger
test 1778 1776 0 18:06 ? 00:00:00 postgres: startup recovering 0000000400000000000000D1
test 1785 1776 0 18:06 ? 00:00:00 postgres: checkpointer
test 1786 1776 0 18:06 ? 00:00:00 postgres: background writer
test 1787 1776 0 18:06 ? 00:00:00 postgres: stats collector
test 1794 1776 0 18:06 ? 00:00:00 postgres: walreceiver streaming 0/D1000060
프로세스를 확인해보니 streaming replication으로 두개의 노드가 다시 연결이 잘 된것을 확인할 수 있습니다.
물론 이렇게 운영해도 문제는 없겠지만… primary 와 standby 서버를 다시 원복 시켜놓아야 하겠죠?
그 기능을 Switch Over라고 하는데요 ! 관련된 내용은 다음 포스트에서 다뤄보도록 하겠습니다!
'PostgreSQL' 카테고리의 다른 글
| pgpool-II(6) | pgpool-II Switch Over / Auto Failback (0) | 2023.06.23 |
|---|---|
| pgpool-II(4) | pgpool-II과 PostgreSQL 서버 연결 (pgpool-II to PostgreSQL Server) (0) | 2023.06.22 |
| pgpool-II 부록 : PCP Commands (2) | 2023.06.16 |
| pgpool-II(3) | pgpool-II 설치 및 기본 구성 (pgpool-II Installation and Basic Configuration) (2) | 2023.06.16 |
| pgpool-II(2) 파라미터 | PostgreSQL14 HA Tool Parameters (2) | 2023.06.15 |