- ベストアンサー
PostgresのPITRについての質問
- 本番機と待機用のサーバでPostgresのデータを冗長化する際の疑問点について質問があります。
- 本番機のログファイルが16MBになるまで掃き出されないため、本番機が消滅した場合には16MB分のログがなくなる可能性があるのかという疑問です。
- 自作シェルで本番機のログファイルを待機用のサーバへ1分ごとにコピーする場合、archive_commandによる冗長化は必要かどうかを教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
【質問 1】への回答 はい、アーカイブ先のディレクトリに保管されていない WAL ファイル分の更新は消失します。また、更新の頻度が高い場合には 1 つ以上の WAL ファイル分の更新が消失する可能性があります。 なお、WAL ファイルがアーカイブ先のディレクトリに保管されるのはサイズが 16MB になったときではありません。WAL ファイルは最初からデフォルトで 16MB 分のサイズが確保されており、メモリ上の更新がディスクに反映されて不要になった場合 (完了済み WAL ファイルになった場合) にアーカイブ先のディレクトリに保管されます。 【質問 2】への回答 前述のように WAL ファイルのサイズは最初から 16MB であり、完了済み WAL ファイルになっていない状態で保管しても、正常に復旧できない可能性があります。 WAL ファイルを強制的にアーカイブ先のディレクトリに保管する方法がいくつかあります。 1 つは以下のように pg_switch_xlog 関数を実行することです。 =# SELECT pg_switch_xlog(); もう 1 つは archive_timeout パラメータを設定することです。前回 WAL ファイルがアーカイブ先のディレクトリに保管されてから archive_timeout パラメータに指定した時間を経過するとアーカイブ先のディレクトリへの保管が強制的に行われます。ただ、WAL ファイルのサイズは 16MB に固定されているため、あまりに短い時間を指定してしまうとディスク容量を圧迫してしまいます。 いずれにしても PITR (ウォームスタンバイ) では WAL ファイルがアーカイブ先のディレクトリに保管されるのは非同期なので更新が消失することは回避できません。 9.0 で追加されたストリーミングレプリケーションを使用すれば、16MB の WAL ファイル単位ではなく WAL レコード単位でデータを同期できるので、消失する更新はより少なくなります。とは言え、ストリーミングレプリケーションも非同期なので更新が消失することは回避できません。 更新の消失を回避するには、pgpool-II などの同期レプリケーションのミドルウェアを使用するか、現在、開発中の 9.1 で追加される同期のストリーミングレプリケーションを使用する必要があります。
その他の回答 (1)
- yamada59
- ベストアンサー率74% (29/39)
【No.1 の回答へのお礼での質問】への回答 メモリ上のすべての更新をディスクに反映する処理のことをチェックポイント処理と呼びます。チェックポイント処理は、完了済み WAL ファイルが checkpoint_segments パラメータに指定された個数を超えたとき、または、前回のチェックポイント処理の実行から checkpoint_timeout パラメータに指定された時間を過ぎたときに実行されます。 ただ、チェックポイント処理ですべての更新を一気に反映すると、一時的にディスク I/O への高負荷が発生してしまうので、チェックポイント処理とは別に少しずつディスクに反映させる writer プロセスが動作しています。 また、チェックポイント処理は CHECKPOINT コマンドで手動で実行することもできます。 ディスクに未反映の更新がメモリ上に存在しており、チェックポイント処理が実行されていない場合には、完了済み WAL ファイルとなっておらず、アーカイブ先のディレクトリに保管されません。従って、アーカイブ先のディレクトリに保管する前の WAL ファイルが消失した場合には、その WAL ファイル分の更新は復旧することができません。
お礼
詳しくありがとうございました。 おかげで疑問が解決しました。 (ベストアンサーは最初の回答の方にいれておきます)
お礼
詳しく説明いただきまして、ありがとうございます。 おかげで、わからなかった事がほとんど、理解できたのですが、1点だけ質問があります。 WAL ファイルがアーカイブ先のディレクトリに保管されるタイミングですが、 >メモリ上の更新がディスクに反映されて不要になった場合 とありますが、ディスクに反映されるのは、どのくらいの量(単位、頻度)なのでしょうか? たとえば、メモリ上の更新が100MBあり、これがディスクに反映されたとすると、 16MB分のアーカイブログがたくさん出来るのかと想像します。 とすると、ディスクに反映されないうちは、この100MB分が消失すると思われますが、 どうでしょうか? すみません、わかりづらくなってしまいましたが、 知りたいのはメモリ上の更新がディスクに反映されるタイミングです。