pgpool-Ⅱ入門

pgpool-Ⅱとは

アプリケーションと複数のPostgreSQLの間に介在し、 負荷分散や冗長化の機能を提供するOSSのプロキシソフトウェア。

複数のPostgreSQLノードに対して、参照クエリを振り分けなどが可能。

下記の機能を提供する。

  • コネクションプール
  • 参照負荷分散
  • オンメモリクエリキャッシュ
  • 自動フェイルオーバー
  • オンラインリカバリ
  • レプリケーション

レプリケーション

レプリケーションには、PostgreSQLがもともと提供しているレプリケーション機能と、 pgpoolが提供しているレプリケーションの2種類がある。

PostgreSQLのレプリケーション

ストリーミングレプリケーション

プライマリノードのWALを、リアルタイムでスタンバイノードに転送することで、 プライマリとスタンバイのDBの同期を取ることができる。

  • WAFの転送と、WAFからの複製処理に時間がかかると同期が遅延する

https://www.fujitsu.com/jp/products/software/resources/feature-stories/streaming-replication1/?postgresql-inside


pgpool-Ⅱのレプリケーション

ネイティブレプリケーション

更新クエリを全てのサーバに送信してレプリケーションを行う。

  • 同期遅延なし
  • 更新性能が50%に落ちる

フェイルオーバー

pgpool-ⅡがPostgreSQLを定期的に監視し、ダウンしたノードは自動的に切り離される

  • ノードがダウンした場合の処理はshell script形式で記述する。

オンラインリカバリ

サービスを止めずに停止したノードを復帰させる機能。 マスタのバックアップから、リカバリする。

https://www.pgpool.net/docs/latest/ja/html/example-cluster.html https://www.sraoss.co.jp/prod_serv/support/cluster_option.php https://www.obci.jp/wp-content/uploads/2016/08/TIS_PostgreSQL.pdf


用語

データベースクラスタ

DBサーバ内のにあるDBの集合体、およびDBのディスク上の保存領域を示す。 データベースクラスタのスナップショットは「ベースバックアップ」と言われる。

WAL(Write Ahead Log)

DBに対して更新を実施する前に、作成される更新内容を記録したトランザクションログ。

WALのログを利用することで、DBの複製が可能。

WALログは、postgresのデータディレクトリ以下のpg_xlogディレクトリに、000000010000000000000000から始まるファイルとして配置される。

https://www.postgresql.jp/document/9.4/html/continuous-archiving.html

アーカイブログ

WALのバックアップファイルを示す。 PostgreSQLの設定ファイルで指定した特定の条件を満たすと、WALファイルはログの切り替え(ログローテーション)を行う。 切り替え後の古いログはアーカイブログとして別ファイルに保存される。 アーカイブログの保存先は設定パラメータarchive_commandに指定する。

PITR(Point In Time Recovery)

特定の時点のDBをリストアする機能。

特定の時点でのデータベースクラスタと、アーカイブログを使って、DBを再構築する機能

タイムラインID

タイムラインIDはPoint In Time Recovery(PITR)を実現するためのWALの履歴を記録する仕組み。 タイムラインIDは、「00000001」、「00000002」のようにWALファイル名の一部分に含まれている。 PITRが実行されると、復旧後の新たに記録されるWALと識別するために、タイムラインIDがインクリメントされる。

また、PostgreSQLでは、マスター昇格した際にタイムラインIDがインクリメントされる仕様になっている。 PostgreSQL 9.3のデフォルト設定では、 スレーブが新しいタイムラインIDをもつWALを受け付けずにレプリケーションが停止してしまう。

ただし、recovery.confファイルに、recovery_target_timeline = ’latest’を設定した状態でレプリケーションしている場合、 スレーブは新しいタイムラインIDを受け付け、レプリケーションを継続。

https://mackerel.io/ja/blog/entry/2017/08/15/113803