Docs 菜单
Docs 主页
/
MongoDB Cluster-to-Cluster Sync
/

已筛选同步

在此页面上

  • 过滤器语法
  • 配置过滤器
  • 更换现有过滤器
  • 添加和重命名集合
  • 使用 mapReduce 和 $out 进行过滤
  • 限制
  • 示例

版本 1.1 中的新增内容

Cluster-to-Cluster Sync在两个MongoDB集群之间提供持续数据同步或一次性数据迁移。 您可以使用筛选同步来指定 mongosync实用程序在源集群和目标集群之间传输的数据库和集合。

从 1.1 开始, mongosync支持包含筛选器,以指定要同步包含的数据库和集合。 从 1.6 开始, mongosync还支持排除筛选器和正则表达式。

  • 通过包含过滤器,mongosync 可以同步匹配的数据库和集合。

  • 使用排除过滤器,mongosync 可同步所有数据库和集合,与该过滤器匹配的数据库和集合除外。

  • 使用包含和排除过滤器时,mongosync 仅同步与包含过滤器匹配的数据库和集合,然后排除任何与排除过滤器匹配的数据库和集合。

  • 如果不使用过滤器,则 mongosync 将同步所有数据库和集合。

start API 端点接受两个配置过滤同步的字段:includeNamespacesexcludeNamespaces。每个字段都有一个过滤器数组,用于指定要在同步中包含或排除的数据库和集合。

注意

如果 start 调用同时使用 includeNamespacesexcludeNamespaces 参数,则 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 ,就无法修改该过滤器。 如果您确实需要创建新的筛选器,请参阅: 替换现有筛选器。

1

确定要同步到目标集群的数据库和集合。

  • 在将一组数据库添加到过滤器时,您还会排除集群中的任何其他数据库。

  • 在筛选器中指定集合时,也会排除同一数据库中的其他集合。

2

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

有关过滤器的更多信息,请参阅过滤器语法。

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() 操作后,可能需要运行第二次才能删除数据库。

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 包含salesmarketingengineering数据库。

sales 数据库包含 EMEAAPACAMER 集合。

此示例中的 includeNamespaces 数组定义了两个数据库 salesmarketing 上的筛选器。

sales 数据库还会对 EMEAAPAC 集合进行过滤。

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

使用此过滤器调用 /start API 后,mongosync

  • 同步 marketing 数据库中的所有集合

  • 滤除 engineering 数据库

  • 同步 sales 数据库中的 EMEAAPAC 集合

  • 滤除 AMER 集合

以下示例在cluster0cluster1之间启动同步作业。 源集群为cluster0 ,目标集群为cluster1

cluster0 包含studentsstaffprospects数据库。

  • students 数据库包含 undergradgraduate集合。

  • staff 数据库包含 employeescontractors集合。

此示例中的 includeNamespaces 数组定义了两个数据库的过滤器:

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

有了这个过滤器,mongosync 就会同步:

  • 整个 staff 数据库

  • students 数据库中的 undergradgraduateadjuncts 集合

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

重要

如果您预计要对集合进行重命名,请考虑将整个数据库添加到过滤器中,而不是指定单个集合。

后退

mongosync 状态