본문 바로가기
PostgreSQL

pgpool-II(5) | pgpool-II auto failover/online recovery

by 울라불라오미짱 2023. 6. 22.
반응형

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 노드의 데이터베이스 클러스터 경로
  • 노드 연결

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라고 하는데요 ! 관련된 내용은 다음 포스트에서 다뤄보도록 하겠습니다!

반응형