利用 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 参数介绍。
-
点击校验表单参数。
-
待提示校验成功,点击提交。
第6步:查看异步复制监控
待 MongoShake 集群创建成功,集群状态为活跃
,集群节点服务状态为正常
。在节点页签服务和资源监控页面可查看集群异步复制情况。
MongoShake 参数介绍
参数 | 取值范围 | 参数说明 |
---|---|---|
master_quorum |
|
表示是否启动主备模式。默认为 false。
|
log.level |
|
表示日志的级别。默认为 info 。 |
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 | - | 填写源集群上述账户名的所属密码。 必须包含大小写字母和数字的组合, 可使用特殊字符(包括 @#%&*()_+-=), 长度在 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。 |
隧道服务 |
|
表示通道类型。 |
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。 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。
rs.printReplicationInfo 查看最老 oplog 的信息) |
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。 集群创建成功后不可修改。 |