Hatena::Grouppostgresql

PostgreSQL 雑記 このページをアンテナに追加 RSSフィード

2009-12-19Hot Standby が採用! このエントリーを含むブックマーク このエントリーのブックマークコメント

Hot Standby が採用され、PostgreSQL 8.5 Alpha 3 がリリースされました。

postgresql.conf にて recovery_connections = on (default) を指定してアーカイブ・リカバリを開始すると、リカバリ中に接続を受け付けるようになります。正確には、まず最低限の一貫性を保障できる状態まで接続を受け付けない状態で REDO を行い、それ以降は接続を許可して MVCC を満たすよう REDO を行います。リカバリ中の接続では参照のみ許可されています。もし REDO 処理とロック競合が発生した場合には、max_standby_delay の時間だけ待機した後、参照処理を強制的にロールバックします。

「参照クエリ」に含まれない処理に、一時テーブルの作成、シーケンス操作、LISTEN/NOTIFY が含まれることに注意が必要かもしれません(ソート用の一時ファイルは可)。また、統計情報 (pg_stat*) やサーバログは問題なく更新されます。pg_stat_statements も利用できます ― オンメモリ操作だけで実装したのは、結果的に良かったかもしれません。

また、スタンバイ側で時間のかかるトランザクションを行う場合は注意が必要です。PostgreSQL は追加型なので、基本的には残されている過去のデータを自由に参照できるのですが、VACUUM や HOT ではデータが実際に削除されてしまいます。この場合、シングルユーザの集計処理では上記 max_standby_delay を長くするのが適しているでしょう。一方、オンライン処理で遅延を抑えたい場合には、遅延が頻発するのは望ましくありません。代わりに、アクティブ側で vacuum_defer_cleanup_age を設定して、VACUUM が削除するまで若干遅延させるのが良いと思われます。

まだ Streaming Replication は採用されていないので、Hot Standby はこれまでの Warm Standby の延長で使うことになります。アーカイブログの継続的な適用には pg_standby が使えます。また、参照・更新クエリの振り分けは、たぶん pgpool の master-slave モードが利用できると思われます。pgpool + Slony-I 構成の、Slony-I の部分を Hot Standby に置き換える形になります。