様々な解法の比較

PostgreSQL 9.0.0文書
前のページ | 巻戻し | 第 25章高可用性、負荷分散およびレプリケーション | 早送り | 次のページ

# 25.1. 様々な解法の比較

共有ディスクを用いたフェールオーバ

  データベースのコピーを 1つだけ保有すればよいため、共有ディスクを用いたフェールオーバは同期によるオーバーヘッドを回避できます。 本解法では、複数のサーバが単一のディスクアレイを共有します。 主データベースサーバが故障したとき、まるでデータベースの破損から復旧したように、スタンバイサーバが元のデータベースを実装して稼動できます。 このフェールオーバは急速であり、データの消失がありません。

  ハードウェアを共有するという機能は、ネットワーク上の記憶装置に共通のものです。 ネットワークのファイルシステムの利用も可能ですが、そのファイルシステムが POSIX 仕様（各 UNIX 間の互換性の仕様）を満たしているか注意してください。 （ 項17.2.1を見てください）。 本解法には重大な制約があり、共有ディスクアレイが故障または破損したとき、プライマリサーバもスタンバイサーバも機能しなくなります。 また、プライマリサーバが稼動している間は、スタンバイサーバが共有記憶装置にアクセスしてはなりません。

ファイルシステム（ブロックデバイス）レプリケーション

  ハードウェアを共有するという機能の改良版が、ファイルシステムのレプリケーションであり、ファイルシステムにおける全ての変更が別のコンピュータに設置したファイルシステムに反映されます。 制約はただ一つであり、スタンバイサーバがファイルシステムの一貫性のあるコピーを確保するようにミラーリングしなければなりません。 特に、スタンバイサーバへの書き込みは、マスタサーバへの書き込みと同じ次元で行わなければなりません。 Linux におけるDRBDは、ファイルシステムのレプリケーションの一般的な解法です。

ポイントインタイムリカバリ（PITR）を用いたウォームスタンバイおよびホットスタンバイ

  ウォームスタンバイおよびホットスタンバイサーバは、ログ先行書き込み（WAL）のレコードを解読して最新の状態を保持できます。 プライマリサーバが故障したとき、スタンバイサーバがプライマリサーバのほぼ全てのデータを保存して、速やかに新しい主データベースを稼動できます。 本解法は非同期であり、データベース全体だけを範囲として処理できます。

  PITR スタンバイサーバは、ファイル単位のログシッピング（項25.2参照）またはストリーミングレプリケーション（項25.2.5参照）または両者の併用を使用して実装できます。 ホットスタンバイの情報は 項25.5 を参照してください。

によるトリガベースのマスタ・スタンバイレプリケーション

  マスタとスタンバイによるレプリケーションでは、データ更新の全ての問い合わせをマスタサーバに送付します。 マスタサーバは更新したデータを非同期でスタンバイサーバに送付します。 マスタサーバが稼動している間、スタンバイサーバは読み取り問い合わせだけに応答します。 スタンバイサーバはデータウェアハウスへの問い合わせに理想的です。

  この種類のレプリケーションの一例はSlony-Iであり、各々のテーブルが粒度となり、複数のスタンバイサーバが稼動できます。 バッチ処理によってスタンバイサーバのデータを非同期で更新するため、フェールオーバにおけるデータ消失の可能性があります。

文に基づいたレプリケーションのミドルウェア

  文に基づいたレプリケーションのミドルウェアでは、プログラムが全ての SQL 問い合わせを採取して、1つまたは全てのサーバに送付します。 なお、各々のサーバは独立して稼動します。 読み書き問い合わせは全サーバに送付しますが、読み取り問い合わせは作業負荷を分散させるために、1つのサーバだけに送付できます。

  問い合わせを修正しないで送付した場合、関数 `random()` による乱数値と関数 `CURRENT_TIMESTAMP` による現在時刻およびシーケンス値が、サーバごとに異なることがあります。 その理由は、各サーバが独立して稼動しているため、および SQL 問い合わせの送付では、実際に更新した行の識別値を取得できないためです。 これが許容できない場合は、ミドルウェアかアプリケーションにおいて 1つのサーバにこのような問い合わせを送付し、その結果を書き込み問い合わせで使用しなければなりません。 その他の選択肢は従来のマスタとスタンバイによるレプリケーションのオプションを使用するものです。 すなわち、データ更新の問い合わせをマスタサーバだけに送付し 、マスタとスタンバイによるレプリケーションを介してスタンバイサーバに伝達され、ミドルウェアは使用しません。 トランザクションをコミットするか中断するかについても、全サーバが同一となるよう注意しなければなりません。 これには 2相コミット（PREPARE TRANSACTION および COMMIT PREPARED）を使用することになるでしょう。 Pgpool-IIとSequoiaがこのレプリケーションの一例です。

非同期マルチマスタレプリケーション

  ラップトップやリモートマシンのように、通常は接続されていないサーバ間において、データの一貫性を保持することは挑戦的な課題です。 非同期マルチマスタレプリケーションの使用により、全サーバの独立した稼動、およびトランザクションの衝突を識別するための定期的な通信を実現します。 トランザクションの衝突は、利用者および衝突回避法によって解決できるでしょう。 Bucardoはこの種のレプリケーションの一例です。

同期マルチマスタレプリケーション

  同期マルチマスタレプリケーションでは、全てのサーバは書き込み要求を受理できます。 受理サーバは更新したデータを、トランザクションをコミットする前に、他の全サーバへ配布します。 書き込み負荷が重いとき、ロックの掛かり過ぎによる作業効率の低下の原因となりえます。 実際、書き込み効率は単一サーバより悪いことが大半です。 読み取り要求はどのサーバにも送付できます。 通信による負荷を減らすには、共有ディスクが実装されます。 同期マルチマスタレプリケーションは、主に読み取り作業負荷の低減に最適ですが、全てのサーバが書き込み要求を受理できることも大きな利点です。 その利点とは、マスタとスタンバイ間で作業負荷を分けなくてよいこと、および更新データが 1つのサーバから他のサーバに送付されるため、出力が確定しない `random()` 関数などによる問題が起こらないことです。

  PostgreSQL では、この種類のレプリケーションを提供しません。 しかし、PostgreSQL の 2相コミット（PREPARE TRANSACTION および COMMIT PREPARED）を使用すれば、アプリケーションのコードまたはミドルウェアにおいて本解法を実装できます。

商業的な解法

  PostgreSQL はオープンソースであり、容易に拡張できます。 そのため多数の企業が、PostgreSQL を取り入れて商業的な解法を作成し、フェールオーバとレプリケーションと負荷分散の機能を独自に実現していますが、ソースコードは非公開です。

表（表25-1）は、上述した種々の解法の性能を抜粋したものです。

表 25-1. 高可用性、負荷分散およびレプリケーションの特徴

特徴 | 共有ディスクを用いたフェールオーバ | ファイルシステムのレプリケーション | PITR を用いたホットとウォームスタンバイ | マスタとスタンバイによるトリガに基づいたレプリケーション | 文に基づいたレプリケーションのミドルウェア | 非同期マルチマスタレプリケーション | 同期マルチマスタレプリケーション
--- | --- | --- | --- | --- | --- | --- | ---
最も一般的な実装 | NAS | DRBD | PITR | Slony | pgpool-II | Bucardo |
通信方法 | 共有ディスク | ディスクブロック | WAL | テーブル行 | SQL | テーブル行 | テーブル行および行ロック
特別なハードウェアが不要 |  | ○ | ○ | ○ | ○ | ○ | ○
複数のマスタサーバが可能 |  |  |  |  | ○ | ○ | ○
マスタサーバにオーバヘッドがない | ○ |  | ○ |  | ○ |  |
複数のサーバに待機がない | ○ |  | ○ | ○ |  | ○ |
マスタの故障によるデータ損傷がない | ○ | ○ |  |  | ○ |  | ○
スタンバイは読み取り問い合わせだけを受理 |  |  | ホットだけ | ○ | ○ | ○ | ○
テーブルごとの粒度となる |  |  |  | ○ |  | ○ | ○
コンフリクトの回避が不要 | ○ | ○ | ○ | ○ |  |  | ○

上の分類に該当しない解法もあります。

データの分割

  データの分割とは、同じテーブルのデータを複数部分に分けることです。 各部分に書き込むことができるのは、1つのサーバだけです。 例えば、データをロンドンとパリの営業所用に分割でき、サーバをロンドンとパリのどちらにも設置できた状態を考えます。 問い合わせにロンドンとパリのデータが混在した場合、アプリケーションは両方のサーバに問い合わせることができます。 または、マスタスタンバイレプリケーションを使用して、他の営業所のデータを読み取り専用コピーとして保持できます。

複数サーバによる問い合わせの並列実行

  上述した多くの解法は、複数のサーバが複数の問い合わせを処理するものです。 処理速度の向上のために、単一の問い合わせに複数のサーバを使用するものはありません。 本解法は複数のサーバが単一の問い合わせを共同して実行するものです。 その方法は、データをサーバ間で分割し、各サーバが部分的に問い合わせを実行し、各々の結果をプライマリサーバに送付し、プライマリサーバが合体して利用者に返送するものです。 Pgpool-IIはこの性能を持っています。 また、PL/Proxyツールセットを使用して実装できます。

前のページ | ホーム | 次のページ
高可用性、負荷分散およびレプリケーション | 上に戻る | ログシッピングスタンバイサーバ