Closed3
pgpollとは(概要)
ピン留めされたアイテム
前提となる用語理解
pool(プール)
すぐに使うことになりそうリソースを一時的に溜めておく仕組み
-
接続プール
- データベースやサーバーへの接続をプール化して管理すること。
- 接続の確立と解除に要する時間とリソースを節約し、システムのパフォーマンスを向上させます。
-
スレッドプール
- プログラムやアプリケーションで使用されるスレッドの集合を管理する方法。
- スレッドを事前に作成しプールしておくことで、必要に応じて迅速にアクセスし、リソースの消費を抑える。
-
メモリプール
- メモリ割り当てを効率化するために使われる技術
- 事前に確保したメモリブロックを効率的に管理し、必要に応じてプログラムに割り当てる。
スレーブサーバ(Slave Server)
サーバー(マスターサーバ)のデータや処理を複製または同期させるために使用されるサーバー。
-
レプリケーション
- マスターサーバーからスレーブサーバーへデータをコピーすることで、データのバックアップと冗長性を確保する
- マスターサーバーに障害が発生した場合でも、スレーブサーバーがデータを提供し続けることができます。
-
負荷分散
- 読み取り処理をスレーブサーバーに振り分けることで、マスターサーバーの負荷を軽減させる。
- 全体のシステムパフォーマンスを向上させる。
-
バックアップ
- 定期的にスレーブサーバーにデータを保存することで、データの安全を保つ。
参考
pgpool-IIとは
- pgpool-II(ピージープールツー)は、PostgreSQLに対して、冗長化や負荷分散を可能にするミドルウェア。
→ PostgreSQL用のALBみたいなもの - PostgreSQLサーバとクライアントの間でデータベースプロキシとして稼働し、アプリケーションとPostgreSQLを透過的に中する。
アーキテクチャ
Pgpool-IIは、PostgreSQLのバックエンド・フロントエンドプロトコルを理解し、両者の間でメッセージを転送する機能を備えている。
そのため、データベースアプリケーション(フロントエンド)からは、Pgpool-IIがあたかも実際のPostgreSQLサーバーのように振る舞い、サーバー(バックエンド)からは、Pgpool-IIがフロントエンドとして機能しているように見える。
また、Pgpool-IIはサーバーとクライアントの間で透過的に動作するため、既存のデータベースアプリケーションのソースコードに変更を加えることなく、そのまま利用することが可能。
pgpookの主な機能
- 負荷分散 (Load Balancing)
- 接続プーリング (Connection Pooling)
- レプリケーションの管理 (Replication Management)
- フェイルオーバー管理 (Failover Management)
- オンラインリカバリー (Online Recovery)
- Watchdog
負荷分散 (Load Balancing)
- クエリを複数のデータベースサーバー間で分散する機能
-
backend_weight
でサーバー間の負荷分散比率を設定可能。
pgpool.conf
load_balance_mode = on # 負荷分散を有効化
backend_hostname0 = '192.168.1.1' # マスターサーバーのホスト
backend_port0 = 5432
backend_weight0 = 1 # マスターの重み
backend_hostname1 = '192.168.1.2' # スレーブサーバー1のホスト
backend_port1 = 5432
backend_weight1 = 1 # スレーブの重み
backend_flag1 = 'ALLOW_TO_FAILOVER'
接続プーリング (Connection Pooling)
- アクティブなデータベース接続をプールして再利用する機能
- 接続の確立と解除にかかるオーバーヘッドを削減し、データベースサーバーの負荷を軽減する。
pgpool.conf
connection_cache = on # 接続プーリングを有効化
num_init_children = 32 # プール内の初期接続数
max_pool = 4 # 同じユーザー/データベースの接続を共有する数
レプリケーションの管理 (Replication Management)
- マスターから複数のスレーブへのデータレプリケーションを管理する機能
- データの冗長性が確保され、データベースの障害耐性が向上させる。
- 不整合が起きた場合に自動停止するオプションも設定可能。
pgpool.conf
replication_mode = on # レプリケーションを有効化
replication_stop_on_mismatch = on # マスターとスレーブの不一致時に停止
enable_query_cache = on # クエリキャッシュとの併用も可能
フェイルオーバー管理 (Failover Management)
- データベースサーバーに障害が発生した場合、自動的にフェイルオーバーを行い、別のサーバーへリクエストを切り替える。
-
failover_command
で特定のコマンドも実行可能
pgpool.conf
failover_command = '/usr/local/bin/failover.sh %d %H %P %m %M %D %r' # フェイルオーバースクリプト
failover_on_backend_error = on # 障害発生時にフェイルオーバー
オンラインリカバリー (Online Recovery) の設定
- スレーブサーバーが再接続可能になった際に、クラスターに復帰させる機能。
- フェイルオーバー管理と一緒に使うことで、データベースサーバーの障害発生時に自動的にサーバの切り替え、復旧ができる。
pgpool.conf
recovery_user = 'pgpool' # リカバリ処理を実行するユーザー
recovery_password = 'password' # リカバリユーザーのパスワード
recovery_1st_stage_command = 'basebackup.sh' # 最初のリカバリコマンド
recovery_2nd_stage_command = '' # 必要に応じて2段階目のリカバリ処理を指定
follow_master_command = 'follow_master.sh' # マスター切り替え後の追従スクリプト
クエリキャッシュ (Query Caching)
- データベースへのクエリ結果(SELECT分の結果)をキャッシュする
- 同じクエリが再度実行されたときに、データベースへの負荷を減らし、応答時間を短縮する。
- キャッシュサイズや安全なメモリ量を指定できる
pgpool.conf
enable_query_cache = on # クエリキャッシュを有効化
memory_cache_enabled = on # メモリキャッシュを有効化
query_cache_size = 64MB # クエリキャッシュの最大サイズ
cache_safe_mem = 512KB # 安全に使える最小メモリ
Watchdog
- 複数のPgpool-IIインスタンスを連携させ、可用性を高める機能
- 1つのPgpool-IIインスタンスが停止しても他のPgpool-IIインスタンスが機能を引き継ぐ。
- DB自体ではなく、Pgpool-II自身を冗長化構成にするためのもの。
このスクラップは2024/05/12にクローズされました