版本 1.1 中的新增内容。
Mongosync 在两个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>" } } ]
要学习;了解有关 pattern 和 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 包含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 包含students 、 staff和prospects数据库。
students数据库包含undergrad、graduate和adjuncts集合。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" } )
重要
如果您预计要对集合进行重命名,请考虑将整个数据库添加到过滤器中,而不是指定单个集合。