pgpool-Ⅱ入門
pgpool-Ⅱとは
アプリケーションと複数のPostgreSQLの間に介在し、 負荷分散や冗長化の機能を提供するOSSのプロキシソフトウェア。
複数のPostgreSQLノードに対して、参照クエリを振り分けなどが可能。
下記の機能を提供する。
- コネクションプール
- 参照負荷分散
- オンメモリクエリキャッシュ
- 自動フェイルオーバー
- オンラインリカバリ
- レプリケーション
レプリケーション
レプリケーションには、PostgreSQLがもともと提供しているレプリケーション機能と、 pgpoolが提供しているレプリケーションの2種類がある。
PostgreSQLのレプリケーション
ストリーミングレプリケーション
プライマリノードのWALを、リアルタイムでスタンバイノードに転送することで、 プライマリとスタンバイのDBの同期を取ることができる。
- WAFの転送と、WAFからの複製処理に時間がかかると同期が遅延する
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を受け付け、レプリケーションを継続。