-
Notifications
You must be signed in to change notification settings - Fork 468
最佳实践——常见场景配置
本文主要列举一些场景场景的配置。本文以2.4之后版本的参数为准,2.4以前的版本参数名字有所不同,具体请查看配置文件的说明。
具体配置项含义请参考:配置参数说明
假设源端是三副本:10.1.1.1:1001, 10.2.2.2:2002, 10.3.3.3:3003,目的端也是三副本:10.5.5.5:5005, 10.6.6.6:6006, 10.7.7.7:7007。同步模式是全量+增量同步。
则用户需要修改以下几个参数:
mongo_urls = mongodb://username:password@10.1.1.1:1001,10.2.2.2:2002,10.3.3.3:3003 #源端连接串信息,逗号分隔不同的mongod
sync_mode = all # all 表示全量+增量,full表示仅全量,incr表示仅增量
incr_sync.tunnel.address = mongodb://username:password@10.5.5.5:5005, 10.6.6.6:6006, 10.7.7.7:7007 #目的端连接串信息,逗号分隔不同的mongod
incr_sync.mongo_fetch_method = oplog # 如果希望以change stream拉取,该值需要配置change_stream,支持>=4.0.1版本。
假设源同样是三副本:10.1.1.1:1001, 10.2.2.2:2002, 10.3.3.3:3003,目的端是sharding,有多个mongos:20.1.1.1:2021, 20.2.2.2:2022, 20.3.3.3:3033。
mongo_urls = mongodb://username:password@10.1.1.1:1001,10.2.2.2:2002,10.3.3.3:3003 #源端连接串信息,逗号分隔不同的mongod
sync_mode = all # all 表示全量+增量,full表示仅全量,incr表示仅增量
incr_sync.tunnel.address = mongodb://username:password@20.1.1.1:2021,username:password@20.2.2.2:2022,username:password@20.3.3.3:3033 #目的端连接串信息,逗号分割不同的mongos。也可以只配置部分,配置多个mongos可以做负载均衡写入。
incr_sync.mongo_fetch_method = oplog # 如果希望以change stream拉取,该值需要配置change_stream,支持>=4.0.1版本。
假设源是2节点:节点1是10.1.1.1:1001, 10.1.1.2:2002, 10.1.1.3:3003;节点2是10.2.2.1:1001, 10.2.2.2:2002, 10.2.2.3:3003,mongos:10.1.1.10:1010。目的端是sharding,有多个mongos:20.1.1.1:2021, 20.2.2.2:2022, 20.3.3.3:3033。
mongo_urls = mongodb://username1:password1@10.1.1.1:1001,10.1.1.2:2002,10.1.1.3:3003;mongodb://username2:password2@10.2.2.1:1001,10.2.2.2:2002,10.2.2.3:3003 #源端连接串信息,逗号分隔同一个shard不同的mongod,分号分隔不同的shard。
mongo_cs_url = mongodb://username1:password1@10.5.5.5:5555,10.5.5.6:5556 # 如果源端是sharding,此处需要配置源端sharding的cs的地址
mongo_s_url = mongodb://username_s:password_s@10.1.1.10:1010 # 如果希望采用change stream拉取,则还需要配置mongos的地址,一个就够了,否则该项可以不配置。
sync_mode = all # all 表示全量+增量,full表示仅全量,incr表示仅增量
incr_sync.tunnel.address = mongodb://username:password@20.1.1.1:2021,username:password@20.2.2.2:2022,username:password@20.3.3.3:3033 #目的端连接串信息,逗号分割不同的mongos。
incr_sync.mongo_fetch_method = oplog # 如果希望以change stream拉取,该值需要配置change_stream,支持>=4.0.1版本。
checkpoint.storage.url = # checkpoint写入的地址,默认对于写入源端
如果源端是阿里云的集群版,需要在控制台申请cs和mongod的地址。
假设源节点3个mongos节点:10.1.1.1:1001, 10.1.1.2:2002, 10.1.1.3:3003;目的端是sharding,有多个mongos:20.1.1.1:2021, 20.2.2.2:2022, 20.3.3.3:3033。
mongo_s_url = mongodb://username1:password1@10.1.1.1:1001,username1:password1@10.1.1.2:2002,username1:password1@10.1.1.3:3003/admin?connect=direct
mongo_ssl_root_ca_file = ssl证书路径,比如atlas只暴露SSL端口
sync_mode = all # all 表示全量+增量,full表示仅全量,incr表示仅增量
tunnel.address = mongodb://username:password@20.1.1.1:2021,username:password@20.2.2.2:2022,username:password@20.3.3.3:3033 #目的端连接串信息,逗号分割不同的mongos。
incr_sync.mongo_fetch_method = change_stream # 如果希望以change stream拉取,该值需要配置change_stream,支持>=4.0.1版本。
checkpoint.storage.url = # checkpoint写入的地址,默认对于写入源端
假设源是2节点:节点1是10.1.1.1:1001, 10.1.1.2:2002, 10.1.1.3:3003;节点2是10.2.2.1:1001, 10.2.2.2:2002, 10.2.2.3:3003,mongos:10.1.1.10:1010。目的端是副本集,三副本:10.5.5.5:5005, 10.6.6.6:6006, 10.7.7.7:7007
mongo_urls = mongodb://username1:password1@10.1.1.1:1001,10.1.1.2:2002,10.1.1.3:3003;mongodb://username2:password2@10.2.2.1:1001,10.2.2.2:2002,10.2.2.3:3003 #源端连接串信息,逗号分隔同一个shard不同的mongod,分号分隔不同的shard。
mongo_cs_url = mongodb://username1:password1@10.5.5.5:5555,10.5.5.6:5556 # 如果源端是sharding,此处需要配置源端sharding的cs的地址
mongo_s_url = mongodb://username_s:password_s@10.1.1.10:1010 # 如果希望采用change stream拉取,则还需要配置mongos的地址,一个就够了,否则该项可以不配置。
sync_mode = all # all 表示全量+增量,full表示仅全量,incr表示仅增量
incr_sync.tunnel.address = mongodb://username:password@10.5.5.5:5005,10.6.6.6:6006,10.7.7.7:7007 #目的端连接串信息,逗号分割不同的mongod下的节点。
incr_sync.mongo_fetch_method = oplog # 如果希望以change stream拉取,该值需要配置change_stream,支持>=4.0.1版本。
full_sync.collection_exist_no_drop = false # 由于是多个分片同步到一个,所以这里不能置为true
checkpoint.storage.url = # checkpoint写入的地址,默认写入源端
需要注意的是,如果需要全量同步(sync_mode为all或者full),则用户需要保证目的端库是空的,否则如果源跟目的端有db/collection一样,可能会导致源端同步过来的数据插入失败。
如果源端是阿里云的集群版,需要在控制台申请cs和mongod的地址。
假设源同样是三副本:10.1.1.1:1001, 10.2.2.2:2002, 10.3.3.3:3003,目的kafka是50.1.1.1:6379,topic是test。
mongo_urls = mongodb://username:password@10.1.1.1:1001,10.2.2.2:2002,10.3.3.3:3003 #源端连接串信息,逗号分隔不同的mongod
sync_mode = incr # 如果目的端不是mongodb,仅支持增量同步模式
incr_sync.tunnel = kafka
incr_sync.tunnel.address = test@50.1.1.1:6379
incr_sync.mongo_fetch_method = oplog # 如果希望以change stream拉取,该值需要配置change_stream,支持>=4.0.1版本。
云上副本集的双向同步可以参考副本集的单向同步,但是需要注意的有以下几点,假设A和B之间双向同步:
- 需要搭建2个mongoshake,一个从A到B,另一个从B到A
- 两条mongoshake不能同时用全量+增量(all)模式,正常应该是一个库为空(假设B),另一个有数据。那么从A到B先发起一次全量+增量同步,等待全量同步完毕以后,再从B到A发起一次增量同步。
- 双向同步需要依赖gid的开启,这个可以联系售后支持,开启gid将会重启实例造成秒级别闪断。
- 开启后将对应的gid配置在参数(incr_sync.oplog.gids里面,v2.4之前名字是oplog.gids),比如源端A的gid是100,目的端是B的gid是200,那么从A->B的MongoShake链路请配置
incr_sync.oplog.gids = 100,从B到A的请配置incr_sync.oplog.gids = 200。 - gid用于记录数据的产生地,比如从A产生的数据导入到B以后,不会被再导入回A,这样就不会产生环形复制。需要注意的是,这个gid只能用于增量,这也是第2条为什么一个方向通道是全量+增量,另一个方向通道需要搭建增量的原因。
- 云下开源的mongodb不能使用双向同步,因为gid的修改是在内核里面,所以开源不支持。
- sharding同样也支持双向同步