6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

はじめに

PgpoolをKubernetesで動かすとそうでない場合と比較して設定が単純になります。
それはKubernetesの機能で賄えるものがあるためです。最近、Pgpoolを学んだこともありこの記事ではその部分について説明したいと思います。

前提:PostgreSQL Operatorを使用する

前提として、以下のような構成のPostgreSQL Operatorを使うものとします。

image.png

引用元: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がクラスタを監視してフェイルオーバーを自動で行ってくれます。
別の構成ですが、日本語で解説されているページを載せておきます。

image.png

引用元:https://recruit.gmo.jp/engineer/jisedai/blog/postgresql12-patroni-cluster/

ServiceがPostgreSQLの負荷分散を補助してくれる

PgpoolにはバックエンドとなるPostgreSQLを1台ずつ定義してどの比重で分散させるか設定します。

KubernetesのServiceを使うと、PostgreSQLのレプリカへのアクセスの負荷分散を行ってくれます。

↓のようなイメージです。
image.png

マスターとレプリカでは役割が違うため、それぞれ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の設定について触れました。基盤が変わると設定も変わるということを思い知りました。
これからも勉強します!

6
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?