全量
1.开始准备
use photon
创建十张表。每个表均无_id以为的索引
每张表插入5千万条数据左右
2.源端插入数据
单条记录
{
"_id" : ObjectId("61bad4f68a27d20b123ed7e8"),
"BsonTimestamp1" : Timestamp(1639634166, 78),
"String" : "str",
"Doc" : {
"1" : 1
},
"javaInt" : 71916,
"bytes" : BinData(0,"AQ=="),
"Array" : [ ],
"Binary data" : BinData(0,"AQID"),
"ObjectId" : ObjectId("61bad4f68a27d20b123ed7e6"),
"Boolean" : false,
"Date" : ISODate("2021-12-16T05:56:06.688Z"),
"Null" : null,
"Regular Expression" : /lhp.*/,
"DBPointer" : DBPointer("1", ObjectId("61bad4f68a27d20b123ed7e7")),
"Undefined" : undefined,
"JavaScript" : {
"code" : "var i=0"
},
"Symbol" : "var i=0",
"BsonStr" : "var i=0",
"BsonJavaScriptWithScope" : {
"code" : "var i=0",
"scope" : {
}
},
"32integer" : 12,
"Timestamp" : ISODate("2021-12-16T05:56:06.688Z"),
"64int" : NumberLong(123),
"Min key" : { "$minKey" : 1 },
"Max key" : { "$maxKey" : 1 },
"BsonTimestamp" : Timestamp(1639634166, 457)
}
3.源端数据量计算
show dbs;
源端占用磁盘量 photon 35.885GB
db.stats()
{
"db" : "photon",
"collections" : 10,
"views" : 0,
"objects" : 474281344, // 总条数(大致)
"avgObjSize" : 132.06465577958498,// 每条数据大小 单位bytes
"dataSize" : 57890360946,
"storageSize" : 14807171072,
"freeStorageSize" : 4571136,
"indexes" : 20,
"indexSize" : 23723704320,
"indexFreeStorageSize" : 14454784,
"totalSize" : 38530875392,
"totalFreeStorageSize" : 19025920,
"scaleFactor" : 1,
"fsUsedSize" : 587772825600,
"fsTotalSize" : 11939478503424,
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1640065750, 1),
"signature" : {
"hash" : BinData(0,"v3ySiE7Zub+VPOJpQ/K3IaCJBxM="),
"keyId" : NumberLong("7025843880893349893")
}
},
"operationTime" : Timestamp(1640065750, 1)
}
4.启动DDT
该测试环境使用如下参数
# DDT.properties 配置文件
#任务名。不写则默认生成workNameDefault。
workName=mongoTask
#source端mongodb的url,必写。可以rul为单节点,复制集,分片
sourceDsUrl=mongodb://192.168.12.200:24578
#sourceDsUrl=mongodb://192.168.12.100:3999
#target端mongodb的url,必写。可以rul为单节点,复制集,分片
targetDsUrl=mongodb://192.168.12.100:24578
#同步模式 默认为all
# all 全量,全量同步表,不同步同步期间对源表进行的操作
syncMode=all
# 全量任务时,选择使用sync还是reactive
# sync:传输稳定
# reactive:速度更快
fullType=reactive
#需要同步的表,使用正则表达式书写。例如同步mongodb库下的所有表:mongodb\\..+ 默认同步全部表:.+
dbTableWhite=.+
#全量同步情况下读取源端任务线程数,最小为2,最大为100。默认值为系统计算值
sourceThreadNum=10
#全量同步情况下写入到目标端任务线程数,最小为4,最大为100 。默认值为系统计算值 建议targetThreadNum是sourceThreadNum的三倍
targetThreadNum=20
#全量同步情况下建立索引并发线程数,最小为1,最大为100 。默认值为系统计算值
createIndexThreadNum=15
##下面三个参数bucketSize,bucketNum,batchSize共同决定全量情况下,内存中缓存的数据条数,注意内存溢出的情况。
##均采用默认值则内存缓存20*20*128条数据,若每条数据100kb,则最大占用内存4.88G
#每批次数据的大小 默认为128
batchSize=128
#缓存桶个数 默认为20
bucketNum=20
#每个缓存桶缓存批次数量 默认为20
bucketSize=20
#同步中 每个DDL操作最大耗时 单位s
ddlWait=1200
# 全量同步时
# 数据传输前,预处理:同步集群中DDL信息
# 0:全量同步时 是否删除目标端已经存在的表
# 1:打印输出集群全部用户信息
# 2:同步库表表结构
# 3:同步库表索引信息
# 4:全部库开启库分片
# 5:同步库表shard key
# 6:同步config.setting表
# 7:库表预切分chunk
# 可以组合使用 例如 1,2,3,4,5,6 1,2,3,7 默认值为空
# 组合用逗号隔开
clusterInfoSet=0,1,2,3,4,5,6,7
# 开启monitor监控时,配置的本机ip地址
bind_ip=192.168.12.190
5.结论
在全量同步时,4线程读取源端数据,12线程进行写入数据。
总数据量474281344条,占用磁盘35.885GB。
用时6447秒传输完毕,平均每秒写入73672条数据,平均每秒写入5.708MB数据。
实时
1.启动DDT
该测试环境使用如下参数
# DDT.properties 配置文件
#任务名。不写则默认生成workNameDefault。
workName=mongoTask
#source端mongodb的url,必写。可以rul为单节点,复制集,分片
sourceDsUrl=mongodb://192.168.12.200:24578
#sourceDsUrl=mongodb://192.168.12.100:3999
#target端mongodb的url,必写。可以rul为单节点,复制集,分片
targetDsUrl=mongodb://192.168.12.100:24578
#同步模式 默认为all
# realTime 实时。开始时间和结束时间可以配置startOplogTime,endOplogTime
syncMode=realTime
# 实时或者增量任务时,选择使用oplog还是changestream
# 选择oplog,特点:源端为复制集,可以同步DDL,速度更快
# 选择changestream,支持:源端为复制集或mongos,不支持DDL,速度一般
realTimeType=changestream
#需要同步的表,使用正则表达式书写。例如同步mongodb库下的所有表:mongodb\\..+ 默认同步全部表:.+
dbTableWhite=.+
# 实时同步情况下可以同步drop,create,createIndexes,dropIndexes,renameCollection,convertToCapped,dropDatabase,modify,shardCollection
# 默认值为 * ,代表同步所有DDL操作
# 需要同步的DDL,多个ddl中间使用英文逗号隔离
ddlFilterSet=*
##下面三个参数bucketSize,bucketNum,batchSize共同决定全量情况下,内存中缓存的数据条数,注意内存溢出的情况。
##均采用默认值则内存缓存20*20*128条数据,若每条数据100kb,则最大占用内存4.88G
#每批次数据的大小 默认为128
batchSize=128
#缓存桶个数 默认为20
bucketNum=20
#每个缓存桶缓存批次数量 默认为20
bucketSize=20
#在实时同步时,设置读取oplog的开始时间,默认值为程序启动时刻的10位时间戳
startOplogTime=1692843646
#在实时同步时,设置读取oplog的结束时间,默认值为0即没有结束时间,否则则书写10位时间戳
endOplogTime=1692847246
#在实时同步时,设置读取oplog的延迟时间,默认值为0即没有延迟时间
delayTime=0
#在实时同步中解析桶的线程数的线程数,最小为8,最大为100。默认值为系统计算值
nsBucketThreadNum=15
#在实时同步中写数据的线程数的线程数,最小为8,最大为100。默认值为系统计算值
writeThreadNum=15
#同步中 每个DDL操作最大耗时 单位s
ddlWait=1200
# 开启monitor监控时,配置的本机ip地址
bind_ip=192.168.12.190
2.源端插入数据
源端启动脚本进行CRUD操作
脚本对10张表进行CRUD操作
单条插入数据模型
{
"_id" : ObjectId("61bad4f68a27d20b123ed7e8"),
"BsonTimestamp1" : Timestamp(1639634166, 78),
"String" : "str",
"Doc" : {
"1" : 1
},
"javaInt" : 71916,
"bytes" : BinData(0,"AQ=="),
"Array" : [ ],
"Binary data" : BinData(0,"AQID"),
"ObjectId" : ObjectId("61bad4f68a27d20b123ed7e6"),
"Boolean" : false,
"Date" : ISODate("2021-12-16T05:56:06.688Z"),
"Null" : null,
"Regular Expression" : /lhp.*/,
"DBPointer" : DBPointer("1", ObjectId("61bad4f68a27d20b123ed7e7")),
"Undefined" : undefined,
"JavaScript" : {
"code" : "var i=0"
},
"Symbol" : "var i=0",
"BsonStr" : "var i=0",
"BsonJavaScriptWithScope" : {
"code" : "var i=0",
"scope" : {
}
},
"32integer" : 12,
"Timestamp" : ISODate("2021-12-16T05:56:06.688Z"),
"64int" : NumberLong(123),
"Min key" : { "$minKey" : 1 },
"Max key" : { "$maxKey" : 1 },
"BsonTimestamp" : Timestamp(1639634166, 457)
}
源端CURD并发量共10w/s
3.结论
在实时同步时,源端CURD并发量共10w/s
目标端平均每秒执行58000条数据
源端CURD数据量过大时会造成DDT无法及时同步源表Oplog。及时观察'读取oplog延迟xxxs'数据,避免读取oplog时,错过滑动窗口时间。