希望するレプリケーション戦略は、MongoDBによって正式にサポートされていません。
MongoDBレプリカセットは、同じレプリカセット内の1つ以上のセカンダリサーバーへの非同期レプリケーションを備えた単一のプライマリで構成されます。複数のプライマリを含むレプリカセットを構成したり、別のレプリカセットに複製したりすることはできません。
ただし、中央サーバーをどれだけ積極的に最新の状態に保ちたいか、および管理する必要のあるデータ/更新の量に応じて、ユースケースにいくつかの可能なアプローチがあります。
いくつかの一般的な警告:
複数のスタンドアロンサーバーからのデータをマージすると、予期しない競合が発生する可能性があります。たとえば、一意のインデックスは、他のサーバーで作成されたドキュメントを認識しません。
_id
理想的には、統合するデータは、オリジンサーバーごとに一意のデータベース名で区切られるため、同じ名前空間を持ち、異なるオリジンサーバーで共有される異種のドキュメント間で奇妙なクロストークが発生することはありません。
アプローチ#1:使用mongodump
してmongorestore
コンテンツを中央サーバーに定期的に同期する必要がある場合、そのための1つの方法は、とを使用することmongodump
ですmongorestore
。mongodump
各スタンドアロンインスタンスから定期的にスケジュールを設定し、mongorestore
それらを使用して中央サーバーにインポートできます。
警告:
元の名前とは異なるデータベースに復元できるようにするための--db
パラメーターがあります(必要な場合)mongorestore
mongorestore
既存のデータベースへの挿入のみを実行します(つまり、更新やアップサートは実行しません)。同じものを持つ既存のデータが_id
ターゲットデータベースにすでに存在する場合、mongorestoreはそれを置き換えません。
mongodump
エクスポートするデータをより選択的にするなどのオプションを使用できます--query
(たとえば、すべてではなく最近のデータのみを選択します)
実行ごとにダンプおよび復元するデータの量を制限する場合(たとえば、「変更された」データのみをエクスポートする場合)、中央サーバーで更新と削除を処理する方法を検討する必要があります。
警告を考えると、このアプローチの最も簡単な使用法は、mongorestore --drop
すべての変更が確実にコピーされるように、完全なダンプと復元を実行することです(つまり、を使用します)。
アプローチ#2:MongoDBで調整可能なカーソルを使用しますoplog
。
よりリアルタイムまたはインクリメンタルレプリケーションが必要な場合、考えられるアプローチは、MongoDBレプリケーションに調整可能なカーソルを作成することoplog
です。
このアプローチは、基本的に「独自のレプリケーションをロールする」ことです。各MongoDBインスタンスでoplogを調整し、中央サーバーに保存する対象の変更を探すアプリケーションを作成する必要があります。たとえば、選択した名前空間(データベースまたはコレクション)の変更のみを複製したい場合があります。
興味深い可能性のある関連ツールは、10genラボの実験的なMongoコネクタです。これは、レプリケーションを調整するためのインターフェースを提供するPythonモジュールですoplog
。
警告: