確立されたレプリケーションが失敗しました(「要求されたWALセグメントはすでにダウンタイム中に削除されています」)マスターを再び簡単に停止することはできません。
できますか
pg_start_backup()
、rsync ${PGDATA}/
_マスターからスレーブ、pg_stop_backup()
...マスターpostgresqlがまだフルロードの状態ですか? (またはpg_start_backup()
は
言い換えると、pg_start_backup()
はアプリケーションに影響を与えますか?
pg_start_backup
は、dezsoが指摘するように、チェックポイントを実行します。これは影響を与えますが、データベースはとにかく非常に定期的にチェックポイントを実行し、機能するためにはチェックポイントを実行する必要があるため、明らかに問題ではありません。初期のチェックポイントとは、蓄積されるデータが少ないことを意味します。つまり、pg_start_backup
からのチェックポイントの影響は、通常よりも低くなります。
心配する必要があるのは、rsyncまたは同等の pg_basebackup
ステップです。これからの読み取りI/Oはシーケンシャルであるため、それほど悪くはありませんが、おそらくデータベースのI/Oパフォーマンスを大幅に低下させ、ホットデータをRAMキャッシュは使用頻度の低いデータを優先し、必要なデータが再度読み込まれるときにキャッシュのスラッシングを引き起こします。
Nice
とionice
を使用して、I/Oの影響を制限することができます(キャッシュへの影響は除く)。ただし、それにはコストがかかります。バックアップにはさらに時間がかかり、バックアップが完了してpg_stop_backup
を実行するまで、システムは-私が理解しているように-WALを蓄積し、削除できず、バックアップ実行の最後にBIGチェックポイントのチェックポイント負債を蓄積します。デッドローをクリーンアップできないため、テーブルとインデックスの膨張を蓄積しています。したがって、特にチャーンテーブルが非常に多い場合は、バックアップを永久に実行する余裕はありません。
結局、環境内のホットバックアップにpg_start_backup
とpg_stop_backup
を安全に使用できるかどうかを判断するのは困難です。ほとんどの人は可能ですが、ハードウェアができることのエッジに近く、タイミング要件が厳しく、ストールのリスクを負えず、チャーンテーブルが非常に大きく、テーブルが非常に大きい場合、問題が発生する可能性があります。 。
残念ながら、それをテストして確認する必要があります。
可能であれば、CHECKPOINT
を発行してから、LVM、SANのツール、EBSなどを使用する代わりに、データベースが存在するボリュームのアトミックスナップショットを取得することをお勧めします。これができれば、自由にスナップショットをコピーできます。このアプローチは、PITR /ウォームスタンバイ/ホットスタンバイのベースバックアップを作成するのには適していませんが、静的バックアップコピーには完全に適しているため、システムへの影響ははるかに小さくなります。ただし、スナップショットがアトミックで、WALを含むデータベース全体が単一のボリューム上にある場合にのみ、これを行うことができます。
私がまだ調査していない可能性の1つは、2つのアプローチを組み合わせることです。おそらく(unestedとおそらくが間違っていて安全ではない )、まだわかりません):
pg_start_backup
pg_stop_backup
pg_stop_backup
から最終アーカイブまでコピーします基本的に、アイデアは、自由にコピーできる各ボリュームの特定の時点を取得することにより、DBがチェックポイントを遅延させる必要がある時間を短縮することです。
これは墓掘りですが、ここで何か修正する必要があります。
以前の答えは述べています:
Niceとioniceを使用して、I/Oへの影響を制限することができます(キャッシュへの影響は除く)。ただし、それにはコストがかかります。 バックアップには時間がかかり、バックアップが完了してpg_stop_backupを実行するまで、システムは-私が理解しているように-WALを蓄積し、削除できず、最後にBIGチェックポイントのチェックポイント負債を蓄積しますバックアップの実行は、デッド行をクリーンアップできないため、テーブルとインデックスの膨張を累積しています。したがって、特にチャーンテーブルが非常に多い場合は、バックアップを永久に実行する余裕はありません。
それは真実ではない。システムは、設定に記載されているWALの数を維持します(cf オンラインドキュメント )。したがって、基本的には、次の値の方が高くなります。
このケースを想像してみましょう:
次に、「pg_start_backup()」を開始した後、バックアップ中にWALファイルがローテーションします。バックアップが完了したら、別のデータベースエンジンで復元を試みます。起動時にエンジンは、「pg_start_backup()」を発行したときに生成されたWALファイルを少なくとも要求します。
pg_start_backup
-----------------
B/D0020F18
(1 row)
WALファイル "0000000x0000000B000000D0"(xはあなたの TimelineID )を指定するまで、データベースは起動を受け入れません。このWALファイルは、システムが起動するための最低限のファイルです。もちろん、このファイルだけでは、残りのデータは所有していないWALファイルにあるため、データは失われますが、少なくともデータベースエンジンは機能します。
したがって、WALアーカイブを行うか、必要なWALファイルを自分で保存する必要がありますが、Postgresqlはそれを行いません。
私のPostgreSQLの経験については、その瞬間にパフォーマンスに大きな影響がない限り、比較的安全な操作です。それがある場合は、すべてのクライアントからの書き込みを一時停止することをお勧めします。
負荷のかかった状態でマスターをスレーブに同期しているときに重大なケースが1つだけあり、それはOOMキラーが原因でした(はい、データベースノードでOOMキラーを完全に無効にする必要があります。その日は知りませんでした)。
そのため、私は夜間のバックアップからデータベースを復元し、pg_archiveディレクトリからすべてのWALセグメントをpostgresに再生のために提供しました(pg_xlogフォルダーにコピーしただけです)。すべてはうまくいきましたが、もちろんダウンタイムは避けられませんでした。