已筛选同步
版本 1.1 中的新增内容。
Cluster-to-Cluster Sync在两个MongoDB集群之间提供持续数据同步或一次性数据迁移。 您可以使用筛选同步来指定 mongosync实用程序在源集群和目标集群之间传输的数据库和集合。
从 1.1 开始, mongosync
支持包含筛选器,以指定要同步包含的数据库和集合。 从 1.6 开始, mongosync
还支持排除筛选器和正则表达式。
通过包含过滤器,
mongosync
可以同步匹配的数据库和集合。使用排除过滤器,
mongosync
可同步所有数据库和集合,与该过滤器匹配的数据库和集合除外。使用包含和排除过滤器时,
mongosync
仅同步与包含过滤器匹配的数据库和集合,然后排除任何与排除过滤器匹配的数据库和集合。如果不使用过滤器,则
mongosync
将同步所有数据库和集合。
过滤器语法
start
API 端点接受两个配置过滤同步的字段: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 接受两个用于配置可选过滤器的参数:
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()
操作后,可能需要运行第二次才能删除数据库。
添加和重命名集合
在过滤同步过程中,您可以添加或 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
上的筛选器。
sales
数据库还会对 EMEA
和 APAC
集合进行过滤。
"includeNamespaces" : [ { "database" : "sales", "collections": [ "EMEA", "APAC" ] }, { "database" : "marketing" } ]
使用此过滤器调用 /start
API 后,mongosync
:
同步
marketing
数据库中的所有集合滤除
engineering
数据库同步
sales
数据库中的EMEA
和APAC
集合滤除
AMER
集合
在同步时添加和重命名集合
以下示例在cluster0
和cluster1
之间启动同步作业。 源集群为cluster0
,目标集群为cluster1
。
cluster0
包含students
、 staff
和prospects
数据库。
students
数据库包含undergrad
和graduate
集合。staff
数据库包含employees
和contractors
集合。
此示例中的 includeNamespaces
数组定义了两个数据库的过滤器:
{ "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
数据库的新collection,除非该collection是筛选器的一部分。
例如,如果您将 postdocs
集合添加到students
数据库,则 mongosync
不会同步新集合。如果您添加 adjuncts
集合,则 mongosync
会对其进行同步,因为 adjuncts
是过滤器的一部分。
重命名集合
您可以重命名 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" } )
重要
如果您预计要对集合进行重命名,请考虑将整个数据库添加到过滤器中,而不是指定单个集合。