Pgpool-II & PostgreSQL

ロードバランス、コネクションプーリング、フェイルオーバー、レプリケーションなど、たくさんの機能をもっているPgpool-IIですが、まずは簡単なフェイルオーバーを試してみました。

#memory_cache_enabled = on
memory_cache_enabled = off

参考)
「Pgpool-IIで高可用なシステム構成を考える」
https://www.fujitsu.com/jp/products/software/resources/feature-stories/postgres/article-index/pgpool2/
「Installing Pgpool-II on Debian/Ubuntu」
https://b-peng.blogspot.com/2022/03/pgpool-debian.html
「Ubuntu 18.04 LTS でpgpool-IIを使ってPostgreSQLをキャッシュする」
https://qiita.com/takonasu/items/dedfaccae5abf139466a
「Pgpool-II 4.4.2 コマンド」
https://www.pgpool.net/docs/latest/ja/html/reference.html

環境)
pgpool-II 4.3.3 / Ubuntu 22.04
PostgreSQL(12.2)は下記、ストリーミングレプリケーションのセット(port:5432,5433)を使用します。

PostgreSQL Replication



PostgreSQL起動・停止方法(マスタとスタンバイ)

pg_ctl –pgdata=/home/postgres/data –log=/home/postgres/db.log start
pg_ctl –pgdata=/home/postgres/data stop

pg_ctl –pgdata=/home/postgres/data_rep –log=/home/postgres/db_rep.log start
pg_ctl –pgdata=/home/postgres/data_rep stop

インストール

echo “deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main” | sudo tee -a /etc/apt/sources.list.d/pgdg.list
curl -s https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add –
sudo apt update
sudo apt install pgpool2


設定

vi /etc/pgpool2/pgpool.conf

port = 5430

backend_hostname0 = ‘localhost’
backend_port0 = 5432
backend_weight0 = 1
backend_flag0 = ‘ALWAYS_PRIMARY’

backend_hostname1 = ‘localhost’
backend_port1 = 5433
backend_weight1 = 2
backend_flag1 = ‘DISALLOW_TO_FAILOVER’

Pgpool起動・停止

service pgpool2 start
service pgpool2 stop

※前回の状態を覚えたままにならないようにするため起動オプション(-D)を追加します。

vi /lib/systemd/system/pgpool2.service

ExecStart=/usr/sbin/pgpool -D -n
上記設定更新

systemctl daemon-reload

接続、設定確認

フェイルオーバーの確認をしていきます。
マスタ、スタンバイ、pgpoolが起動している状態は以下のようになります。

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 | localhost | 5432 | up | up | 0.333333 | primary | primary | 0 | true | 0 |
| | 2023-02-17 04:42:39
1 | localhost | 5433 | up | up | 0.666667 | standby | standby | 0 | false | 0 |
| | 2023-02-17 04:42:39
(2 rows)

この状態で、INSERTし、マスタ、スレーブで確認(SELECT)します。-> OK
別コンソールでマスタを停止し、再び”show pool_nodes”を実行します。

postgres=# show pool_nodes;
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
The connection to the server was lost. Attempting reset: Succeeded.

このようになってしまうので、一度quitしてから、もう一度psqlを立ち上げ実行します。

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 | localhost | 5432 | down | down | 0.333333 | primary | unknown | 0 | false | 0 |
| | 2023-02-17 04:42:58
1 | localhost | 5433 | up | up | 0.666667 | standby | standby | 0 | true | 0 |
| | 2023-02-17 04:42:39
(2 rows)

プライマリがダウンしていることを確認できました。
この状態でINSERTをするとスタンバイ側なのでリードオンリーでエラーになります。
ここでマスタを復帰させても、psqlを再起動しても表示も状態はかわらりせんでした。
Pgpoolを再起動させると、また元の状態にもどります。(-Dオプションがないと状態が戻らず)

またメモリーキャッシュのテストとして、これを有効にしたとき、マスタのpsqlからINSERTしたとき、pgpoolのpsqlでは反映が確認できませんでした。

#memory_cache_enabled = on
memory_cache_enabled = off

ログはデフォルトでsyslogに出力します。

以上、挙動の確認でした。