1.レプリケーションとは
2007.2.12 株式会社四次元データ 宮澤了祐・内田康介
- 1.1. レプリケーションとは
- 1.2. pgpool-II
- 1.3. PGCluster
- 1.4. PostgresForest
- 1.5. ウォームスタンバイ
- 1.6. まとめ
1.1. レプリケーションとは
レプリケーションとは、同じ内容のデータベース(複製=レプリカ)を作成することで負荷分散や耐障害性を高める技術です。 同期でレプリケーションを行うものと、非同期で行うものの二種に分かれます。
非同期方式は、マスタのデータベースに対しての更新情報を保存し、後でスレーブのデータベースに更新情報を送信しレプリケーションを行うといった方法を用います。 性能劣化が少ないという利点がありますが、データが完全に一致しない時間が存在するというデメリットもあります。
同期方式は、マスタに送信された更新情報をなんらかの方法でスレーブに送信し、同時に更新作業を行います。 データが一致するというメリットはありますが、両者でのデータ更新が終わって初めて更新作業が終了するため性能劣化が起こるというデメリットがあります。
ここでは同期方式のレプリケーションを採用した「pgpool-II」「pgcluster」「PostgresForest」の三種のレプリケーションシステムの機能を比較していきます。 また、PostgreSQL8.2から正式採用された非同期方式のレプリケーションである「ウォームスタンバイ」機能についてもご紹介します。
1.2. pgpool-II
pgpool-IIはpgpoolの後継プロジェクトとしてSRA OSS Inc,日本支社によって開発された同期方式のレプリケーションシステムです。 現在は、pgpool Global Developmentにて開発が行われています。 PostgreSQLクライアントとPostgreSQLサーバの仲立ちとして動作しており、 pgpoolから採用されている複数のノードに対してレプリケートを行うレプリケーション機能や、 pgpool-IIから新たに採用されたデータを複数のサーバに分散させることによって処理能力の向上を行うパラレルクエリ機能があります。
レプリケーションモードでは、更新系のクエリであれば両者に対して同じクエリを投げかけます。 クエリベースのレプリケーションなため、乱数など同じ値が帰ってくることが保障出来ないクエリをレプリケートすることは出来ません。 また、レプリケーションモードでも負荷分散機能を使用することができるため、検索系のクエリを高速化する目的で使用することも出来ます。
パラレルクエリモードでは、データを複数のノードに分散して格納することにより、検索クエリの処理が高速になります。 データを分散する際のルールは、ユーザ自身が設定することになります。 1ノードでも性能が十分な規模であった場合にパラレルクエリを使用すると、使用することによるオーバヘッドの方が大きくなってしまいます。
レプリケーションモードとパラレルモードを同時に使用することはできませんが、パラレルモードで動作しているpgpool-IIの下に レプリケーションモードで動作しているpgpool-IIを複数接続することにより、双方の機能を同時に利用することもできます。
既に動作しているPostgreSQLのインスタンスに対して動作するので、導入は非常に容易です。
1.3. PGCluster
PGClusterは三谷篤氏によってPostgreSQLベースに開発され、現在ではpgFoundryによって開発が進んでいる同期方式のレプリケーションシステムです。 マルチマスタ方式を採用しており、複数のデータベース間で遅延の無い同期が可能です。
負荷分散を行うロードバランサ、レプリケーションを行うレプリケーションサーバ、クラスタDBの三種で構成されています。 それら全てを冗長化することが出来るなど、耐障害性も高い設計となっています。ロードバランサを使用せずにマスタスレーブ方式でシステム構築を行うことも出来ます。
PostgreSQLをベースにして作成しているため、PGClusterのバージョンによって動作するPostgreSQLのバージョンも変動していきます。 また、ロードバランサ、レプリケーションサーバ、クラスタDBの全てに対して適切に設定ファイルを記述する必要があり、導入は若干難しくなっています。
なお、現在各データベースノードでディスクを共有する方式を採用した PGCluster-IIが開発中であり、これによって更新系の処理能力の向上などが 見込まれています。
1.4. PostgresForest
PostgresForestは株式会社NTTデータによって開発されている同期方式のレプリケーションシステムです。 レプリケーションの機能だけでなく、1つのテーブルを物理的に複数のファイルに分割配置することの出来るパーティション機能を持ちます。 マルチマスタ方式を採用しています。
PostgresForestはJDBCドライバとして振る舞います。そのため、クライアントサイドでのプログラムの変更は少なくてすみます。 しかし、クライアントサイドはJavaに限られてしまいます。
システムの設定はコンフィグファイルではなく、環境構築ツールを用いてデータベース内に記録します。
1.5. ウォームスタンバイ
ウォームスタンバイはPostgreSQL8.2から採用されたアクティブ・スタンバイ構成による非同期方式のレプリケーション機能です。 アクティブ側のアーカイブログをスタンバイ側に転送し、スタンバイ側で転送されてきたアーカイブログを定期的に適用するという形でレプリケーションを実現しています。
スタンバイ側はリカバリモードで起動している為、アクティブ側から切り替わるまではアプリケーションからのアクセスが出来ませんので、 負荷分散に利用する事は出来ません。
なお、これは標準機能ですので、別途何かをインストールする必要はなく、 PostgreSQL本体のみのインストールで実現可能です。
1.6. まとめ
PostgreSQLのバージョンと各レプリケーションシステムのバージョンの対応表です。
バージョン | pgpool-II | PGCluster | PostgresForest | ウォームスタンバイ | |
---|---|---|---|---|---|
7.3 | △(パラレルクエリモード以外) | 1.0 | 1.0以上 | × | |
7.4 | ○ | 1.1 | 2.1以上 | × | |
8.0 | ○ | 1.3 | 3.0以上 | × | |
8.1 | ○ | 1.5 | 3.2以上 | △ | |
8.2 | ○ | 1.7 | ? | 〇 |
pgpool-IIは、パラレルクエリモードのみ7.4以降となります(他のモードは6.4以降)。
PGClusterを使用する場合はPostgreSQLのバージョンに注意する必要があります。
PostgresForestは8.1まで正式に対応しています。
ウォームスタンバイは8.2から採用された機能ですが、8.1でも同じような機能を実現できると思われます。 しかし、8.1ではアーカイブログの生成間隔を設定できないためデータの欠落が多くなってしまいます。
pgpool-II | PGCluster | PostgresForest | ウォームスタンバイ | |
---|---|---|---|---|
レプリケーション | ○ | ○ | ○ | ○ |
負荷分散 | ○ | ○ | ○ | × |
冗長化 | クラスタDB:128台(再コンパイルで増やすことも可能) 本体の冗長化は出来ない |
いくつでも | いくつでも | 2台 |
言語 | 何でもOK | 何でもOK | Javaのみ | 何でもOK |
管理機能 | 管理ツール | 設定ファイル (cluster.conf、pgreplicate.conf、pglb.conf) |
環境構築ツール | 設定ファイル (postgresql.conf、recovery.conf) |