MySQLユーザのためのPostgreSQL:WALログとレプリケーション講座

Streaming Replication搭載のPostgreSQL9.0リリースが近づき、 MySQLとのレプリケーション比較が今後ますます盛んになると思われるので、 MySQLユーザ向けにPostgreSQLの説明をしてみようと思う。

参考->PostgreSQLユーザのためのMySQLバイナリログ・レプリケーション講座

(2012.10.30追記)PostgreSQLレプリケーションについては書籍にまとめたので参照のこと。




原稿のサンプル:仕組み設定を公開したので参照。

[レベル:1] PostgreSQLのWALログ

PostgreSQLには「WALログ」と呼ばれるREDOログ(トランザクションログ)がある。MySQLでいうところのInnoDBinnodbログのことである*1

なぜレプリケーションの説明に"WALログ"がでてくるかといえば、PostgreSQL9.0のレプリケーションでマスタからスレーブに送るデータの正体がWALログだから。MySQLレプリケーションでマスタがスレーブに送るデータはバイナリログであるが、 PostgreSQLにおいてそのバイナリログに対応するのがWALログなのである。

便宜的だが、MySQLPostgreSQLの構造と、バイナリログ: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派の方々もチャレンジしてみては?


PostrgreSQLのSRを試すにはこちら: クイックスタート
動作原理をしっかり知りたい場合はこちら:仕組み

歴史

Streaming Replicationの開発が始まった当初、WALログをスレーブに送るという重労働をしたらまともにDBとして動くはずがない、と思っていたのはわたし一人ではないだろう。なにしろ同期レプリケーションを目指していたのだから。
しかし、試作版のベンチマークで10%程度しか性能が劣化しないという報告が出てかなり驚いた。 PostgreSQLの開発コアメンバーたちも一様に驚いた模様で、それまでの開発方針が一転、3年ちかい時間をかけてPostgreSQL9.0に非同期レプリケーションが組み込まれた。
残念ながら同期レプリケーションは間に合わなかったが、verion9.1でのサポートに向けてすでに開発は進んでいる。
驚くべきは、(ギリギリ)20代?の藤井雅雄氏がこの機能をほとんど一人で実装したことである。

[レベル:0] 野良レプリケーション

純正レプリケーションはversion9.0にしてやっとサポートされるわけだが、非純正の野良レプリケーションはかなりの数がある。
昨年、東京でクラスタ会議が開かれて多くのシステムの主要開発者が集まったが、まだまだ収束する気配もない*3MySQLのエンジニアが俺様ストレージエンジンを作るように、 PostgreSQLのエンジニアは俺様レプリケーションを作りたがるようだ。

すべてをレビューすることはできないが、使った範囲で簡単に紹介する。

pgpool-II

現状で最も成功普及している(であろう)同期レプリケーションミドルウエア。そろそろver3.0が出る模様。 詳細はこちらを参照:pgpool- II:オンラインリカバリ / pgpool-IIのオンラインリカバリ仕組み


ごく稀に「データ不一致で困った」などの声をきくことがあるが、幸い私はそういった経験はない。しかし、バグが隠れている可能性も否定しきれないわけで、モデル検査という手法で隠れたバグや障害時の挙動を検査しようとしていた。
SPIN(Promela) によるpgpool-IIのモデル検証

まだまだ始めたばかりだが、モデル検査や形式手法による実装はミドルウエアレベルのソフトにこそ使われるべきと思うので、pgpoolに限らずチマチマと進めていきたい。興味のある方はご連絡ください。
ちなみに組込み系ではホットな話題。

Slony-I

トリガベースのマスタ-スレーブ非同期レプリケーション。フェールオーバ、スイッチオーバなど多機能だが、 (技術でなく)開発陣が煮詰まっているように感じる。詳細はこちら

Bucardo

期待の星。トリガベースなのにマルチマスタ構成可能(非同期)。稼働実績もそこそこあり、安定している模様。 Slony-IはやめてSelena嬢イチオシのBucardoへ。

Postgres-XC

マルチマスタ同期レプリケーションクラスタのニューカマー*4。クイックスタートはこちら

Postgres-R

長い歴史があるわりにはまったく知られていないが、こちらもマルチマスタ同期レプリケーションクラスタ。開発者の論文が表彰されたらしい。
サーベイっぽいけど、Postgres-RでTotal Order Multicastを使ってるところが評価されたのか?英語読めないんでよく分からないけども。

*1:WALとはWriteAheadLoggingの略で、本来はログのロギング方式名であるが、PostgreSQLではREDOログの固有名詞として使う場合が多い。

*2:WALログ=REDOログを当てつづけるのだから当然なのだが初めて知ったときにはちょっと衝撃。

*3:そもそも開発統合を呼びかけた主催者が新しいクラスタを発表するというネタのような展開に

*4:あまり積極的に触る人がいないが、私個人は気に入っていてGTMをJavaで再実装したりと、中身を研究している