Skip to content

最佳实践——常见场景配置

zhangst edited this page Dec 13, 2022 · 4 revisions

本文主要列举一些场景场景的配置。本文以2.4之后版本的参数为准,2.4以前的版本参数名字有所不同,具体请查看配置文件的说明。
具体配置项含义请参考:配置参数说明

公共参数部分

  • 当希望从源端的secondary上读取时,可以在连接传中增加参数readPreference=secondary
mongo_urls = mongodb://username:password@10.1.1.1:1001/admin #从源端的Primary读数据
mongo_urls = mongodb://username:password@10.1.1.1:1001/admin?readPreference=secondary #从源端的Secondary读数据

1. 从MongoDB副本集同步到MongoDB副本集

假设源端是三副本: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/admin #源端连接串信息,逗号分隔不同的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/admin #目的端连接串信息,逗号分隔不同的mongod
incr_sync.mongo_fetch_method = oplog # 如果希望以change stream拉取,该值需要配置change_stream,支持>=4.0.1版本。

2. 从MongoDB副本集同步到MongoDB分片集群版

假设源同样是三副本: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,目的只写入所以只需要mongos的地址。 迁移完成后数据都会落在分片集群的主分片上,如需分片,参考官方文档对迁移的表进行分片。

mongo_urls = mongodb://username:password@10.1.1.1:1001,10.2.2.2:2002,10.3.3.3:3003/admin #源端连接串信息,逗号分隔不同的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/admin #目的端连接串信息,逗号分割不同的mongos。也可以只配置部分,配置多个mongos可以做负载均衡写入。
incr_sync.mongo_fetch_method = oplog # 如果希望以change stream拉取,该值需要配置change_stream,支持>=4.0.1版本。

3. 从MongoDB分片集群版同步到MongoDB分片集群版

假设源是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,ConfigServer地址是10.5.5.5:5555,10.5.5.6:5556。目的端是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/admin #源端连接串信息,逗号分隔同一个shard不同的mongod,分号分隔不同的shard。
mongo_cs_url = mongodb://username1:password1@10.5.5.5:5555,10.5.5.6:5556/admin # 如果源端是sharding,此处需要配置源端sharding的cs的地址
mongo_s_url = mongodb://username_s:password_s@10.1.1.10:1010/admin # 如果希望采用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的地址。

4. 从只暴露mongos地址的MongoDB分片集群版同步到MongoDB分片集群版

部分源端分片集群不对外暴露分片节点的地址,这是就需要通过源端的mongos来读取所有数据。假设源节点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/admin #目的端连接串信息,逗号分割不同的mongos。
incr_sync.mongo_fetch_method = change_stream # 这里只可以为change_stream,支持>=4.0.1版本。
checkpoint.storage.url = # checkpoint写入的地址,默认对于写入源端

5. 从MongoDB集群版同步到MongoDB副本集

假设源是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,ConfigServer地址为10.5.5.5:5555,10.5.5.6:5556。目的端是副本集,三副本: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/admin #源端连接串信息,逗号分隔同一个shard不同的mongod,分号分隔不同的shard。
mongo_cs_url = mongodb://username1:password1@10.5.5.5:5555,10.5.5.6:5556/admin # 如果源端是sharding,此处需要配置源端sharding的cs的地址
mongo_s_url = mongodb://username_s:password_s@10.1.1.10:1010/admin # 如果希望采用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/admin #目的端连接串信息,逗号分割不同的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的地址。

6. 从MongoDB副本集同步到kafka通道

假设源同样是三副本: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/admin #源端连接串信息,逗号分隔不同的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版本。

7. 阿里云云上MongoDB副本集的双向同步

云上副本集的双向同步可以参考副本集的单向同步,但是需要注意的有以下几点,假设A和B之间双向同步:

  1. 需要搭建2个mongoshake,一个从A到B,另一个从B到A
  2. 两条mongoshake不能同时用全量+增量(all)模式,正常应该是一个库为空(假设B),另一个有数据。那么从A到B先发起一次全量+增量同步,等待全量同步完毕以后,再从B到A发起一次增量同步。
  3. 双向同步需要依赖gid的开启,这个可以联系售后支持,开启gid将会重启实例造成秒级别闪断。
  4. 开启后将对应的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
  5. gid用于记录数据的产生地,比如从A产生的数据导入到B以后,不会被再导入回A,这样就不会产生环形复制。需要注意的是,这个gid只能用于增量,这也是第2条为什么一个方向通道是全量+增量,另一个方向通道需要搭建增量的原因。
  6. 云下开源的mongodb不能使用双向同步,因为gid的修改是在内核里面,所以开源不支持。
  7. sharding同样也支持双向同步

8. 实现MongoDB实例间的延迟同步

执行vi collector.conf命令配置MongoShake。各参数说明请参见MongoShake参数表。找到incr_sync.target_delay参数,根据实际业务需求设置该参数的值,单位为秒。本示例中将延迟时间设置为30分钟。

incr_sync.target_delay = 1800

运行后,此时您在源DB中执行的任何更改,都将会在30分钟后同步到从实例。

误操作后切换主从实例

在主实例中日常执行CURD操作时,可能会存在某条语句误写入等误操作的情况发生,此时您可以通过下列步骤将业务切换到还没有发生误操作的从实例中。

  1. 通过查询MongoDB的操作日志(oplog)定位到误操作发生的时间点。例如:您可以通过执行如下命令来查询2020年06月01日至2020年06月02日之间所有的操作日志。关于查询oplog的详情请参见MongoDB官方文档
use local #切换到local数据库
db.oplog.rs.find({"o.createTime": {$gte:new Date(2020,6,1),$lte:new Date(2020,6,2)}}) #根据条件查看oplog。
  1. 通过RESTful接口远程向MongoShake注入ExitPoint参数来实现在指定时间点终止MongoShake程序的目的。命令格式如下:
curl -X POST --data '{"ExitPoint": <Unix时间戳>}' <MongoShake服务器ID>:<端口号>/sentinel/options

示例:

curl -X POST --data '{"ExitPoint": 1593534600}' 127.0.0.1:9100/sentinel/options

# 1593534600是Unix时间戳,表示2020年06月30日16:30:00。MongoShake同步到这个时间点后将会自动退出。
  1. MongoShake退出后,可以将未被误操作的从实例切换为主实例来使用。
Clone this wiki locally