当前位置: 首页 > news >正文

Mongo3.4升级到mongo6性能降低9倍

time:2025/05/07

Author:skatexg

一、背景与目标

阿里云mongo3.0和3.4要停服下线,倒逼我们把mongo升级到高版本;和产线研发沟通后,决定把mongo升级到6.0版本

原实例的基础信息如下

mongo版本:3.4

实例规格配置:8核64G 3300G本地磁盘

说明:

1)其中一个大表2700G,集合默认压缩算法snappy;

  1. 程序连接mongo的url采用默认参数值(默认的w=1 and journal=0

目标实例基础信息:

mongo版本:6.0

实例规格配置: 8核64G(独享型) 3300G ESSD AutoPL云盘

说明:

1) 默认压缩算法snappy;程序连接mongo的url采用默认参数值(w:=majority and journal=1

二、升级过程遇到的问题

  1. 同样的数据量,6.0版本占用存储空间比3.4版本要多很多(如测试发现3.4版本的13G的数据在6.0版本占用20G存储空间)
  2. 6.0版本的写性能比3.4版本的写性能低9倍

三、解决方案

  1. mongo6.0版本存储空间占用比较多

原因分析:因为6.0版本的数据结构变化,导致和3.4版本比,在同样的表压缩算法下,相同的数据会占用更多的存储空间;

mongo6.0提供如下几个压缩算法(storage.wiredTiger.collectionConfig.blockCompressor

  1. Snappy: 压缩简单明了,它追求极高的速度和合理的压缩
  2. Zlib: 压缩的工作方式略有不同,通常能获得更好的压缩率(与 snappy 和 zlib 之间的固有差异无关),这需要更多的 CPU 资源。
  3. Zstd 是一种较新的压缩算法,由 Facebook 开发,比 zlib 有了改进(压缩率更高、CPU 占用更少、性能更快)。

经过测试mongo6.0使用zstd压缩算法和mongo3.4使用snappy压缩算法的读写性能相似,如下图

但是zstd占用存储空间对比snappy下少很多,如下图

结论:mongo6.0使用zstd压缩算法和mongo3.4使用snappy压缩算法下,读写性能没有损失,但是占用存储空间会少10%

2、mongo3.4版本的写性能比mongo6.0版本的写性能高9倍

原因分析:mongo3.4版本在客户端url没指定参数时,默认的w=1 and journal=0;从MongoDB 5.0 开始,隐式默认写关注为 w: majority,且journal=1

mongo3.4版本

mongo6版本

写操作写入本地内存就确认提交成功

写操作被复制多数节点后才确认提交成功

参数说明如下:

1)w参数说明:这个选项会通过确认写入操作已传播到指定数量的 mongod 实例才算提交成功。如果写关注缺少 w 字段,MongoDB 则会将 w 选项设为默认写关注

w的参数值

说明

majority

等待写操作被复制到副本集中大多数节点上后才确认提交成功,数据不会被回滚;节点越多,变更性能影响越大

1

表示写(write)确认,为MongoDB 5.0版本以前的默认行为。确认写操作在内存中已完成,但由于还没有持久化,可能发生数据丢失;如果存储的是日志信息,可以设置W=1,确认返回更快,数据写入更快

0

要求不确认写入操作是否完成就返回提交成功;这个虽然写入更快,但是容易丢失数据

2)journal参数说明:这个选项会要求 MongoDB 确认写入操作已写入磁盘日志

true

表示日志(journal)确认。确认写操作已完成并刷到持久化存储的WAL中,写操作不会丢失。

false

表示日志(journal)确认。确认写操作已完成写入到内存中,写操作可能会丢失。

3)wtimeoutMS

此选项指定写关注的时间限制(以毫秒为单位),如果wtimeoutMS0,写操作永远不会超时,如果写入操作不成功容易产生长阻塞

参数参考:

写关注 - MongoDB 手册 v8.0

事务与Read/Write Concern_云数据库 MongoDB 版(MongoDB)-阿里云帮助中心

测试结果如下:

测试总结如下

测试条件(url参数)

测试结果

说明

mongo3.4 本地盘 ,w=1 and journal=0

红色框1:10000条记录的时间6秒

原始业务

mongo6 Auto云盘 , w=majority and journal=1 and wtimeoutMS=5000

红色框2:10000条记录的时间54秒

不满足业务性能要求

mongo6 Auto云盘 , w=0 and journal=0 and wtimeoutMS=5000

红色框3:10000条记录的时间7秒

不满足稳定性要求

mongo6 Auto云盘 , w=1 and journal=0 and wtimeoutMS=5000

红色框4:10000条记录的时间20秒

平衡了性能和稳定性,可以满足业务

结论:

1、【mongo6 Auto云盘 , w=1 and journal=0 and wtimeoutMS=5000】的写入性能比 【mongo3.4 本地盘 ,w=1 and journal=0】慢3-4倍,但可以满足业务;这3-4倍的差距是因为本地盘(微秒级延迟)和云盘(2ms延迟)的性能差距

  • 升级后实践效果

mongo升级前后,性能差不多,没有明显变化,如下图:

指标项

升级前(3.4)【w=1 and journal=0

升级后(6.0)【w=1 and journal=0 and wtimeoutMS=5000

cpu%

iops%

平均响应时间(微秒)

存储空间

2700G

263G

  • 最佳实践场景
  1. 对数据可用性要求高的场景

{w=majority}: Write Concern可以确保副本集中大部分节点已经确认写入操作,即便此时发生节点故障或异常切换也不会产生数据丢失或者回滚的风险;在配合j=true,确认写操作已完成并刷到持久化存储的WAL中,数据可靠性更高

建议值

URL参数:{w=majority and journal=1 and wtimeoutMS=5000}

storage.wiredTiger.collectionConfig.blockCompressor=zstd

  1. 对写入性能要求高的场景

{w:1}: Write Concern通常能带来更好的写入性能,适合重写入的场景。

说明:

  1. 应合理关注监控中的从节点复制延迟,当延迟过大时可能会出现主节点异常rollback的问题。
  2. 当复制延迟超过了oplog的保留时长后,从节点将进入异常的recovering状态且无法自愈,降低实例可用性。

建议值

URL参数:{w=1 and journal=0 and wtimeoutMS=5000}

storage.wiredTiger.collectionConfig.blockCompressor=zstd

---end---

相关文章:

  • spring cloud alibaba nacos 服务注册
  • 回溯进阶(一):以全排列问题为例,来展示如何对回溯的纵向和横向进行操作
  • 成功解决 AttributeError: module ‘pathlib‘ has no attribute ‘_Accessor‘
  • gbase8s数据库 tcp连接不同阶段的超时处理
  • BFC理解
  • 60页PDF | 四川电信数据湖 + 数据中台实施方案:覆盖数据能力、数据资产及数据治理的全流程建设指南
  • spring cloud gateway 断言(Predicates)与过滤器(filters)
  • day009-用户管理专题
  • Go语言八股之channel详解
  • 火绒互联网安全软件:自主引擎,精准防御
  • 迈向AI辅助数据分析代码生成的透明性与知识共享
  • Java游戏服务器开发流水账(1)游戏服务器的架构浅析
  • 【C++游戏引擎开发】第32篇:物理引擎(Bullet)—约束系统
  • java基础-数组
  • 【AI论文】
  • oracle 数据库sql 语句处理过程
  • 用 NGINX 打造高性能 FastCGI 加速 `ngx_http_fastcgi_module`
  • RabbitMQ高级特性
  • LeetCode 267:回文排列 II —— Swift 解法全解析
  • lc3341. 到达最后一个房间的最少时间 Ⅰ 算法解析
  • “仓促、有限”,美英公布贸易协议框架,两国分别获得了什么?
  • 马克思主义理论研究教学名师系列访谈|董雅华:让学生感知马克思主义理论存在于社会生活中
  • 抗战回望21︱《“良民”日记》:一个“良民”在沦陷区的见闻与感受
  • 从“重规模”向“重回报”转变,公募基金迎系统性改革
  • 证监会主席吴清:我们资本市场最重要的特征是“靠谱”
  • 消费者在天猫一旗舰店换手机电池疑遭套路致手机损坏,平台已介入