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

本文涉及的产品
数据传输服务 DTS,数据同步 small 3个月
推荐场景:
数据库上云
数据管理 DMS,安全协同 3个实例 3个月
推荐场景:
学生管理系统数据库
数据传输服务 DTS,数据迁移 small 3个月
推荐场景:
MySQL数据库上云
简介: 本文聚焦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. 欢迎加入钉群讨论交流:

相关实践学习
2分钟自动化部署人生模拟器
本场景将带你借助云效流水线Flow实现人生模拟器小游戏的自动化部署
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4天前
|
SQL 关系型数据库 MySQL
阿里云DTS踩坑经验分享系列|DTS SelectDB链路最佳实践
大数据时代背景下,高效的数据流转与实时分析能力对于企业的竞争力至关重要。阿里云数据传输服务DTS与SelectDB联合,为用户提供了简单、实时、极速且低成本的事务数据分析方案。用户可以通过 DTS 数据传输服务,一键将自建 MySQL/PostgreSQL、RDS MySQL/PostgreSQL、PolarDB for MySQL/PostgreSQL 数据库,迁移或同步至阿里云数据库 SelectDB 的实例中,帮助企业在短时间内完成数据迁移或同步,并即时获得深度洞察。
49 3
|
17天前
|
存储 数据采集 监控
阿里云DTS踩坑经验分享系列|SLS同步至ClickHouse集群
作为强大的日志服务引擎,SLS 积累了用户海量的数据。为了实现数据的自由流通,DTS 开发了以 SLS 为源的数据同步插件。目前,该插件已经支持将数据从 SLS 同步到 ClickHouse。通过这条高效的同步链路,客户不仅能够利用 SLS 卓越的数据采集和处理能力,还能够充分发挥 ClickHouse 在数据分析和查询性能方面的优势,帮助企业显著提高数据查询速度,同时有效降低存储成本,从而在数据驱动决策和资源优化配置上取得更大成效。
112 9
|
4月前
|
存储 安全 关系型数据库
跨越地域的数据传输大冒险!如何轻松更换DTS实例地域,全面攻略揭秘!
【8月更文挑战第15天】在数字时代的浪潮中,数据传输服务(DTS)是企业跨地域扩张的重要桥梁。然而,更换DTS实例地域就像是一场冒险旅程,充满了未知和挑战。本文将带你踏上这场跨越地域的数据传输大冒险,揭示如何轻松更换DTS实例地域的秘密。无论你是追求速度的迁移高手,还是成本敏感的手动操作者,这里都有你需要的答案。让我们一起探索这个神秘的世界,解锁数据传输的无限可能!
53 0
|
23天前
|
弹性计算 安全 容灾
阿里云DTS踩坑经验分享系列|使用VPC数据通道解决网络冲突问题
阿里云DTS作为数据世界高速传输通道的建造者,每周为您分享一个避坑技巧,助力数据之旅更加快捷、便利、安全。本文介绍如何使用VPC数据通道解决网络冲突问题。
77 0
|
3月前
|
NoSQL 安全 容灾
阿里云DTS踩坑经验分享系列|Redis迁移、同步
阿里云数据传输服务DTS在帮助用户迁移Redis数据、同步数据时,在某些复杂场景下会出现报错,或者源库与目标库数据不一致的问题,给用户带来困扰。本文介绍了DTS Redis到Redis迁移、同步过程中的典型问题,以帮助用户更好地使用DTS。
249 2
|
4月前
|
关系型数据库 MySQL OLAP
数据传输DTS是什么?
【8月更文挑战第30天】数据传输DTS是什么?
366 3
|
5月前
|
SQL 负载均衡 安全
阿里云DTS踩坑经验分享系列|全量迁移加速方法指南
阿里云数据传输服务DTS是一个便捷、高效的数据迁移和数据同步服务。一般而言,一个完整的DTS数据迁移任务主要包括预检查、结构迁移,全量迁移,增量迁移等阶段,其中全量迁移会将源数据库的存量数据全部迁移到目标数据库。面对各种各样的用户场景, 本文将重点介绍如何使用阿里云DTS实现全量数据迁移加速,以缩短迁移时间,确保数据迁移的效率和稳定性。
583 0
|
6月前
|
关系型数据库 MySQL 分布式数据库
PolarDB操作报错合集之当使用DTS(数据传输服务)同步的表在目标库中进行LEFT JOIN查询时遇到异常,是什么导致的
在使用阿里云的PolarDB(包括PolarDB-X)时,用户可能会遇到各种操作报错。下面汇总了一些常见的报错情况及其可能的原因和解决办法:1.安装PolarDB-X报错、2.PolarDB安装后无法连接、3.PolarDB-X 使用rpm安装启动卡顿、4.PolarDB执行UPDATE/INSERT报错、5.DDL操作提示“Lock conflict”、6.数据集成时联通PolarDB报错、7.编译DN报错(RockyLinux)、8.CheckStorage报错(源数据库实例被删除)、9.嵌套事务错误(TDDL-4604)。
|
7月前
|
SQL 分布式计算 监控
在数据传输服务(DTS)中,要查看每个小时源端产生了多少条数据
【2月更文挑战第32天】在数据传输服务(DTS)中,要查看每个小时源端产生了多少条数据
73 6
|
7月前
|
存储 SQL NoSQL
数据传输DTS同步问题之同步失败如何解决
数据传输服务(DTS)是一项专注于数据迁移和同步的云服务,在使用过程中可能遇到多种问题,本合集精选常见的DTS数据传输问题及其答疑解惑,以助用户顺利实现数据流转。