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

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

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
传感器 数据采集 监控
基于阿里云MQTT服务,设计一个STM32的智能光伏控制系统
这篇文章详细介绍了利用STM32F103C8T6单片机实现光伏发电系统的关键技术。全文分为四章:第一章阐述了光伏发电的背景、意义及应用场景,强调其在绿色能源领域的重要性。第二章介绍了如何通过STM32F103C8T6及光敏电阻和伺服电机实现光线追踪系统,详细描述了硬件选择、连接及使用HAL库编写的单片机程序。第三章讲解了最大功率点追踪(MPPT)的原理,并展示了如何利用STM32F103C8T6和相关传感器、DC-DC转换器实现MPPT功能。第四章描述了如何通过STM32F103C8T6与SIM7600CE 4G模块连接到阿里云MQTT服务,实现设备状态数据的远程传输和控制。本文提供了全面的硬
17600 5
|
9天前
|
弹性计算 Prometheus 监控
如何从自建开源 Prometheus 迁移到阿里云托管 Prometheus 服务
阿里云可观测监控 Prometheus 版提供高性能、高可用、全托管的监控服务,对接开源生态,支持 Kubernetes、ECS 等场景,解决了自建 Prometheus+Thanos 高成本、运维复杂的问题。本文讨论在各个典型场景下的迁移方案。
10287 12
|
10天前
|
搜索推荐 API 对象存储
|
10天前
|
分布式计算 搜索推荐 API
|
29天前
|
存储 敏捷开发 测试技术
阿里云云效产品使用问题之服务链接如何进行修改
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
29天前
|
缓存 Linux Docker
CentOS 7 下安装 Docker 及配置阿里云加速服务
CentOS 7 下安装 Docker 及配置阿里云加速服务
459 1
|
1月前
|
Perl
Centos8同步时间(阿里云NTP服务为例)
Centos8同步时间(阿里云NTP服务为例)
123 1
|
1月前
|
SQL 人工智能 API
openai停止中国的api服务,但是性能相当的阿里云免费提供迁移
OpenAI暂停中国API服务,阿里云百炼响应迅速,提供免费tokens(2200万)与迁移服务给受影响开发者。Qwen2-72B与GPT-4同列全球第四(HELM MMLU榜)。Qwen-plus调用成本仅GPT-4的1/50。阿里云百炼以开放性著称,兼容LlamaIndex等,支持多种数据源及自定义组件,加速AI应用集成。官网有丰富资源,助力快速上手大模型开发。
113 0
|
10天前
|
弹性计算 Java 关系型数据库

热门文章

最新文章