バージョン 1.1 の新機能。
Cluster-to-Cluster Sync は使用すると、MongoDB の 2 つのクラスター間で、データを継続的に同期したり、1 度のみ移行したりできます。 フィルタリングされた同期を使用して、 mongosyncユーティリティがソースクラスターと宛先クラスター間で転送するデータベースとコレクションを指定できます。
1.1 以降、mongosync は、同期に含めるデータベースとコレクションを指定するための包含フィルターをサポートしています。1.6 以降、mongosync は除外フィルターと正規表現もサポートしています。
包含フィルターを使用すると、
mongosyncは一致するデータベースとコレクションを同期します。除外フィルターを使用すると、
mongosyncは、フィルターに一致するものを除くすべてのデータベースとコレクションを同期します。包含フィルターと除外フィルターの両方を使用すると、
mongosyncは包含フィルターに一致するデータベースとコレクションのみを同期し、除外フィルターにも一致するデータベースとコレクションを除外します。フィルターなしで、
mongosyncはすべてのデータベースとコレクションを同期します。
フィルター構文
start API エンドポイントは、フィルタリング同期を構成する 2 つのフィールドincludeNamespacesとexcludeNamespaces )を受け入れます。 各フィールドは、同期に含める、または除外するデータベースとコレクションを指定するフィルターの配列を受け取ります。
注意
start呼び出しでincludeNamespaces excludeNamespacesmongosyncパラメータと パラメータの両方が使用される場合、 は最初に包含フィルターからデータベースとコレクションを照合し、次に除外フィルターにも一致するデータベースとコレクションを除外します。
フィルターの構文は次のとおりです。
"includeNamespaces": [ { "database": "<database-name>", "collections": [ "<collection-name>" ] "databaseRegex": { "pattern": "<regex-pattern>", "options": "<options>" }, "collectionsRegex": { "pattern": "<regex-pattern>", "options": "<options>" } } ], "excludeNamespaces": [ { "database": "<database-name>", "collections": [ "<collection-name>" ] "databaseRegex": { "pattern": "<regex-pattern>", "options": "<options>" }, "collectionsRegex": { "pattern": "<regex-pattern>", "options": "<options>" } } ]
フィルターには、 databaseフィールドまたはdatabaseRegexフィールドのいずれかを含める必要があります。
特定のコレクションに一致するためにフィルターが必要な場合は、 collections配列を使用してコレクションを個別に指定するか、 collectionsRegexフィールドを使用して正規表現を定義できます。
フィルターを構成する
重要
フィルターを設定してmongosyncを起動すると、そのフィルターは変更できなくなります。 新しいフィルターを作成する必要がある場合は、「既存のフィルターの置き換え 」を参照してください。
フィルターを作成します。
start API は、オプション フィルターを構成する 2 つのパラメーターを受け入れます。
includeNamespacesパラメータはフィルターの配列を指定します。フィルターは、mongosyncが同期に含めるデータベースとコレクションを決定するために使用されます。excludeNamespacesパラメータはフィルターの配列を指定します。フィルターは、mongosyncが同期から除外するデータベースとコレクションを決定するために使用されます。
フィルタを指定しない場合、 mongosyncはクラスターの完全同期を実行します。
同期するデータベースとコレクションを識別するには、包含フィルターや除外フィルターを作成します。
たとえば、次の包含フィルターでは、 mongosyncは、 salesデータベースから名前がaccounts_で始まるコレクションのみを同期するように構成されます( accounts_oldコレクションは除く)。
"includeNamespaces": [ { "database": "sales", "collectionsRegex": { "pattern": "^accounts_.+?$", "options": "ms" } ], "excludeNamespaces": [ { "database": "sales", "collections": [ "accounts_old" ] } ]
フィルターの詳細については、「フィルター構文 」を参照してください。
フィルターを使用します。
フィルターを使用するには、 /start API 呼び出しを実行して同期を開始するときにフィルター JSON をアタッチします。
curl -X POST "http://localhost:27182/api/v1/start" --data ' { "source": "cluster0", "destination": "cluster1", "includeNamespaces": [ { "database": "sales", "collectionsRegex": { "pattern": "^accounts_.+$", "options": "i" } }, { "database": "marketing" } ] } '
構成の例については、「フィルターでmongosyncを起動する 」を参照してください。
既存のフィルターの置き換え
既存のフィルターを更新することはできません。 進行中の同期プロセスを停止し、宛先クラスターを準備し、新しいフィルターでmongosyncを再起動する必要があります。
mongosyncが元のフィルターを実行すると、データを含むデータベース(「ユーザー データベース」)と宛先クラスターにmongosync_reserved_for_internal_useシステム データベースが作成されました。 新しいフィルターでmongosyncを再起動する前に、それらのデータベースを削除する必要があります。
新しいフィルター用に宛先クラスターを準備するには、次の手順に従います。
ユーザー データベースを削除します。
クラスター内のデータベースを一覧表示する
show databases ユーザー データベースを削除します。
adminlocalconfigデータベース、 データベース、 データベースはシステムデータベースです。MongoDB サポートからの指示がない限り、これらのシステム データベースを編集しないでください。show databasesコマンドで宛先クラスター上のユーザー データベースが一覧表示される場合は、それらを削除する必要があります。ユーザー データベース リストごとにこの手順を繰り返します。
use <user database name> db.dropDatabase() 注:最初の
db.dropDatabase()操作が完了したら、データベースを削除するために 2 回実行する必要がある場合があります。
新しいフィルターを構成します。
どのデータベースとコレクションでフィルタリングするかを決定します。 データベースとコレクションを
includeNamespaces配列に追加します。 構成の詳細については、「 フィルターの構成 」を参照してください。ソースクラスターと宛先クラスターに再接続するには、
mongosyncを実行します。同期を開始するには、
/startAPI エンドポイントを使用します。/startを呼び出すときは、必ず新しいフィルターをアタッチしてください。
コレクションの追加と名前変更
フィルタリングされた同期中に またはrename a collectionを追加することもできます。
警告
名前変更操作が名前変更制限に違反する場合、 mongosyncは同期を停止し、エラーを報告します。
エラー後にクリーンアップして再起動するには、手順に従って、既存のフィルターを置き換えます。
単一データベース内での追加と名前変更
データベース全体がフィルターの一部である場合は、新しいコレクションを追加したり、既存のコレクションの名前を変更したりできます。
古い名前と新しい名前の両方がフィルターで指定されている場合は、コレクションの名前を変更することもできます。
異なるデータベース間での名前の変更
ターゲット データベース全体がフィルターの一部である場合は、データベース全体でコレクションの名前を変更できます。 フィルターがターゲット データベース内の個々のコレクションを指定する場合、データベース間での名前変更は機能しません。
mapReduce と $out によるフィルタリング
フィルタリングとともに$out集計ステージまたはmapReduceコマンド(コレクションを作成または置換するように設定されている場合)を使用するには、指定されたコレクションだけでなくデータベース全体をフィルタリングする必要があります。
たとえば、次の集計パイプラインについて考えてみましょう。
use library db.books.aggregate( [ { $group : { _id : "$author", titles: { $push: "$title" } } }, { $out : "authors" } ] )
$outステージは、 libraryデータベースにauthorsコレクションを作成します。 authorsコレクションを同期する場合は、フィルターでlibraryデータベース全体を指定する必要があります。 authorsコレクションのみを指定している場合、フィルターは機能しません。
このフィルターは、次の機能を行います。
"includeNamespaces": [ { "database": "library" } ]
このフィルターは次の場合、機能しません。
"includeNamespaces": [ { "database": "library", "collections": [ "authors", "books" ] // DOES NOT WORK WITH $OUT } ]
制限
フィルタリングは、元の同期ではサポートされていません。
起動前に、宛先クラスターにはユーザー データが含まれていない必要があります。
起動前に、宛先クラスターに
mongosync_reserved_for_internal_useシステムデータベースが含まれていない必要があります。使用中のフィルターは変更できません。 新しいフィルターを作成するには、「既存のフィルターの置き換え 」を参照してください。
コレクションの名前を変更できるのは、特定の状況のみです。 詳細については、「コレクションの追加と名前変更 」を参照してください。
フィルターにビューが含まれ、基本コレクションは含まれていない場合、ビュー メタデータのみが宛先クラスターに同期されます。 ビュー ドキュメントを含めるには、基本コレクションも同期する必要があります。
フィルターではシステム コレクションまたはシステム データベースを指定できません。
フィルタリングとともに
$out集計ステージまたはmapReduceコマンド(コレクションを作成または置換するように設定されている場合)を使用するには、データベース全体を使用するようにフィルターを構成する必要があります。 フィルターを データベース内のコレクションに制限することはできません。詳細については、「 mapReduce と $out によるフィルタリング 」を参照してください。
例
フィルターで を開始mongosync
次の例では、 cluster0とcluster1の間で同期ジョブを開始しています。 ソースクラスターはcluster0で、宛先クラスターはcluster1です。
cluster0 には、 sales 、 marketing 、およびengineeringデータベースが含まれています。
salesデータベースには、 EMEA 、 APAC 、 AMERのコレクションが含まれています。
この例のincludeNamespaces配列は、 salesとmarketingの 2 つのデータベースに対するフィルターを定義しています。
salesEMEAデータベースは、APAC コレクションと コレクションでもフィルタリングします。
"includeNamespaces" : [ { "database" : "sales", "collections": [ "EMEA", "APAC" ] }, { "database" : "marketing" } ]
/startこのフィルターを使用して API を呼び出すと、mongosync は次のようになります。
marketingデータベース内のすべてのコレクションを同期しますengineeringデータベースをフィルタリング除外しますEMEAAPACデータベースからsalesコレクションと コレクションを同期しますAMERコレクションをフィルタリングで除外します
同期中のコレクションの追加と名前変更
次の例では、 cluster0とcluster1の間で同期ジョブを開始しています。 ソースクラスターはcluster0で、宛先クラスターはcluster1です。
cluster0 には、 students 、 staff 、およびprospectsデータベースが含まれています。
studentsデータベースにはundergradとgraduateのコレクションが含まれています。staffデータベースにはemployeesとcontractorsのコレクションが含まれています。
この例のincludeNamespaces配列は、次の 2 つのデータベースに対するフィルターを定義しています。
{ "source": "cluster0", "destination": "cluster1", "includeNamespaces": [ { "database" : "students", "collections": ["undergrad", "graduate", "adjuncts"] }, { "database" : "staff" } ] }
このフィルターを使用すると、 mongosyncは次のフィルターを同期します。
staffデータベース全体studentsデータベース内のundergrad、graduate、およびadjunctsコレクション
mongosync はprospectsデータベースからの情報を同期しません。
コレクションの追加
mongosync はstaffデータベース全体を同期します。 staffデータベースに新しいコレクションを追加すると、 mongosyncはそれらも同期します。
mongosync は、コレクションがフィルターの一部でない限り、 studentsデータベースに追加された新しいコレクションを同期しません。
たとえば、 postdocsコレクションをstudentsデータベースに追加しても、 mongosyncは新しいコレクションを同期しません。 adjunctsコレクションを追加すると、 adjunctsはフィルターの一部であるため、 mongosyncはそれを同期します。
コレクションの名前変更
staffデータベース内の任意のコレクションの名前を変更できます。
// This code works use admin db.runCommand( { renameCollection: "staff.employees", to: "staff.salaried" } )
新しい名前と古い名前の両方がフィルターにある場合は、 studentsデータベース内のコレクションの名前を変更できます。 どちらの名前もフィルターにない場合、 monogsyncはエラーを報告し、存在します。
// This code works use admin db.runCommand( { renameCollection: "students.graduate", to: "students.adjuncts" } )
フィルターでコレクションが指定されている場合は削除できますが、名前を変更してフィルターからコレクションを削除することはできません。
// This code produces an error and mongosync stops syncing use admin db.runCommand( { renameCollection: "students.graduate", to: "students.notAFilteredCollection" } )
ターゲットデータベース全体がフィルターに含まれている場合は、コレクションの名前を変更してフィルターに追加できます。
ソース コレクションはフィルターで指定されます
use admin db.runCommand( { renameCollection: "students.adjuncts", to: "staff.adjuncts" } ) ソース コレクションがフィルターで指定されていない
use admin db.runCommand( { renameCollection: "prospects.current", to: "staff.newHires" } )
ターゲット データベース全体がフィルターにある場合は、ソース データベース内のコレクションの名前を変更することもできます。
use admin db.runCommand( { renameCollection: "staff.employees", to: "staff.onPayroll" } )
重要
コレクションの名前を変更する予定の場合は、個々のコレクションを指定するのではなく、データベース全体をフィルターに追加することを検討してください。