PostgreSQL:Streaming Replication [2] 機能

(2012.10.30追記)以下の記述は古くなっています。
最新の情報を書籍にまとめたので参照のこと。


なお、原稿のサンプル仕組み設定を公開したので参照のこと。


レプリケーション

Streaming Replicationは、マスタ側とスレーブ側のデータクラスタの内容を(非同期に) 複製(レプリケート)する機能である。

Streaming Replicationだけでは、スレーブ側で検索ができない。 スレーブ側で検索するのはHot Standbyの機能を使う。

続きはこちら

ver9.0でのStreaming Replicationは非同期である。

データベースクラスタ全体をレプリケーションする。
レプリケーションさせたいデータベースやテーブルを個別に指定することはできない。

構成


  • シングルマスタ(single master)・マルチスレーブ(multi-slave)

マスタ1台に対して複数のスレーブを接続できる。接続できる最大のスレーブ数はマスタのpostgresql.confにmax_wal_sendersに指定する。

  • スレーブは並列接続のみ (カスケード接続:不可)

スレーブはマスタに対して並列にのみ接続できる。スレーブをスレーブに接続するカスケードはできない。

  • 動的にスレーブ追加/削除

マスタのmax_wal_sendersに指定した数までは、どのタイミングであってもスレーブを順次追加できる。追加はスレーブを起動するだけである。
スレーブの削除はサーバをshutdownするだけである。

運用

原則的にどんなSQLでも実行できる。 時刻や乱数やシーケンスなど、レプリケーションで一般的に注意が必要なSQLについて、Streaming Replicationは一切気をつかわずに実行できる。

  • サーバの起動/停止

原則的にmasterもslaveも起動と停止を繰り返しできる。ただし、頻繁に行ったり、 サーバが高負荷のときに停止するのは避けたほうがよい。

  • slaveの削除/追加

特別な操作は不要で、slaveを起動すればmasterに追加され、slaveをshutdownすれば削除される。

slave追加時には、masterのmax_connectionsの値と現在接続している(WEBサーバなど)クライアント数に 注意すること。

「slaveは一般ユーザと同じ扱いでmasterに接続する」ので、 すでにクライアントが(max_connections - superuser_reserved_connections)だけ接続していると、 slaveは接続できない(もちろん、他の一般ユーザも接続できない)。

現時点ではドキュメントなどに接続制限に関する記述がないようなので、注意すること。

  • 動作確認

現在のところ、動作確認を行うコマンドなどはない。 psコマンドでプロセスを表示させる、pg_log以下のログファイルを読むなどするしかない。

# ps ax | grep "postgres: wal receiver"
22748 ?        Ss     0:00 postgres: wal receiver process   streaming 0/4E8B7AC             
#
# ps ax | grep "postgres: wal sender"
22749 ?        Ss     0:00 postgres: wal sender process postgres 127.0.0.1(27532) streaming 0/4E8B7AC

障害対応

  • フェールオーバー

PostgreSQL ver9.0には「trigger_fileを発見したらslaveも更新可能になる」という機能がある。
例えばslaveのrecovery.confファイルに"trigger_file = '/tmp/trigger'"と設定した場合、

# touch /tmp/trigger

とslaveサーバ上で実行すれば、slaveのレプリケーション機能は終了し、更新できるようになる。

あまりに簡単で誰でも実行できてしまうので、 トリガファイルは特定のユーザしか書き込みできないディレクトリを指定しないと危険である。

この機能と、HeartBeatなどmasterサーバの死活監視を行うクラスタソフトを組み合わせれば、 障害発生時にmasterを切り離してslaveを更新可能にするフェールオーバーを実現できる。

ただし、ver9.0は非同期レプリケーションなので、 masterからslaveに送る前にmasterがダウンするとその間のデータをロストする可能性がある。
また、一般的なクラスタソフト(ソフトウエアベースのもの)は 障害検知にある程度の時間が必要[参照:スプリットブレインシンドローム]なので、 フェールオーバーできるからといって障害時にサービスが止まらないわけではない。 もちろん、これはStreaming Replicationだけでなく、マスタースレーブ型レプリケーションと ソフトウエアベースのクラスタリングソフトを組み合わせた場合の宿命である。

  • スイッチオーバー

マスタとスレーブを入れ替える、スイッチオーバーはできない。


全文、もしくはアップデイト板はこちら