フィルタリングされた同期
バージョン 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
excludeNamespaces
mongosync
パラメータと パラメータの両方が使用される場合、 は最初に包含フィルターからデータベースとコレクションを照合し、次に除外フィルターにも一致するデータベースとコレクションを除外します。
フィルターの構文は次のとおりです。
"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 ユーザー データベースを削除します。
admin
local
config
データベース、 データベース、 データベースはシステムデータベースです。MongoDB サポートからの指示がない限り、これらのシステム データベースを編集しないでください。show databases
コマンドで宛先クラスター上のユーザー データベースが一覧表示される場合は、それらを削除する必要があります。ユーザー データベース リストごとにこの手順を繰り返します。
use <user database name> db.dropDatabase() 注:最初の
db.dropDatabase()
操作が完了したら、データベースを削除するために 2 回実行する必要がある場合があります。
新しいフィルターを構成します。
どのデータベースとコレクションでフィルタリングするかを決定します。 データベースとコレクションを
includeNamespaces
配列に追加します。 構成の詳細については、「 フィルターの構成 」を参照してください。ソースクラスターと宛先クラスターに再接続するには、
mongosync
を実行します。同期を開始するには、
/start
API エンドポイントを使用します。/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 つのデータベースに対するフィルターを定義しています。
sales
EMEA
データベースは、APAC
コレクションと コレクションでもフィルタリングします。
"includeNamespaces" : [ { "database" : "sales", "collections": [ "EMEA", "APAC" ] }, { "database" : "marketing" } ]
/start
このフィルターを使用して API を呼び出すと、mongosync
は次のようになります。
marketing
データベース内のすべてのコレクションを同期しますengineering
データベースをフィルタリング除外しますEMEA
APAC
データベースから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" } )
重要
コレクションの名前を変更する予定の場合は、個々のコレクションを指定するのではなく、データベース全体をフィルターに追加することを検討してください。