MongoDBで大規模なデータセットをバックアップする推奨方法は何ですか? 10TBのオーダーのデータサイズがあるとしましょう-どのようにバックアップしますか?
非表示の、おそらく遅延したレプリカセットノードを検討しています。この遅延により、データベース全体が誤ってドロップされるのを防ぐことができます。これは実行可能なソリューションですか、他にどのようなオプションを調査することをお勧めしますか?
よろしくお願いします!
10TBをバックアップする必要があるため、これは少し複雑になります。
遅延レプリカセットメンバーは、偶発的な操作を支援する比較的簡単な方法を提供できますが、RAIDがファイルシステムベースのバックアップの代わりではないように、適切なバックアップに代わるものはありません。
これは、セットアップの状態に大きく依存します。
10 TBの場合、何らかのSANが接続されていると思います。これらの環境でMongoDBをバックアップする最も簡単な方法は、ファイルシステムとMongoDBの両方でジャーナリングがアクティブになっていることを確認し、セカンダリの1つのSANボリュームのスナップショットを取るだけです。操作が中断されないようにするため。これには通常数秒しかかかりませんが、レプリケーションoplogウィンドウで十分であることを_確認_してください。それ以外の場合は、セカンダリを再同期する必要があります。
Mongodumpの使用についてRolandoMySQLDBAに同意する必要があります。まず、サーバーにロックをかけます。ロックは比較的速く解除されますが、非表示のノードで実行したり、セカンダリにヒットする読み取り設定がない場合を除き、ロックの数が増えて操作に干渉する可能性があります。さらに、それは正確には高速ではありません。少なくとも数時間は実行されると思いますが、おそらくバックアップウィンドウよりも時間がかかります。補足:常に[--oplog
オプションを指定してmongodumpを実行]。また、mongodumpはインデックスをバックアップするのではなく、インデックスを作成する操作をバックアップすることに注意してください。これらのインデックスは、復元中に再作成する必要があるため、必要な時間が大幅に増える可能性があります。私の経験から、データベースを復元する必要がある場合は、データベースをできるだけ速くしたいと考えています。 mongodumpが10TBのバックアップに適さないもう1つのポイント。
実行中のmongodインスタンスでLVMスナップショットを実行できますmongodでジャーナリングを有効にした場合(そして私の経験から、FSレベルで有効にしても問題ありませんも)。ただし、LVMスナップショットにはいくつかの影響があります。まず、バックアップ操作中に変更を加えることができる十分なディスク容量が明らかに必要です。はっきりさせておきます。
1時間あたりの変更率が500 GBであると仮定します。そして、あなたはそれがいくつかのストレージにアップロードされる前に、あなたはあなたのバックアップをブリップさせたいです。 parallel bzip2 を使用している場合でも、10TBの圧縮が完了するまでに数時間かかることがあります。これは、大容量ストレージのスループットが最も可能性が高いという事実が制限要因になるためです。データを2TBに圧縮するのに2時間かかると仮定しましょう。そのため、現時点では合計2TB + 2 * 500GBの空きディスク容量が必要であり、LVMスナップショットには1TBが必要です。これにより、ファイルシステムを少なくとも 30%オーバープロビジョニングする必要が生じます。適切な安全マージンが必要な場合、これは簡単に60〜70%(元のファイルシステムの使用率0.8の場合は20%、スナップショットサイズと圧縮されたバックアップ自体に必要なスペースが同じ場合は20%)に増加する可能性があります。 )。ほとんどの本番環境では、過剰なプロビジョニングが静的であるため、これは受け入れられません(バックアップスクリプトがLVMを動的に壊すことを望まないでしょうか?)。
MMSバックアップにはいくつかの優れた機能(継続的なバックアップ、簡単なポイントインタイムリカバリ)がありますが、いくつかの重大な欠点があります。大規模な展開の価格は数千にもなることがあります。これらの10 TBで1時間あたりの変更率が500 GBであると想定すると、合計は6桁の中程度になりますクラウドバックアップの場合。毎月。
私の提案では、バックアップを含め、オンプレミスのMMSインスタンスを使用する資格を得るためにサーバーに エンタープライズサブスクリプション を適用することをお勧めします。
以下は、優先順位の高い順に取るオプションです。
2つのオプションがあります
ダウンタイムを気にしない場合、最も簡単なことは
service mongod stop
LVMスナップショットまたは別のディスクへのMongoデータフォルダーのブルートフォースcp
を実行します
service mongod start
もちろん、10TBのデータがスタンドアロンマシン上にある場合、ダウンタイムは必要ありません。
3つのノードを持つレプリカセットがある場合は、いずれかのノードをバックアップに使用します。
{
"_id" : "myreplica",
"version" : 1,
"members" : [
{
"_id" : 1,
"Host" : "10.20.30.40:27017",
"priority" : 2
},
{
"_id" : 2,
"Host" : "10.20.30.41:27017"
},
{
"_id" : 3,
"Host" : "10.20.30.42:27017",
"priority" : 0,
"slaveDelay" : 3600
}
]
}
"_id' : 3
のすべての物理バックアップがあるノードを使用します。したがって、ダウンタイムはありません。午前0時のスナップショットを取得するには、非表示のノードが1時間遅れているため、午前1時にバックアップを起動できます。
もちろん、欠点は、それぞれが10TBのサーバーがさらに2台あることと、システム管理者の健全性にリスクがあることです。
スタンドアロンマシンに対してmongodumpを使用することもできますが、mongodumpは他の接続と同様に接続を使用するクライアントプログラムであるため、パフォーマンスの低下を予想する必要があります。
ポイントインタイムバックアップが必要な場合は、
mongodump --oplog
論理BSONバックアップは、物理バックアップよりも小さくなります(特にgzipまたはbzip)。
mongodump --oplog
の使用は、非表示のノードに対して行うのが最適です。そうすれば、マスターのパフォーマンスに影響が及ぶことはありません。
私はMongoDBに比較的慣れていません(偶発的/偶発的なMongoDBA)。私の答えが役に立てば幸いです。