利用 MongoShake 实现 MongoDB 跨集群异步复制
场景描述
MongoDB 两个集群之间可通过 MongoShake 进行跨集群的数据异步复制,实现灾备和多活的业务场景,同时也免去双写的业务开销。
MongoShake 异步复制原理为从源库抓取 oplog 数据,然后发送到各个不同的 tunnel 通道,用户可以通过对接 tunnel 通道获取关注的数据,例如对接 Direct 通道直接写入目的 MongoDB,或者对接 RPC 进行同步数据传输等。
前提条件
-
已创建源集群和目的集群。
-
已获取源集群和目的集群的 IP 地址、对所有的集合可进行读写复制的账户以及登录密码。
操作步骤
进入 MongoShake 集群创建界面。
说明 |
---|
MongoShake 环境入口请提交工单或联系管理员获取。 |
第1步:基本设置
-
在顶部区域下拉框中,选择部署区域。
-
填写 MongoShake 集群的基本信息,包括:名称、描述、选择版本、计费方式、自动备份时间、部署方式和可用区。
第2步:节点设置
选择主机类型、CPU和内存规格。主机类型推荐选择企业型 e3
,实际请根据集群情况选择规格。
第3步:网络设置
选择 VPC 网络、私有网络以及节点 IP 类型。
说明 |
---|
VPC 网络和私有网络需选择能够同时访问到源集群与目标集群的网络。 |
第4步:服务环境参数设置
-
填写参数。参数介绍请参见 MongoShake 参数介绍。
-
点击校验表单参数。
-
待提示校验成功,点击提交。
第5步:查看异步复制监控
待 MongoShake 集群创建成功,集群状态为活跃
,集群节点服务状态为正常
。在节点页签服务和资源监控页面可查看集群异步复制情况。
MongoShake 参数介绍
参数 | 取值范围 | 参数说明 |
---|---|---|
master_quorum |
|
表示是否启动主备模式。默认为 false。
|
log.level |
|
表示日志的级别。默认为 |
sync_mode |
|
表示同步模式,默认为全量+增量 。
|
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 |
- |
填写源集群上述账户名的所属密码。 |
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 |
- |
填写目标集群上述账户名的所属密码。 |
full_sync_port |
1025 - 65535 |
全量阶段对外提供restful接口,用户可以查看内部监控的情况,默认 9101 。 |
incr_sync_port |
1025 - 65535 |
增量阶段对外提供restful接口,用户可以查看内部监控的情况,默认 9100。 |
system_profile_port |
1025 - 65535 |
Profile 端口,用户可以查看内部运行堆栈信息,默认 9200。 |
隧道服务 |
|
表示通道类型。 |
mongo_connect_mode |
|
表示源端拉取模式。
如果源端是 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 |
|
表示是否同步 DDL,默认为 false。
|
checkpoint.storage.url |
- |
表示标识 checkpoint 存储的位置。 |
checkpoint.storage.db |
- |
checkpoint 存储的库名,默认 mongoshake。 |
checkpoint.storage.collection |
- |
checkpoint 存储的表名地址,默认 ckpt_default。 |
checkpoint.start_position |
- |
指定开始拉取 oplog 的位点,默认
所以,如果需要强制该位置开始拉取,在需要保证该位点有效的情况下,还需要删除原来的 checkpoint。(用户可以通过 |
transform.namespace |
- |
是否开启命名空间转换,比如源库的 a.b,转换到目的库变成 c.d,默认不开启。 |
reader.collection_parallel |
- |
表示一次最大并发拉取的表的数目,默认 6。(范围: - 10) |
reader.write_document_parallel |
- |
对一个表内部,启动多少个线程进行并发写入,默认 8。(范围: - 10) |
collection_exist_drop |
|
目的端存在同样的表,是否需要先删除再进行同步,默认开启。
|
create_index |
|
全量期间数据同步完毕后,是否需要创建索引,默认 background。
|
executor.insert_on_dup_update |
|
如果 _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 |
|
如果 _id 不存在在目的库,是否将 update 语句修改为 insert 语句,默认 false。 |
incr_sync.executor.insert_on_dup_update |
|
如果 _id 存在在目的库,是否将 insert 语句修改为 update 语句,默认 false。 |
incr_sync.conflict_write_to |
- |
如果写入存在冲突,记录冲突的文档.db 表示将冲突记录到 checkpoint url 对应的 db 里面,sdk 表示写入 sdk(开源没有用),默认 none。 |
incr_sync.majority_enable |
|
增量阶段写入端是否启用 majority write,默认false。 |