dポイントプレゼントキャンペーン実施中!

ちょっとタイトルとはズレているかもしれませんが、
Postgresのデータを冗長化する上での質問です。

サーバが2台あり、1台を本番機とし、もう1台を待機用とします。
本番機にarchive_commandで待機用のサーバのディレクトリを設定します。

【質問1】
ログファイルが貯まっていくと思いますが、
こちらはログが16MBになるまで掃き出されないのでしょうか?
その場合、本番機が消滅した場合、16MB分のログがなくなる可能性があるという事でしょうか?

【質問2】
前提:本番機のログファイルを自作シェルで待機用のサーバへコピーします。この間隔を1分にします。

上記の場合、最悪1分以内のデータまで冗長化されると思います。
1分以内にログが16MB以上貯まるようなシステムでなければ、archive_commandによる冗長化は
必要ないのではないでしょうか?

必要性があれば、教えてください。

Postgresのバージョンは8.3.x でお願いいたします。

A 回答 (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 で追加される同期のストリーミングレプリケーションを使用する必要があります。
    • good
    • 0
この回答へのお礼

詳しく説明いただきまして、ありがとうございます。
おかげで、わからなかった事がほとんど、理解できたのですが、1点だけ質問があります。

WAL ファイルがアーカイブ先のディレクトリに保管されるタイミングですが、

>メモリ上の更新がディスクに反映されて不要になった場合

とありますが、ディスクに反映されるのは、どのくらいの量(単位、頻度)なのでしょうか?
たとえば、メモリ上の更新が100MBあり、これがディスクに反映されたとすると、
16MB分のアーカイブログがたくさん出来るのかと想像します。

とすると、ディスクに反映されないうちは、この100MB分が消失すると思われますが、
どうでしょうか?

すみません、わかりづらくなってしまいましたが、
知りたいのはメモリ上の更新がディスクに反映されるタイミングです。

お礼日時:2011/07/12 19:11

【No.1 の回答へのお礼での質問】への回答



メモリ上のすべての更新をディスクに反映する処理のことをチェックポイント処理と呼びます。チェックポイント処理は、完了済み WAL ファイルが checkpoint_segments パラメータに指定された個数を超えたとき、または、前回のチェックポイント処理の実行から checkpoint_timeout パラメータに指定された時間を過ぎたときに実行されます。

ただ、チェックポイント処理ですべての更新を一気に反映すると、一時的にディスク I/O への高負荷が発生してしまうので、チェックポイント処理とは別に少しずつディスクに反映させる writer プロセスが動作しています。

また、チェックポイント処理は CHECKPOINT コマンドで手動で実行することもできます。

ディスクに未反映の更新がメモリ上に存在しており、チェックポイント処理が実行されていない場合には、完了済み WAL ファイルとなっておらず、アーカイブ先のディレクトリに保管されません。従って、アーカイブ先のディレクトリに保管する前の WAL ファイルが消失した場合には、その WAL ファイル分の更新は復旧することができません。

参考URL:http://www.postgresql.jp/document/9.0/html/wal-c …
    • good
    • 0
この回答へのお礼

詳しくありがとうございました。
おかげで疑問が解決しました。

(ベストアンサーは最初の回答の方にいれておきます)

お礼日時:2011/07/14 11:11

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す