オールインワンの PostgreSQL クラスタ管理ツール
Pgpool-II で何ができる？
OSC2022 Online/Osaka2022-1-29
SRA OSS, Inc. 日本支社
彭 博 (ペン ボ)© 2022 SRA OSS, Inc. Japan

1

自己紹介
ペン ボ

• 名前： 彭 博 (Bo Peng)
pengbo@sraoss.co.jp• 所属：SRA OSS, Inc. 日本支社
基盤技術グループ• 職務：• OSS技術サポート、ミドルウェア構築• PostgreSQLクラスタ管理ツールPgpool-IIの開発者© 2022 SRA OSS, Inc. Japan2

本日の流れ• Pgpool-IIとは• Pgpool-IIの紹介• 新バージョン4.3の機能紹介© 2022 SRA OSS, Inc. Japan3

Pgpool-II とは• クライアントとPostgreSQLの間で動作するミドルウェア• ユーザは複数PostgreSQLサーバを意識せず、1台のように見える© 2022 SRA OSS, Inc. Japan

4

Pgpool-IIの機能
高可用性性能向上

負荷分散

自動フェイルオーバ

検索性能向上Pgpool-IIの単一障害点を防ぐ

クエリキャッシュ

ダウンしたノードをオンラインリカバリして、スタンバイとして組み込む

Watchdog

オンラインリカバリ

コネクションプーリング© 2022 SRA OSS, Inc. Japan

コネクションを保持し再利用することで、接続コストを軽減

5

Pgpool-IIの基本構成

プライマリ

WAL
更新/参照クエリ

VIP

参照クエリ
ヘルスチェック/
SRチェック© 2022 SRA OSS, Inc. Japan

WAL
スタンバイ

スタンバイ

6

自動フェイルオーバ• フェイルオーバの契機• ヘルスチェックでダウンと判定された場合• ヘルスチェック： 各PostgreSQLノードの状態を監視するプロセス• 実行間隔、最大リトライ回数などを設定可能• ノードへの接続、および接続中にエラーが発生した場合• failover_on_backend_error = on の場合

プライマリ• フェイルオーバ処理
1. failover_command

昇格• スタンバイの昇格• カスタムスクリプトを指定できる

新しいプライマリ

2. follow_primary_command• 残りのスタンバイの同期先を新しいプライマリに変更• カスタムスクリプトを指定できる
スタンバイ© 2021 SRA OSS, Inc. Japan

7

負荷分散
• SQLパーサを搭載しており、クエリを解析できる• 更新クエリをプライマリに送り、参照クエリを複数のPostgreSQLノード間で分散• 負荷分散モード• セッションレベル (デフォルト)• ステートメントレベル• 負荷分散の比率が設定可能
例えば、プライマリを更新処理専用にし、すべての参照クエリをスタンバイに振り分けたい
backend_weight0 = 0
backend_weight1 = 1
backend_weight2 = 1
Read(0%)
プライマリ© 2022 SRA OSS, Inc. Japan

Read(50%)
スタンバイ

Read
50%
スタンバイ

8

Watchdogとは• Pgpool-IIの単一障害点を回避• 複数のPgpool-IIがお互いに監視することで、Pgpool-IIを冗長化するための機能• 定期的に他のPgpool-IIノードにハートビート信号を送信• Pgpool-IIノードの障害が検出された際に、Watchdogは投票によって新しいリーダーを決定し、切り替える• 仮想IPの自動切り替え• バックエンドノードのフェイルオーバの動作を制御
Leader

SQL

VIP

Watchdog

Standby

LeaderWatchdog

Heartbeat

Watchdog© 2022 SRA OSS, Inc. Japan

9

Pgpool-II 4.3の新機能紹介© 2022 SRA OSS, Inc. Japan

10

v4.3の主な新機能・改良• 設定ファイルの大幅な改善• pgpool.confから他の設定ファイルの読み込みが可能• すべてのパラメータのコメントアウト化• Watchdogに動的クラスタメンバーシップ機能の導入• フェイルオーバの機能強化• 予期しないフェイルオーバを回避• スイッチオーバ• Pgpool-IIの独自の統計情報出力コマンドの改善• コネクションの統計情報の出力• SHOW POOL_NODESの新しいフィールドの追加• PostgreSQL 14のSQLパーサの移植© 2022 SRA OSS, Inc. Japan

11

v4.3新機能: pgpool.confから他の設定ファイルの読み込み• pgpool.confファイルにincludeを書くことができるようになった• pgpool.confファイルを機能ごとに複数の小さなファイルに分割することが可能
watchdog.conf

pgpool.conf...
include = 'watchdog.conf'
include = 'query_cache.conf'

use_watchdog = offhostname0 = ''wd_port0 = 9000
pgpool_port0 = 9999...
query_cache.conf
memory_cache_enabled = off
memqcache_method = 'shmem'...
© 2022 SRA OSS, Inc. Japan

12

v4.3新機能: すべてのパラメータのコメントアウト化• 4.2まで、コメントアウトされているパラメータとコメントアウトされていないパラメータが混在• 4.3以降、すべてのパラメータがコメントアウト化される...
#listen_addresses = 'localhost'# Host name or IP address to listen on:# '*' for all, '' for no TCP/IP connections# (change requires restart)#port = 9999
# Port number# (change requires restart)#socket_dir = '/tmp'# Unix domain socket path
# The Debian package defaults to# /var/run/postgresql# (change requires restart)#reserved_connections = 0# Number of reserved connections.
# Pgpool-II does not accept connections if over# num_init_chidlren - reserved_connections.'© 2022 SRA OSS, Inc. Japan13

スプリットブレインとは• ネットワークの障害によって、Pgpool-II同士が相手と通信できなくなり、お互いがダウンしていると思って、両方ともLeaderになってしまう
Leader

VIP

Watchdog

ノード0
Heartbeat

SQL

IP競合

Leader

VIP

Watchdog

ノード1© 2022 SRA OSS, Inc. Japan14

Watchdogのクォーラムによるスプリットブレイン対策• Pgpool-IIを奇数台(3台以上)用意することによって、多数決で少数派がLeaderになるのを防ぐ
多数決により、ノード2がダウンしていると判断

LeaderSQL

VIP

StandbyWatchdog

Watchdog

ノード0

書き込み

ノード1

StandbyWatchdog

ノード2© 2022 SRA OSS, Inc. Japan

15

問題点
• スプリットブレイン対策• 3台中2台がダウンしている場合、クォーラムが存在しないため、VIPが起動しない• サービスが止まってしまう
Standby

LeaderHeartbeat

Watchdog

Watchdog

ノードID: 0

ノードID: 1

StandbyWatchdog
ノードID: 2© 2022 SRA OSS, Inc. Japan

16

v4.3新機能: 動的クラスタメンバーシップ• メンバーと非メンバーの概念を導入• 動的にクラスタの定義を変えることが可能• 非メンバーであると印をつける• wd_remove_shutdown_nodes• SHUTDOWNノードは直ちに非メンバーであると印を付けられ、クラスタから削除される• wd_lost_node_removal_timeout• LOST状態のwatchdogノードに非メンバーであると印を付けて、クラスタから削除するまでのタイムアウト時間• wd_no_show_node_removal_timeout• クラスタ起動時にノードが現れない(NO-SHOW)場合に、非メンバーであると印を付けるまでのタイムアウト時間

注意点：• 動的クラスタメンバーシップを使うことにより、スプリットブレインが起こるリスクがある• 動的クラスタメンバーシップが必要かどうか慎重に検討することを強く推奨する© 2022 SRA OSS, Inc. Japan

17

v4.3新機能: failover_on_backend_shutdown
接続中のセッションを切断した場合の問題点:
予期しないフェイルオーバが発生してしまう可能性がある
以下①と②の場合は、PostgreSQLが同じエラーコードを送る① クライアントがpgpoolに接続している間に、PostgreSQLが管理者によってシャットダウンされた場合② pg_terminate_backend()またはSIGTERMを使って接続中のセッションを切断した場合
PostgreSQLの障害とみなし、フェイルオーバを引き起こす

SQL

SQL
PID

SELECT
pg_terminate_backend(PID)
kill –SIGTERM PID

エラー

管理者によるpostmasterの停止と同じエラーコードを送る© 2022 SRA OSS, Inc. Japan

PostgreSQLが実際に稼働しているにもかかわらず、フェイルオーバしてしまう18

v4.3新機能: failover_on_backend_shutdown
failover_on_backend_shutdown =off (default)

v4.3~• 管理者によってpostmasterが停止する際に、フェイルオーバの無効化が可能に• デフォルトでは、v4.2までと異なる挙動• 予期しないフェイルオーバを回避したい時に便利• pg_terminate_backend• killコマンド© 2022 SRA OSS, Inc. Japan19

自動フェイルオーバ処理の流れ• Pgpool-IIフェイルオーバ処理の流れ① プライマリで障害が発生/手動でPgpool-IIからプライマリを切り離す（pcp_detach_nodeにより）② 新しいプライマリを選定

プライマリ
ノードID: 0③ 昇格• 生きているデータベースノードの中から一番若いノードIDを選ぶことが多い③ failover_commandを実行• ②で選定されたPostgreSQLノードを昇格させる④ follow_primary_commandを実行• 新しいプライマリからスタンバイをリカバリする② 生きているノード1、2の中から一番若いノードIDを持つ
ノード1を新しいプライマリとして選定© 2022 SRA OSS, Inc. Japan

ノードを指定して昇格させることはできない

新しいプライマリ
ノードID: 1

WAL
スタンバイ
ノードID: 220

v4.3新機能: ノードを指定してスイッチオーバー
pcp_promote_nodeコマンドに新しいオプション:-s, --switchover

V4.3~

プライマリ->スタンバイ
ノードID: 0

ノード2を昇格させる# pcp_promote_node --switchover --node-id=2
スタンバイ
ノードID: 1

WAL© 2022 SRA OSS, Inc. Japan

スタンバイ->プライマリ
ノードID: 2
21

v4.3新機能: SHOW POOL_NODESの新しいフィールドの追加• Pgpool-IIは共有メモリにバックエンドのステータス(status、role)を保存している• Pgpool-IIが管理しているバックエンドのステータスは実際のバックエンドのステータスと一致しない場合がある• 例えば、pcp_detach_nodeにより、バックエンドノードがクラスタから切り離されて、ステータスが「DOWN」になるが、実際は稼働している• 4.3以降、実行時にバックエンドの情報を取得し、表示できるようになった• pg_status: 実際のバックエンドノードのステータス (up/down)• pg_role: 実際のバックエンドノードのロール (primary/standby)
postgres=> show pool_nodes;
node_id | hostname | port | status | lb_weight | role|---------+----------+------+--------+-----------+---------+0| pgpool1 | 5432 | up
| 0.333333 | primary |1| pgpool2 | 5432 | up
| 0.333333 | standby |2| pgpool3 | 5432 | up
| 0.333333 | standby |v4.2~

postgres=> show pool_nodes;
node_id | hostname | port | status | pg_status | lb_weight | role
| pg_role |---------+----------+------+--------+-----------+-----------+---------+---------+0| pgpool1 | 5432 | up
| up
| 0.333333 | primary | primary |1| pgpool2 | 5432 | up
| up
| 0.333333 | standby | standby |2| pgpool3 | 5432 | up
| up
| 0.333333 | standby | standby |v4.3~© 2022 SRA OSS, Inc. Japan

22

v4.3新機能: コネクション統計情報の出力
1. 接続先のデータベース名
child_max_connectionsに到達する前にクライアントがPgpool-IIに接続した回数を知りたいときに役立つ

2. 接続ユーザ名
3. Pgpool-IIプロセスの起動時刻
4. プロセスの利用カウンタ

v4.3~

5. プロトコルのメジャーバージョン
6. プロトコルのマイナーバージョン
7. バックエンドへの接続時刻
client_idle_limitが0でない場合、クライアントが切断されるまでの時間

8. クライアントが最後に接続開始した時刻
9. 接続がidleとなっている時間(秒)

v4.3~

v4.3~

10. クライアントが最後に接続終了した時刻

v4.3~

11. 接続の再利用カウンタ値
12. PostgreSQLバックエンドプロセスのプロセスID
13. フロントエンドが接続中なら1、そうでなければ0プロセスの状態:・Wait for connection
・Execute command・Idle
・Idle in transaction

14. pgpool子プロセスID$ pcp_proc_info –h localhost -p 11001 –P 23493 --verbose
Database: testUsername: postgres
Start time
: 2021-10-21 14:16:00
Client connection count: 1Major: 3Minor: 0
Backend connection time
: 2021-10-21 14:16:16
Client connection time
: 2021-10-21 14:17:25
Client idle duration: 21 (0:39 before client disconnected)
Client disconnection time : 2021-10-21 14:17:23
Pool Counter: 2
Backend PID: 23500
Connected: 1PID: 23493
Backend ID: 0Status: Idle...

15. PostgreSQLバックエンドID
16. プロセスの状態

v4.3~© 2022 SRA OSS, Inc. Japan23

PostgreSQL 14のSQLパーサの移植• Pgpool-IIはSQLパーサを持っている• 複雑なSQLを正確に解析するため• クエリの書き換えを行うため• メジャーリリースを行うたびに、PostgreSQLの最新パーサを移植• Pgpool-II 4.3はPostgreSQL 14のパーサを移植© 2022 SRA OSS, Inc. Japan

24

参考情報
• Pgpool-II Webサイト• https://pgpool.net/• ドキュメント• https://www.pgpool.net/docs/latest/ja/html/• リポジトリ• https://git.postgresql.org/gitweb/?p=pgpool2.git;a=summary• ML• https://pgpool.net/mediawiki/index.php/Mailing_lists• バグ報告⚫

https://www.pgpool.net/mantisbt/© 2022 SRA OSS, Inc. Japan25

ご清聴ありがとうございました。

© 2022 SRA OSS, Inc. Japan

26