【数据传输服务用户测评】阿里云DTS和MongoShake的性能对比

本文涉及的产品
数据管理 DMS,安全协同 3个实例 3个月
推荐场景:
学生管理系统数据库
数据传输服务 DTS,数据迁移 small 3个月
推荐场景:
MySQL数据库上云
数据传输服务 DTS,数据同步 1个月
简介: 本文聚焦DTS MongoDB->MongoDB 和 MongoShake 数据同步的性能,分别针对副本集/分片集群架构、单表/多表、全量/增量同步进行性能的对比。

导读

MongoShake是基于MongoDB的通用型平台服务,作为数据连通的桥梁,打通各个闭环节点的通道。MongoShake以golang语言进行编写,通过读取MongoDB集群的Oplog操作日志,对MongoDB的数据进行复制,后续通过操作日志实现特定需求。

相比于MongoShake方式,DTS MongoDB->MongoDB同步具有如下优势:

  • 可在阿里云DTS控制台上看到同步过程,比如现在同步任务正处于结构迁移,还是全量迁移,还是进入了增量迁移。可看到同步的RPS,BPS。可看到同步任务是否失败或者有延迟。
  • 由于阿里云DTS是第三方迁移工具,数据源MongoDB和目标MongoDB可以属于不同的VPC网络。
  • 支持ETL,库表映射等功能。
  • 支持数据过滤,可以只同步某个表指定条件的数据。 也可以选择只同步某些DML或者DDL。
  • 可以随时暂停、重启同步任务。支持断点续传。
  • 全量并发切片支持单表同时存在多类型_id的情况
  • 源端为MongoDB分片集群时,DTS采用从Shard读取数据和oplog的方式进行全量和增量同步,并且增量迁移期间源端不需要关闭balancer。

本文聚焦DTS MongoDB->MongoDB 和 MongoShake 数据同步的性能,分别针对副本集/分片集群架构、单表/多表、全量/增量同步进行性能的对比。

一、副本集

1.实例配置

源端:MongoDB4.4,8核16GB,300GB存储

目的端:MongoDB4.4,8核16GB,300GB存储

MongoShake2.6.6部署在阿里云ECS上:CentOS7,实例规格:ecs.u1-c1m2.2xlarge(8核16GB),通过 私网链接-专有网络(VPC)的形式连接源/目的端MongoDB实例

DTS通过反向VPC连接源/目的端MongoDB实例

2.单表全量迁移

2.1 源端数据准备

源端使用开源工具ycsb构建测试数据

ycsb使用方式可参考:https://github.com/brianfrankcooper/YCSB/

该项测试中,源端为单表1000W条数据,每条数据 10个field,每个field 100 bytes

使用 ycsb workloada 模板进行数据构建,部分参数如下:

recordcount=10000000
operationcount=10000000
workload=site.ycsb.workloads.CoreWorkload
readallfields=true
fieldcount=10
fieldlength=100
readproportion=0
updateproportion=0.3
scanproportion=0
insertproportion=0.7
requestdistribution=zipfian

ycsb 使用指令可参考:

cd ycsb所在目录
./bin/ycsb load mongodb -s -P workloads/workloada -p mongodb.url=mongodb://user:password@server1.example.com:9999,server2.example.com:9999/dbname -p table=tablename -threads 64

2.2 MongoShake单表全量迁移测试

MongoShake使用可参考:https://developer.aliyun.com/article/603329

2.2.1 MongoShake参数设置

修改MongoShake collector.config,部分参数如下

# --------------------------- full sync configuration ---------------------------
# the number of collection concurrence
# 并发最大拉取的表个数,例如,6表示同一时刻shake最多拉取6个表。
full_sync.reader.collection_parallel = 6
# the number of document writer thread in each collection.
# 同一个表内并发写的线程数,例如,8表示对于同一个表,将会有8个写线程进行并发写入。
full_sync.reader.write_document_parallel = 40
# number of documents in a batch insert in a document concurrence
# 目的端写入的batch大小,例如,128表示一个线程将会一次聚合128个文档然后再写入。
full_sync.reader.document_batch_size = 1024
# max number of fetching thread per table. default is 1
# 单个表最大拉取的线程数,默认是单线程拉取。需要具备splitVector权限。
# 注意:对单个表来说,仅支持索引对应的value是同种类型,如果有不同类型请勿启用该配置项!
full_sync.reader.parallel_thread = 3
# the parallel query index if set full_sync.reader.parallel_thread. index should only has
# 1 field.
# 如果设置了full_sync.reader.parallel_thread,还需要设置该参数,并行拉取所扫描的index,value
# 必须是同种类型。对于副本集,建议设置_id;对于集群版,建议设置shard_key。key只能有1个field。
full_sync.reader.parallel_index = _id
# enable majority write in full sync.
# the performance will degrade if enable.
# 全量阶段写入端是否启用majority write
full_sync.executor.majority_enable = true

2.2.2 MongoShake测试结果

迁移期间MongoShake所在ECS实例的cpu、内存、内网带宽等无瓶颈

通过目的端MongoDB实例的监控信息可得:MongoShake 上述单表全量迁移的QPS在8000个/s左右。

2.3 DTS单表全量迁移测试

目前DTS MongoDB->MongoDB 全量迁移免费试用,使用2xlarge规格链路进行全量迁移测试

默认运行内存8GB,40个线程并发写目的端

通过目的端MongoDB实例的监控信息可得:DTS 上述单表全量迁移的QPS在11000个/s左右。

3.多表全量迁移

3.1 源端数据准备

源端使用开源工具ycsb构建测试数据

该项测试中,源端为5张表,每张表表500W条数据,每条数据 10个field,每个field 100 bytes

使用 ycsb workloada 模板进行数据构建,部分参数如下

recordcount=5000000
operationcount=5000000
workload=site.ycsb.workloads.CoreWorkload
readallfields=true
fieldcount=10
fieldlength=100
readproportion=0
updateproportion=0.3
scanproportion=0
insertproportion=0.7
requestdistribution=zipfian

3.2 MongoShake多表全量迁移测试

迁移期间MongoShake所在ECS实例的cpu、内存、内网带宽等无瓶颈

通过目的端MongoDB实例的监控信息可得:MongoShake 上述多表全量迁移的QPS在18000个/s左右。

3.3 DTS 多表全量迁移测试

目前DTS MongoDB->MongoDB 全量迁移免费试用,使用2xlarge规格链路进行全量迁移测试

默认运行内存8GB,40个线程并发写目的端,同时考虑到读取数据对源端实例的压力,DTS限制了从源端拉取数据的线程数。

通过目的端MongoDB实例的监控信息可得:默认情况下 DTS 上述多表全量迁移的QPS在15000个/s左右。参照MongoShake 单表3个读线程的设置,在DTS 修改读线程数量后,上述多表全量迁移的QPS在20000个/s左右。

4.增量迁移

4.1 源端数据准备

源端使用开源工具ycsb构建测试数据

该项测试中,源端为1张表,单表500W条数据,每条数据 10个field,每个field 100 bytes

使用 ycsb workloada 模板进行数据构建,参数同上一小节

4.2 MongoShake增量迁移测试

4.2.1 MongoShake参数设置

修改MongoShake collector.config,部分参数如下

# --------------------------- incrmental sync configuration ---------------------------
# fetch method:
# oplog: fetch oplog from source mongodb (default)
# change_stream: use change to receive change event from source mongodb, support MongoDB >= 4.0.
# we recommand to use change_stream if possible.
incr_sync.mongo_fetch_method = oplog
# 同步模式,all表示全量+增量同步,full表示全量同步,incr表示增量同步。
sync_mode = incr
# hash的方式,id表示按文档hash,collection表示按表hash,auto表示自动选择hash类型。
# 如果没有索引建议选择id达到非常高的同步性能,反之请选择collection。
incr_sync.shard_key = auto
# 内部发送(写目的DB)的worker数目,如果机器性能足够,可以提高worker个数。
incr_sync.worker = 40
# batch_queue_size:每个worker线程的队列长度,worker线程从此队列取任务
# batching_max_size:一次分发给worker的任务最多包含多少个文档
# buffer_capacity:PendingQueue队列中一个buffer至少包含的文档个数,进行序列化
incr_sync.worker.batch_queue_size = 64
incr_sync.adaptive.batching_max_size = 1024
incr_sync.fetcher.buffer_capacity = 256
# 增量阶段写入端是否启用majority write
incr_sync.executor.majority_enable = true

4.2.2 MongoShake测试结果

迁移期间MongoShake所在ECS实例的cpu、内存、内网带宽等无瓶颈

通过目的端MongoDB实例的监控信息可得:MongoShake 上述增量迁移的QPS在44000个/s左右。

4.3 DTS 增量迁移测试

使用2xlarge规格链路进行增量迁移测试,40个线程写目的端。

通过目的端MongoDB实例的监控信息可得:DTS 上述增量迁移的QPS在49000个/s左右。

5.小结

迁移类型/QPS

MongoShake

DTS

单表全量

8000个/s

11000个/s

多表全量

18000个/s

20000个/s

增量

44000个/s

49000个/s

二、分片集群

1.架构说明

当源端是MongoDB分片集群时,MongoShake支持两种增量同步方案:1.直接读取各个shard的oplog并回放,但需要源端实例始终关闭balancer;2.通过Mongos来获取Change Stream,可以不关闭balancer,但性能弱于oplog的方式。

DTS采用直接拉取oplog的方式进行增量同步,并且通过分布式子任务的方式,实现了各个shard对应的同步链路之间的协同,解决了源端实例shard之间发生chunk move给同步带来的问题,使得在增量迁移期间源端实例可以开启balancer。

考虑到从各个shard直接读取数据和oplog进行迁移的方案与源端为副本集时类似,本章主要进行源端在开启balancer情况下,MongoShake使用ChangeStream进行增量同步与DTS增量同步的性能对比。

2.实例配置

源端:MongoDB4.2,2个Mongos:8核16GB,3个shard:8核16GB 200GB存储

目的端:MongoDB4.4,2个Mongos:8核16GB3个shard:8核16GB 200GB存储

MongoShake2.6.6部署在阿里云ECS上:CentOS7,实例规格:ecs.u1-c1m2.2xlarge(8核16GB),通过 私网链接-专有网络(VPC)的形式连接源/目的端MongoDB实例

DTS通过反向VPC连接源/目的端MongoDB实例

3.增量迁移

3.1源端数据准备

源端和目的端MongoDB实例已预先设置分片键:{"_id":"hashed"}

源端使用开源工具ycsb构建测试数据

该项测试中,源端为单表1000W条数据,每条数据 10个field,每个field 100 bytes

使用 ycsb workloada 模板进行数据构建,部分参数如下:

recordcount=10000000
operationcount=10000000
workload=site.ycsb.workloads.CoreWorkload
readallfields=true
fieldcount=10
fieldlength=100
readproportion=0
updateproportion=0.3
scanproportion=0
insertproportion=0.7
requestdistribution=zipfian

3.2 MongoShake Change Stream增量迁移测试

3.2.1 MongoShake参数设置

修改MongoShake collector.config,部分参数如下

# --------------------------- incrmental sync configuration ---------------------------
# fetch method:
# oplog: fetch oplog from source mongodb (default)
# change_stream: use change to receive change event from source mongodb, support MongoDB >= 4.0.
# we recommand to use change_stream if possible.
incr_sync.mongo_fetch_method = change_stream
# 同步模式,all表示全量+增量同步,full表示全量同步,incr表示增量同步。
sync_mode = incr
# hash的方式,id表示按文档hash,collection表示按表hash,auto表示自动选择hash类型。
# 如果没有索引建议选择id达到非常高的同步性能,反之请选择collection。
incr_sync.shard_key = auto
# 内部发送(写目的DB)的worker数目,如果机器性能足够,可以提高worker个数。
incr_sync.worker = 40
# batch_queue_size:每个worker线程的队列长度,worker线程从此队列取任务
# batching_max_size:一次分发给worker的任务最多包含多少个文档
# buffer_capacity:PendingQueue队列中一个buffer至少包含的文档个数,进行序列化
incr_sync.worker.batch_queue_size = 64
incr_sync.adaptive.batching_max_size = 1024
incr_sync.fetcher.buffer_capacity = 256
# 增量阶段写入端是否启用majority write
incr_sync.executor.majority_enable = true

3.2.2 MongoShake测试结果

在源端MongoDB分片集群开启balancer的情况下,MongoShake只支持从Mongos上获取ChangeStream来进行增量同步的方案。

迁移期间MongoShake所在ECS实例的cpu、内存、内网带宽等无瓶颈

通过目的端MongoDB实例的监控信息可得:

MongoShake 上述增量迁移过程中 Mongos1的QPS在28000个/s左右,Mongos2上未发现增量迁移写入流量,总迁移速度约为28000个/s。

Mongos1: 平均ops为28000个/s

Mongos2: 未发现增量迁移写入流量

3.3 DTS增量迁移测试

DTS采用直接拉取oplog的方式进行增量同步,为源端每个shard创建对应的分布式子任务进行协同,使得增量迁移期间源端MongoDB分片集群可开启balancer。

使用2xlarge规格链路进行增量迁移测试,40个线程写目的端。通过目的端MongoDB实例的监控信息可得:上述增量迁移过程中 Mongos1和Mongos2上的QPS均在23000个/s左右,总迁移速度约为46000个/s。

Mongos1: 平均ops为23000个/s

Mongos2:平均ops为23000个/s

4.小结

迁移类型/QPS

MongoShake(ChangeStream)

DTS

增量

28000个/s

46000个/s

三、总结

本文聚焦DTS MongoDB->MongoDB 和 MongoShake 数据同步的性能,分别针对副本集/分片集群架构、单表/多表、全量/增量同步进行性能的对比,整体上DTS的同步性能优于MongoShake,具体结果如下:

副本集->副本集

迁移类型/QPS

MongoShake

DTS

单表全量

8000个/s

11000个/s

多表全量

18000个/s

20000个/s

增量

44000个/s

49000个/s

分片集群->分片集群

迁移类型/QPS

MongoShake

DTS

增量

28000个/s

46000个/s

四 、快来关注

  1. 数据传输服务(Data Transmission Service,简称DTS)支持关系型数据库、NoSQL、大数据(OLAP)等数据源,集数据迁移、订阅、实时同步、校验功能于一体,能够解决公共云、混合云场景下,远距离、秒级异步数据传输难题。其底层基础设施采用阿里双11异地多活架构,为数千下游应用提供实时数据流,已在线上稳定运行7年之久,是一款沉淀了丰富实践经验的可靠产品。点击了解更多DTS相关信息
  2. 欢迎加入钉群讨论交流:

相关实践学习
一小时快速掌握 SQL 语法
本实验带您学习SQL的基础语法,快速入门SQL。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
相关文章
|
18天前
|
弹性计算
阿里云3M带宽云服务器并发多大?阿里云3M带宽云服务器测评参考
在探讨云服务器3M带宽能支持多大并发这一问题时,我们首先要明白一个关键点:并发量并非仅由带宽决定,还与网站本身的大小密切相关。一般来说,一个优化良好的普通网站页面大小可能只有几K,为便于计算,我们可以暂且假定每个页面大小为50K。
894 1
|
4天前
|
SQL 运维 关系型数据库
阿里云DTS踩坑经验分享系列|数据不一致修复大法
阿里云数据传输服务DTS在帮助用户迁移数据、同步数据时,在某些复杂场景下会出现源库与目标库数据不一致的问题,造成数据错误,给用户带来困扰。由于数据不一致的问题很难完全避免,为了及时修复不一致的数据,DTS产品推出数据订正功能,保障用户在同步\迁移数据时的数据一致性。本文介绍了产生数据不一致的一些典型场景,并重点阐述了如何使用DTS数据订正功能来修复不一致的数据。
202 4
|
5天前
|
存储 安全 数据挖掘
性能30%↑|阿里云AnalyticDB*AMD EPYC,数据分析步入Next Level
第4代 AMD EPYC加持,云原生数仓AnalyticDB分析轻松提速。
性能30%↑|阿里云AnalyticDB*AMD EPYC,数据分析步入Next Level
|
5天前
|
存储 安全 数据挖掘
性能30%↑|阿里云AnalyticDB X AMD EPYC,数据分析步入Next Level
阿里云原生数仓 AnalyticDB for PostgreSQL 与 AMD 新一代硬件深度优化,结合全自研计算引擎及行列混合存储实现性能升级,综合性能提升30%。结合丰富的企业级能力帮助企业构建离在线一体、流批一体综合数据分析平台,采用同一引擎即可满足离线批处理、流式加工,交互式分析三种场景,在开发运维、时效性及成本上具备更高的性价比。
402 0
|
6天前
|
存储 弹性计算 网络协议
【阿里云弹性计算】ECS实例性能测试报告:阿里云实例性能横向评测
【5月更文挑战第27天】阿里云ECS性能横向评测对比了经济型e系列、计算型c7a系列实例的CPU、内存、网络和存储性能。使用SPEC CPU 2017、Stream、iperf和fio工具进行测试。结果显示,计算型c7a系列在CPU和网络性能上突出,经济型e系列性价比高。所有实例内存性能良好,ESSD云盘提供出色存储性能。用户应根据业务需求选择合适实例。
23 0
|
9天前
|
存储 弹性计算 人工智能
【阿里云弹性计算】深度解析阿里云ECS弹性裸金属服务器:性能与弹性的完美平衡
【5月更文挑战第24天】阿里云ECS弹性裸金属服务器融合物理机高性能与云服务弹性,提供计算、存储及网络优势。支持秒级伸缩、自动扩展,适用于高性能计算、游戏、企业应用及AI场景。示例代码展示如何通过CLI创建实例,是高需求场景的理想选择。
62 0
|
11天前
|
弹性计算 数据挖掘 应用服务中间件
阿里云服务器通用算力型U1实例解析,实例性能、适用场景及常见问题参考
在阿里云服务器的所有实例规格中,通用算力型u1实例主打的是高性价比,通用算力型U1实例云服务器自推出以来,就受到了广大用户的关注,也是目前阿里云的活动中比较热门的云服务器实例,这个实例规格的性能要好于经济型e等共享型实例,价格又比计算型c7、通用型g7等其他企业级实例要低一些。本文将深入解析通用算力型U1实例的特点、适用场景以及价格优势,帮助用户更好地了解该云服务器实例。
阿里云服务器通用算力型U1实例解析,实例性能、适用场景及常见问题参考
|
13天前
|
存储 弹性计算 缓存
阿里云服务器通用型g8i实例最新收费标准与性能介绍
阿里云ECS通用型g8i服务器采用阿里云全新CIPU架构,可提供稳定的算力输出、更强劲的I/O引擎以及芯片级的安全加固。ECS通用型g8i实例支持开启或关闭超线程配置,单台g8i实例最高支持100万IOPS。阿里云ECS通用型g8i实例CPU采用Intel®Xeon®Emerald Rapids或者Intel®Xeon®Sapphire Rapids,主频不低于2.7 GHz,全核睿频3.2GHz。本文为大家介绍通用型g8i实例最新收费标准及性能。
阿里云服务器通用型g8i实例最新收费标准与性能介绍
|
18天前
|
存储 弹性计算 安全
阿里云服务器计算型c8i实例最新收费标准与性能介绍
阿里云ECS计算型c8i服务器采用阿里云全新CIPU架构,可提供稳定的算力输出、更强劲的I/O引擎以及芯片级的安全加固。ECS计算型c8i实例支持开启或关闭超线程配置,单台c8i实例最高支持100万IOPS。阿里云ECS计算型c8i实例CPU采用Intel®Xeon®Emerald Rapids或者Intel®Xeon®Sapphire Rapids,主频不低于2.7 GHz,全核睿频3.2GHz。本文为大家介绍计算型c8i实例最新收费标准及性能。
阿里云服务器计算型c8i实例最新收费标准与性能介绍
|
18天前
|
存储 编解码 安全
阿里云服务器计算型、通用型、内存型主要实例性能及选择参考
在阿里云的活动中,属于计算型实例规格的云服务器主要有计算型c7、计算型c7a、计算型c8a、计算型c8y、计算型c8i这几个实例规格,属于通用型实例规格的云服务器有通用型g7、通用型g7a、通用型g8a、通用型g8y、通用型g8i,属于内存型实例规格的云服务器有内存型r7、内存型r8a、内存型r8y、内存型r8i等实例。不同实例规格的云服务器在架构、计算、存储、网络、安全等方面有着不同,因此,其适用场景也有所不同。本文来详细介绍一下阿里云服务器计算型、通用型、内存型主要实例计算、存储等性能及其适用场景,以供参考。
阿里云服务器计算型、通用型、内存型主要实例性能及选择参考

热门文章

最新文章