はじめに
PgpoolをKubernetesで動かすとそうでない場合と比較して設定が単純になります。
それはKubernetesの機能で賄えるものがあるためです。最近、Pgpoolを学んだこともありこの記事ではその部分について説明したいと思います。
前提:PostgreSQL Operatorを使用する
前提として、以下のような構成のPostgreSQL Operatorを使うものとします。
引用元:https://www.pgpool.net/docs/pgpool-II-4.3.0/ja/html/example-kubernetes.html
PostgreSQLのレプリケーションはOperatorが行う
PgpoolにはPostgreSQLクラスタを監視して、レプリケーションやフェイルオーバーを行う機能があります。
Kubernetesでは代わりにOperatorが監視してくれます。
PostgreSQL OperatorのPostgreSQLで使用するコンテナイメージはspiloというものが使われており、PostgreSQLとPatroniがバンドルされています。
Patroniがクラスタを監視してフェイルオーバーを自動で行ってくれます。
別の構成ですが、日本語で解説されているページを載せておきます。
引用元:https://recruit.gmo.jp/engineer/jisedai/blog/postgresql12-patroni-cluster/
ServiceがPostgreSQLの負荷分散を補助してくれる
PgpoolにはバックエンドとなるPostgreSQLを1台ずつ定義してどの比重で分散させるか設定します。
KubernetesのServiceを使うと、PostgreSQLのレプリカへのアクセスの負荷分散を行ってくれます。
マスターとレプリカでは役割が違うため、それぞれServiceが分かれています。
Pgpoolは2つのServiceのDNSだけ把握すればよいため、レプリカの台数が増えても設定変更する必要がなくなります。
ServiceはPODについているラベルでバックエンドのターゲットを特定します。
KubernetesでのDNSは以下のように決まります。
ただし、完全に互換になるわけではないと思っています。
クライアントによってはマスターかレプリカの片方に処理が偏るかもしれません。クエリによってどのように分散するか設定したい場合はPgpoolにて設定を行う必要があります。
Pgpool間のハートビートは不要となる
上記の内容から、PgpoolではPostgreSQLのフェイルオーバーを行わないため、Pgpool間のPostgreSQLクラスタの状況共有は不要となります。
PgpoolにはWatchdogという状況共有を行うための仕組みがありますが、Kubernetesで動かす場合にはOFFにします。
代わりにPgpoolをリスタートする機能が必要となりますが、KubernetesのDeploymentやStatefulSetを使うことができます。
Watchdogの動作の説明は以下のページが参考になります。
Watchdogを使用する場合、PgpoolとPostgreSQLそれぞれのスプリットブレインを考慮する必要があります。
WatchdogをOFFにできれば、Pgpool側のスプリットブレインの心配がなくなるメリットがあると思います。
具体的な設定例
以下のページではKubernetesでPgpoolを動かす最低限の設定が以下のように紹介されています。
https://www.pgpool.net/docs/pgpool-II-4.3.0/ja/html/example-kubernetes.html
backend_hostname0 = '<プライマリService名>'
backend_hostname1 = '<レプリカService名>'
backend_port0 = '5432'
backend_port1 = '5432'
backend_flag0 = 'ALWAYS_PRIMARY|DISALLOW_TO_FAILOVER'
backend_flag1 = 'DISALLOW_TO_FAILOVER'
failover_on_backend_error = off
sr_check_period = 10 (ストリーミングレプリケーションチェック機能を利用する場合のみ)
sr_check_user='username of PostgreSQL user' (ストリーミングレプリケーションチェック機能を利用する場合のみ)
load_balance_mode = on
connection_cache = on
listen_addresses = '*'
フェイルオーバーの設定が無効になっていますね。
あとは必要に応じて接続数やメモリなどの設定を加えていくことになります。
おわりに
今回は最近触っているPgpoolの設定について触れました。基盤が変わると設定も変わるということを思い知りました。
これからも勉強します!