私たちは多くのLinux VMをvmware /共有ストレージ環境で実行しており、それぞれが独自のpostgreSQLインスタンス(9.0と9.3の混合)を実行しています。現在、VMは単一のルートパーティション/ボリューム上にあり、バックアップ/復元プロセスに基盤となるVMFSボリュームのストレージベースのスナップショットを使用して(〜8年)大きな成功を収めています。 (そして私たちのDRサイトへの複製)。
ストレージのアーキテクチャにより、postgres WALファイルをキャッシュされていない、ほぼ書き込みボリュームに分離して、ストレージ側でのキャッシュチャーンを減らすことができます。ストレージ(Nimble Storage)を使用すると、両方のボリュームを単一の保護/スナップショットグループに割り当てることができますが、スナップショットが保護グループ内のすべてのボリュームで正確に同時に発生することをベンダーから引き出すことができませんでした-可能性は高いですが、ミリ秒単位で離れている可能性は常にあります。
そのために、pg_benchを使用して可能な限り高速にデータをDBに書き込みながら、いくつかの実験を行いました。実験後、スナップショットのボリュームを復元し、VM + postgresを起動しました
そのため、両方のスナップショットがボリュームレベルで一貫しており、比較的近い距離にある限り、WAL /ログボリュームのスナップショットの時間に基づいて、DBの一貫したコピーが得られます。
私の質問:これは安全ですか?テストで欠落している主なケースは何ですか?何が問題になる可能性がありますか?
Postgresのドキュメントはこれが安全ではないことを示していますが、テストはかなり堅牢であることを示しているようです: http://www.postgresql.org/docs/9.1/static/backup-file.html
データベースが複数のファイルシステムに分散している場合、すべてのボリュームの正確に同時に凍結されたスナップショットを取得する方法がない場合があります。たとえば、データファイルとWALログが異なるディスク上にある場合、またはテーブルスペースが異なるファイルシステム上にある場合、スナップショットは同時でなければならないため、スナップショットバックアップを使用できない場合があります。このような状況でコンシステントスナップショット手法を信頼する前に、ファイルシステムのドキュメントをよく読んでください。
注:はい、PostgreSQLをホットバックアップモードにしたり、ストレージのVMware統合を使用してVM自体を静止したりするなど、一貫性を確保する他のオプションについては知っていますが、スピードと利便性のためにストレージのみのソリューションを探しています。クライアントへの影響はゼロです。
あなたが引用したドキュメントはそれをすべて述べていますが、同時に撮られたスナップショットに関するベンダーの主張を検証したいのなら、私はあなたを責めません。おそらく何かを明らかにする方法は、 WALシステム のストレステストをより具体的に行うことかもしれません。
例えばpgbenchベースのテストに加えて、ランダムな呼び出しをpg_switch_xlog()
に追加して、ログのローテーションを強制し、チェックポイント間隔を短くしたり長くしたり(checkpoint_timeout
およびcheckpoint_timeout
)と、小さいまたは大きいwalファイルサイズを使用します。
不足しているものがない限り、スナップショットが同時に取得されなかったため、回復したDBは少しラッキーなタイミングに起因すると考えています。最後のケースでは、現在のxlogの場所が0/A1C0FFEE
。次に、システムに特に重い負荷が3分間かかります。これにより、WALファイル全体が循環し、DBが0/DEADBEEF
データのスナップショットが作成されたとき。復元しようとすると、データスナップショットの時点で書き込まれていたWALファイルがなくなっており、リカバリが失敗します。