背景:需要从源库迁移到目标库,并且要将其中一个集合转化为时序集合。
经测试,使用mongoshake的机器配置相同的情况下,如果从源库同步到目标库预创建的时序集合,4亿数据量大概5小时左右,而且无法进行增量同步。如果是直接同步只需半小时,可以进行增量同步,最后采用的方式是直接同步,然后停服进行时序集合转换。
mongoshake的迁移文档比较老旧,目前最新版是2.8.5,很多参数已经发生变化但是文档依然保留的是老参数。
mongoshake-2.8.5 配置文件实测可用参数如下
conf.version = 10
id = mongoshake
log.level = info
log.dir =
log.file = collector.log
tunnel = direct
# 这里是副本集同步副本集
mongo_urls = mongodb://admin:pwd@172.23.1.3:27218,172.23.1.4:27218,172.23.1.5:27218/admin
sync_mode = all # 全量+增量
incr_sync.tunnel.address = mongodb://admin:pwd@172.23.1.11:27017,172.23.1.12:27017/admin
incr_sync.mongo_fetch_method = oplog # 4.0以后可以使用change_stream
#incr_sync.mongo_fetch_method = change_stream
full_sync.collection_exist_drop = false
checkpoint.storage.url =
full_sync.create_index = none # 全量完成后是否创建索引
full_sync.executor.insert_on_dup_update = true
full_sync.reader.write_document_parallel = 16 # 并发相关参数,需要根据源端来调整,实测设置太大会造成巨大波动
full_sync.reader.parallel_thread = 16
full_sync.reader.document_batch_size = 512
incr_sync.tunnel.write_thread = 16
filter.namespace.black = config,admin,local # 需要排除的库
时序集合转换流程,注意时序集合不能重命名
# 重命名旧集合
db.latlon.renameCollection("latlon_bak");
# 创建时序集合
db.createCollection("latlon", {
timeseries: {
timeField: "uploadTime",
metaField: "sn",
granularity: "minutes"
}
});
# 将旧集合导入时序集合
db.latlon_bak.aggregate([
{ $sort: { sn: 1, uploadTime: 1 } },
{ $out: "latlon" }
], { allowDiskUse: true });