PGClusterは,大きく分けてクラスタサーバ,レプリケーションサーバ,ロードバランサの3つのサーバから構成されます.
このうち,クラスタサーバとレプリケーションサーバがあれば負荷分散は可能です.

ロードバランサーはクラスタサーバに障害が発生した場合,ユーザからの接続を正常なクラスタサーバに振り分けるフェイルオーバーの機能を提供します.

ユーザからDBに対する要求(クエリー)を受け付け,実際に処理を行うサーバです.PostgreSQLのバックエンドがこれに当たります.クラスタサーバの数を増やすことでDBへのアクセス負荷を軽減することができます.クラスタサーバはそれぞれ独立していますが,扱うデータは同じ内容のものです.クラスタサーバを増やしても扱うことのできるデータの容量が増えるわけではありません.クラスタサーバが受け付けたクエリーのうち,データ参照以外のクエリーはレプリケーションサーバに渡し,複製の要求をだします.
クラスタサーバから渡された複製要求(クエリー)を複製して,各クラスタサーバに送るサーバです.データの更新要求はレプリケーションサーバが受け付けた順番でキューイングされ,その順番通りに各クラスタサーバに送ります.クエリーを送った各クラスタサーバからの応答を確認し,「応答がOK」以外のクラスタサーバは「異常」とみなし,クラスタサーバを登録しているテーブルのステータスを変更し,以降のレプリケーションから切り離します.切り離したクラスタサーバの情報はログに書き出します.
トランザクション処理の途中で1台のクラスタサーバに異常が発生した場合,異常のクラスタサーバを切り離してトランザクション処理は続けます.2相コミットを導入して全てのクラスタサーバの処理をRollbackする方法も考えましたが,1台の故障でシステム全体に影響を与えるよりは,故障したサーバを切り離して,処理を継続してシステム全体には影響を与えない方法を選択しました.
また,「異常」として切り離したクラスタサーバをシステムに戻す場合や,新規でクラスタサーバを追加する場合,データの復旧に関わる一連の処理を行います.
(3) ロードバランサ
|
ユーザからのクエリーを受け付け,負荷の比較的低いクラスタサーバを探してクエリーを渡す,セッションを振り分けるサーバです.クラスタサーバの負荷は継続中のセッション数でカウントしています.各クラスタサーバの最大セッション数を最初に登録しておき,継続中のセッション数を最大セッション数で割ることでセッションの使用率が出ますので,これを負荷率とみなして負荷率の低いクラスタサーバに優先してセッションを振り分けるようにしています.
このサーバは無くても負荷分散は可能ですが,フェイルオーバーの機能を利用したい場合にはこのサーバが必要です.ロードバランサとクラスタサーバ間で「接続ができない」,「応答がない」などの異常が発生した場合,接続先を登録しているテーブルのステータスに「異常」をセットします.ユーザからの接続要求は,ステータスが「正常」なクラスタサーバにのみ振り分けますので,「異常」をセットされたクラスタサーバはシステムから切り離されます.クラスタサーバが復旧または追加される場合,レプリケーションサーバと連動して接続先のテーブルを更新または追加します.
|
|