Docs Menu
Docs Home
/
MongoDB Cluster-to-Cluster Sync
/

フィルタリングされた同期

項目一覧

  • フィルター構文
  • フィルターを構成する
  • 既存のフィルターの置き換え
  • コレクションの追加と名前変更
  • mapReduce と $out によるフィルタリング
  • 制限

バージョン 1.1 の新機能

Cluster-to-Cluster Sync は使用すると、MongoDB の 2 つのクラスター間で、データを継続的に同期したり、1 度のみ移行したりできます。 フィルタリングされた同期を使用して、 mongosyncユーティリティがソースクラスターと宛先クラスター間で転送するデータベースとコレクションを指定できます。

1.1 以降、 mongosyncは、同期に含めるデータベースとコレクションを指定するための包含フィルターをサポートしています。 1.6 以降、 mongosyncは除外フィルターと正規表現もサポートしています。

  • 包含フィルターを使用すると、 mongosyncは一致するデータベースとコレクションを同期します。

  • 除外フィルターを使用すると、 mongosyncは、フィルターに一致するものを除くすべてのデータベースとコレクションを同期します。

  • 包含フィルターと除外フィルターの両方を使用すると、 mongosyncは包含フィルターに一致するデータベースとコレクションのみを同期し、除外フィルターにも一致するデータベースとコレクションを除外します。

  • フィルターなしで、 mongosyncはすべてのデータベースとコレクションを同期します。

start API エンドポイントは、フィルタリング同期を構成する 2 つのフィールドincludeNamespacesexcludeNamespaces )を受け入れます。 各フィールドは、同期に含める、または除外するデータベースとコレクションを指定するフィルターの配列を受け取ります。

注意

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を起動すると、そのフィルターは変更できなくなります。 新しいフィルターの作成が必要な場合は、「 既存のフィルターの置き換え 」を参照してください。

1

宛先クラスターに同期するデータベースとコレクションを識別します。

  • フィルターにデータベースのセットを追加すると、クラスター内の他のデータベースも除外されます。

  • フィルターでコレクションを指定すると、同じデータベース内の他のコレクションも除外されます。

2

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"
]
}
]

フィルターの詳細については、「フィルター構文 」を参照してください。

3

フィルターを使用するには、 /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を再起動する前に、それらのデータベースを削除する必要があります。

新しいフィルター用に宛先クラスターを準備するには、次の手順に従います。

1
  1. mongosyncプロセスを停止します。

  2. mongoshを使用して宛先クラスターに接続します。 宛先がシャーディングされたクラスターである場合は、 mongosインスタンスに接続します。 宛先がレプリカセットである場合は、プライマリmongodインスタンスに接続します。

  3. mongosync_reserved_for_internal_useシステム データベースを削除します。

    use mongosync_reserved_for_internal_use
    db.dropDatabase()
2
  1. クラスター内のデータベースを一覧表示する

    show databases
  2. ユーザー データベースを削除します。 adminlocalconfigデータベース、 データベース、 データベースはシステムデータベースです。MongoDB サポートからの指示がない限り、これらのシステム データベースを編集しないでください。

    show databasesコマンドで宛先クラスター上のユーザー データベースが一覧表示される場合は、それらを削除する必要があります。

    ユーザー データベース リストごとにこの手順を繰り返します。

    use <user database name>
    db.dropDatabase()

    注:最初のdb.dropDatabase()操作が完了したら、データベースを削除するために 2 回実行する必要がある場合があります。

3
  1. どのデータベースとコレクションでフィルタリングするかを決定します。 データベースとコレクションをincludeNamespaces配列に追加します。 構成の詳細については、「 フィルターの構成 」を参照してください。

  2. ソースクラスターと宛先クラスターに再接続するには、 mongosyncを実行します。

  3. 同期を開始するには、 /start API エンドポイントを使用します。 /startを呼び出すときは、必ず新しいフィルターをアタッチしてください。

フィルタリングされた同期中に またはrename a collectionを追加することもできます。

警告

名前変更操作が名前変更制限に違反する場合、 mongosyncは同期を停止し、エラーを報告します。

エラー後にクリーンアップして再起動するには、手順に従って、既存のフィルターを置き換えます。

データベース全体がフィルターの一部である場合は、新しいコレクションを追加したり、既存のコレクションの名前を変更したりできます。

古い名前と新しい名前の両方がフィルターで指定されている場合は、コレクションの名前を変更することもできます。

名前変更の例 を参照してください。

ターゲット データベース全体がフィルターの一部である場合は、データベース全体でコレクションの名前を変更できます。 フィルターがターゲット データベース内の個々のコレクションを指定する場合、データベース間での名前変更は機能しません。

名前変更の例 を参照してください。

フィルタリングとともに$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 によるフィルタリング 」を参照してください。

次の例では、 cluster0cluster1の間で同期ジョブを開始しています。 ソースクラスターはcluster0で、宛先クラスターはcluster1です。

cluster0 には、 salesmarketing 、およびengineeringデータベースが含まれています。

salesデータベースには、 EMEAAPACAMERのコレクションが含まれています。

この例のincludeNamespaces配列は、 salesmarketingの 2 つのデータベースに対するフィルターを定義しています。

salesEMEAデータベースは、APAC コレクションと コレクションでもフィルタリングします。

"includeNamespaces" : [
{
"database" : "sales",
"collections": [ "EMEA", "APAC" ]
},
{
"database" : "marketing"
}
]

/startこのフィルターを使用して API を呼び出すと、mongosync は次のようになります。

  • marketingデータベース内のすべてのコレクションを同期します

  • engineeringデータベースをフィルタリング除外します

  • EMEAAPACデータベースからsales コレクションと コレクションを同期します

  • AMERコレクションをフィルタリングで除外します

次の例では、 cluster0cluster1の間で同期ジョブを開始しています。 ソースクラスターはcluster0で、宛先クラスターはcluster1です。

cluster0 には、 studentsstaff 、およびprospectsデータベースが含まれています。

  • studentsデータベースにはundergradgraduateのコレクションが含まれています。

  • staffデータベースにはemployeescontractorsのコレクションが含まれています。

この例のincludeNamespaces配列は、次の 2 つのデータベースに対するフィルターを定義しています。

{
"source": "cluster0",
"destination": "cluster1",
"includeNamespaces":
[
{ "database" : "students", "collections": ["undergrad", "graduate", "adjuncts"] },
{ "database" : "staff" }
]
}

このフィルターを使用すると、 mongosyncは次のフィルターを同期します。

  • staffデータベース全体

  • studentsデータベース内のundergradgraduate 、およびadjunctsコレクション

mongosyncprospectsデータベースからの情報を同期しません。

mongosyncstaffデータベース全体を同期します。 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" } )

重要

コレクションの名前を変更する予定の場合は、個々のコレクションを指定するのではなく、データベース全体をフィルターに追加することを検討してください。

戻る

mongosync の状態