场景描述

MongoDB 两个集群之间可通过 MongoShake 进行跨集群的数据异步复制,实现灾备和多活的业务场景,同时也免去双写的业务开销。

MongoShake 异步复制原理为从源库抓取 oplog 数据,然后发送到各个不同的 tunnel 通道,用户可以通过对接 tunnel 通道获取关注的数据,例如对接 Direct 通道直接写入目的 MongoDB,或者对接 RPC 进行同步数据传输等。

mongoshake

前提条件

  • 已创建源集群和目的集群。

  • 已获取源集群和目的集群的 IP 地址、对所有的集合可进行读写复制的账户以及登录密码。

操作步骤

进入 MongoShake 集群创建界面。

说明

MongoShake 环境入口请提交工单或联系管理员获取。

第1步:基本设置

  1. 在顶部区域下拉框中,选择部署区域。

  2. 填写 MongoShake 集群的基本信息,包括:名称、描述、选择版本、计费方式、自动备份时间、部署方式和可用区。

    基本设置

第2步:节点设置

选择主机类型、CPU和内存规格。主机类型推荐选择企业型 e3,实际请根据集群情况选择规格。

节点设置

第3步:网络设置

选择 VPC 网络、私有网络以及节点 IP 类型。

说明

VPC 网络和私有网络需选择能够同时访问到源集群与目标集群的网络。

网络设置

第4步:服务环境参数设置

  1. 填写参数。参数介绍请参见 MongoShake 参数介绍

    网络设置
  2. 点击校验表单参数

  3. 待提示校验成功,点击提交

第5步:查看异步复制监控

待 MongoShake 集群创建成功,集群状态为活跃,集群节点服务状态为正常。在节点页签服务和资源监控页面可查看集群异步复制情况。

查看

MongoShake 参数介绍

参数 取值范围 参数说明

master_quorum

  • true

  • false

表示是否启动主备模式。默认为 false。

  • false:表示只能启动 1 个 MongoShake。

  • true:表示用户可以启动 2 个mongoshake,拉取同一个源MongoDB,MongoShake 将会自动选主节点,备节点在监测到主节点故障后,会接管过同步服务。
    如果主节点在全量同步阶段故障,备节点将接管服务避免造成断点续传,而是会从头开始同步,且如果配置项不当,可能还会有报错。主备模式主要用于在增量环节的 HA 容错切换。

log.level

  • debug

  • info

  • warning

  • 错误

表示日志的级别。默认为 info

sync_mode

  • all

  • full

  • incr

表示同步模式,默认为全量+增量 。

  • all:表示全量+增量同步,全量同步完毕以后进入增量同步。

  • full:表示仅进行全量同步,全量同步后进程将会退出。

  • incr:表示仅进行增量同步(默认),从给定的 checkpoint 开始拉取增量数据。

Sync: source address of MongoDB

-

填写源集群任一从节点 IP 地址,只能输入 1 个 IP 地址,例如:127.0.0.1:27017。

Sync: source user of MongoDB

-

填写源集群账户名,该账户需拥有对源集群所有的集合进行读、写、复制等权限。

Sync: source user’s password of MongoDB

-

填写源集群上述账户名的所属密码。
必须包含大小写字母和数字的组合, 可使用特殊字符(包括 @#%&*()_+-=), 长度在 8-32 之间。

Sync: destination address of MongoDB

-

填写目标集群主节点 IP 地址,只能输入 1 个 IP 地址,例如:127.0.0.1:27017。

Sync: destination user of MongoDB

-

填写目标集群账户名,该账户需拥有对源集群所有的集合进行读、写、复制等权限。

Sync: destination user’s password of MongoDB

-

填写目标集群上述账户名的所属密码。
必须包含大小写字母和数字的组合, 可使用特殊字符(包括 @#%&*()_+-=), 长度在 8-32 之间。

full_sync_port

1025 - 65535

全量阶段对外提供restful接口,用户可以查看内部监控的情况,默认 9101 。

incr_sync_port

1025 - 65535

增量阶段对外提供restful接口,用户可以查看内部监控的情况,默认 9100。

system_profile_port

1025 - 65535

Profile 端口,用户可以查看内部运行堆栈信息,默认 9200。

隧道服务

  • direct

  • rpc

  • tcp

  • file

  • kafka

表示通道类型。

mongo_connect_mode

  • primary

  • secondaryPreferred

  • standalone

表示源端拉取模式。

  • primary:表示从主节点拉取。

  • secondaryPreferred(默认):表示优先从 secondary 拉取,没有的话将会从 primary 拉取。

  • standalone:表示从给定的单个节点拉取。

如果源端是 sharding,版本小于3.6,且是全量同步(sync_mode=full),或者全量+增量同步(sync_mode=incr),建议这里配置 primary 以避免孤儿文档,详情可参考 MongoShake 从 mongos 拉取仍旧存在 duplicate key error

filter.namespace.black

-

表示黑名单过滤。

filter.namespace.white

-

表示白名单过滤。

filter.pass.special.db

-

指定特殊的 namespace 通过,比如 admin, system.views, mongoshake, config

filter.ddl_enable

  • true

  • false

表示是否同步 DDL,默认为 false。
DML 语句包括普通的 insert,update,delete,DDL语句包括建/删索引,建/删库表,rename 库表,事务等数据库结构的操作。

  • false 只同步 DML。

  • 用户可以设置为 true 对 DDL 进行同步。

checkpoint.storage.url

-

表示标识 checkpoint 存储的位置。

checkpoint.storage.db

-

checkpoint 存储的库名,默认 mongoshake。

checkpoint.storage.collection

-

checkpoint 存储的表名地址,默认 ckpt_default。

checkpoint.start_position

-

指定开始拉取 oplog 的位点,默认 1970-01-01T00:00:01Z。
仅用于 sync_mode 是 oplog 的情况,第一次将会从这个指定的位点开始拉取。其格式是 UTC 的时间戳:2000-01-01T00:00:01Z。

  • 若 checkpoint 在给定位置存在(参见 checkpoint.storage.url 和 checkpoint.address),那么将会从checkpoint 位置开始同步,忽略checkpoint.start_position 参数。

  • 若 checkpoint 不存在,且该值为1970-01-01T00:00:01Z,则会拉取源端所有 oplog。

  • 若 checkpoint 不存在,且该值不为 1970-01-01T00:00:01Z,则会先检查源端 oplog 最老的时间是否大于给定的时间,如果是则会直接报错退出。

所以,如果需要强制该位置开始拉取,在需要保证该位点有效的情况下,还需要删除原来的 checkpoint。(用户可以通过 rs.printReplicationInfo 查看最老 oplog 的信息。)

transform.namespace

-

是否开启命名空间转换,比如源库的 a.b,转换到目的库变成 c.d,默认不开启。
开启将会消耗比较大的资源,从而导致同步速率的大幅度的降低。谨慎建议开启。

reader.collection_parallel

-

表示一次最大并发拉取的表的数目,默认 6。(范围: - 10)
集群创建成功后不可修改。

reader.write_document_parallel

-

对一个表内部,启动多少个线程进行并发写入,默认 8。(范围: - 10)
集群创建成功后不可修改。

collection_exist_drop

  • true

  • false

目的端存在同样的表,是否需要先删除再进行同步,默认开启。

  • false:表示不删除直接同步,但可能会存在 _id 一样的文档从而报错。(参考 full_sync.executor.* 相关参数。)

  • true:表示在目的端先删除对应的表再进行同步。

  • 集群创建成功后不可修改。

create_index

  • -

  • foreground

  • background

全量期间数据同步完毕后,是否需要创建索引,默认 background。

  • foreground:表示前台创建索引。

  • -:表示不创建。

  • background:表示后台创建索引,2.4.1 版本开始支持。

  • 集群创建成功后不可修改。

executor.insert_on_dup_update

  • true

  • false

如果 _id 存在在目的库,是否将 insert 语句修改为 update 语句,默认不开启。
集群创建成功后不可修改。

executor.majority_enable

-

全量阶段写入端是否启用 majority write,默认 false。
集群创建成功后不可修改。

mongo_fetch_method

-

从源 MongoDB 拉取增量的方式,默认 oplog。
集群创建成功后不可修改。

worker

-

worker 线程的个数,默认为 8。
集群创建成功后不可修改。

tunnel.write_thread

-

控制序列化的线程个数,默认为 1 个 tunnel(worker)对应 1 个。
集群创建成功后不可修改。

target_delay

-

控制延迟同步的时间,目的端可以落后于源端指定的秒数。
集群创建成功后不可修改。

incr_sync.executor.upsert

  • true

  • false

如果 _id 不存在在目的库,是否将 update 语句修改为 insert 语句,默认 false。
集群创建成功后不可修改。

incr_sync.executor.insert_on_dup_update

  • true

  • false

如果 _id 存在在目的库,是否将 insert 语句修改为 update 语句,默认 false。
集群创建成功后不可修改。

incr_sync.conflict_write_to

-

如果写入存在冲突,记录冲突的文档.db 表示将冲突记录到 checkpoint url 对应的 db 里面,sdk 表示写入 sdk(开源没有用),默认 none。
集群创建成功后不可修改。

incr_sync.majority_enable

  • true

  • false

增量阶段写入端是否启用 majority write,默认false。
集群创建成功后不可修改。