Streaming Replication搭載のPostgreSQL9.0リリースが近づき、 MySQLとのレプリケーション比較が今後ますます盛んになると思われるので、 MySQLユーザ向けにPostgreSQLの説明をしてみようと思う。
参考->PostgreSQLユーザのためのMySQLバイナリログ・レプリケーション講座
(2012.10.30追記)PostgreSQLのレプリケーションについては書籍にまとめたので参照のこと。
[レベル:1] PostgreSQLのWALログ
PostgreSQLには「WALログ」と呼ばれるREDOログ(トランザクションログ)がある。MySQLでいうところのInnoDBのinnodbログのことである*1。
なぜレプリケーションの説明に"WALログ"がでてくるかといえば、PostgreSQL9.0のレプリケーションでマスタからスレーブに送るデータの正体がWALログだから。MySQLのレプリケーションでマスタがスレーブに送るデータはバイナリログであるが、 PostgreSQLにおいてそのバイナリログに対応するのがWALログなのである。
便宜的だが、MySQLとPostgreSQLの構造と、バイナリログ:SBLとRBL、WALログの出所を描き込んだ図を示す。
WALログそのものについてこちらを参照:WAL(Write Ahead Logging)とは / WALの詳細 / WALの仕組み
[レベル:2] SR = Streaming Replication
PostgreSQLのレプリケーションは、WALログを使ったマスタースレーブ型非同期レプリケーションである。
機能全般についてはこちら: Streaming Replicationの機能
実はStreaming Replicationはその名のとおりデータのレプリケーションしか行わない。スレーブは起動後すぐにリカバリモードに入る。つまりスレーブはWALログ=REDOログを受け取りながら延々とリカバリを続けている状態なのである*2。
リカバリ中でも検索だけはできるようにしたのがHotStanbyという機能で、 Streaming ReplicationとHotStandbyを組み合わせて、やっとMySQLの非同期レプリケーションと同期能になる。
あくまでユーザ目線で、SR+HotStandbyの長所短所を列挙してみよう。
*短所
- データ領域全体をレプリケーション
- DB毎やテーブル毎のレプリケーションができない。これはWALログを使っている以上は避け難い。
カスケード接続ができない- スレーブは実はリカバリ状態なので、現時点ではスレーブにスレーブを数珠つなぎすることはできない。この問題だけなら比較的簡単にクリアできそうだが、version9.1で予定されている同期レプリケーションまで考えると 開発の優先順位は低いだろう。(カスケード接続はバージョン9.2で対応)
*長所
- スレーブをオンラインで自由に追加/削除できる
- MySQLもマスタやスレーブの停止/起動はできるが、あらかじめ設定した数まで自由にスレーブを追加できるのはSRの長所か。
- フェールオーバー用の機構(トリガファイル)がある
- 200m秒くらいの間隔でトリガファイルの有無をチェックし、そのファイルが作成されたら正ちにスレーブはレプリケーションを止めて(リカバリ状態から脱し)、検索+更新可能になる(マスタに昇格するわけではない)。HeartBeatやPeaceMakerのようなHAソフトと組み合わせる場合に有効な機能と思う。まだ、HA構成をどうすべきかノウハウを貯めつつある時期なので、MySQL派の方々もチャレンジしてみては?
歴史
Streaming Replicationの開発が始まった当初、WALログをスレーブに送るという重労働をしたらまともにDBとして動くはずがない、と思っていたのはわたし一人ではないだろう。なにしろ同期レプリケーションを目指していたのだから。
しかし、試作版のベンチマークで10%程度しか性能が劣化しないという報告が出てかなり驚いた。 PostgreSQLの開発コアメンバーたちも一様に驚いた模様で、それまでの開発方針が一転、3年ちかい時間をかけてPostgreSQL9.0に非同期レプリケーションが組み込まれた。
残念ながら同期レプリケーションは間に合わなかったが、verion9.1でのサポートに向けてすでに開発は進んでいる。
驚くべきは、(ギリギリ)20代?の藤井雅雄氏がこの機能をほとんど一人で実装したことである。
[レベル:0] 野良レプリケーション
純正レプリケーションはversion9.0にしてやっとサポートされるわけだが、非純正の野良レプリケーションはかなりの数がある。
昨年、東京でクラスタ会議が開かれて多くのシステムの主要開発者が集まったが、まだまだ収束する気配もない*3。 MySQLのエンジニアが俺様ストレージエンジンを作るように、 PostgreSQLのエンジニアは俺様レプリケーションを作りたがるようだ。
すべてをレビューすることはできないが、使った範囲で簡単に紹介する。
pgpool-II
現状で最も成功普及している(であろう)同期レプリケーションミドルウエア。そろそろver3.0が出る模様。 詳細はこちらを参照:pgpool- II:オンラインリカバリ / pgpool-IIのオンラインリカバリ仕組み
ごく稀に「データ不一致で困った」などの声をきくことがあるが、幸い私はそういった経験はない。しかし、バグが隠れている可能性も否定しきれないわけで、モデル検査という手法で隠れたバグや障害時の挙動を検査しようとしていた。
SPIN(Promela) によるpgpool-IIのモデル検証
まだまだ始めたばかりだが、モデル検査や形式手法による実装はミドルウエアレベルのソフトにこそ使われるべきと思うので、pgpoolに限らずチマチマと進めていきたい。興味のある方はご連絡ください。
ちなみに組込み系ではホットな話題。
Postgres-R
長い歴史があるわりにはまったく知られていないが、こちらもマルチマスタ同期レプリケーション=クラスタ。開発者の論文が表彰されたらしい。
サーベイっぽいけど、Postgres-RでTotal Order Multicastを使ってるところが評価されたのか?英語読めないんでよく分からないけども。