起因

最近接手大后端后,开始整理之前的遗留问题,其中mongodb还停留在很早之前的版本。线上的部署和监控也及其混乱,所以决定和运维一起升级到mongodb到新版本。

虽然官网的介绍,新版本用了新WT引擎,吞吐量提升10倍芸芸;但是只有经过自己的实践和测试才能确认。




mongodb补丁更新 mongodb版本升级_nodejs 升级


测试目标

1.数据库V2.6 和 V 4.0版本对比测试

2.结合业务数据性能对比测试

测试计划

  • 性能对比测试。 目的:通过测试数据确认升级版本有没有提升, 到底提升了多少。
  • 核心业务压力对比测试。 目的:通过测试验证升级版本对业务相关数据的性能提升了多少。
  • 业务代码驱动升级,为未来重构升级。原因:老业务驱动升级导致方法变得太大。
  • 测试服切换到4.0 进行全面业务测试 。
  • 正式服数据硬件升级。
  • 正式服数据库配置准备。
  • 正式服停机切换正式服。

压力测试服务器配置信息:


mongodb补丁更新 mongodb版本升级_数据库_02


测试准备:

  1. 监控:在测试之前需要配置好监控,包含各种数据库性能指标以及机器资源使用率的监控。
  2. 测试场景的设计:在单独的数据库性能测试中,必须包含的几个场景有: 只读,读写混合,只写,这3个场景分别包含下面2个场景
  3. 数据库的初始化: 在测试之前需要准备测试数据,包含业务的测试需要制作业务的测试数据,纯数据库相关的测试可以自己生成测试数据。
  4. 预热:在测试之前需要将部分数据加载到内存中,如果没有预热,在测试的时候加载数据,这种情况与线上的情况不同,对测试结果又影响。
  5. 测试结果的分析,对于测试结果的分析一般要包含机器资源使用的分析,数据库监控指标的分析,慢sql的分析,数据库错误日志的查看。同时结合压测工具或自己配置的工具生成的结果去分析,是否有慢sql,是否有资源使用波动,结果的tps,qps是否满足预期等。在做性能测试的时候,目的是测试数据库的表现,不是测试数据库究竟能承受多大的压力,所以我们的测试机器配置一定要足够,不要出现因为机器资源导致的限制。
  6. 调整,优化:但是最好每次调整一个方面的配置,调整后再次测试,记录结果并对比查看效果。涉及业务的测试在分析的时候需要配合研发同学分析定位问题。

系统:

  1. 文件系统 :XFS
  2. ulimit - 623000

mongoDB conf配置

mongoDBconf 核心配置测试IP和端口


mongodb补丁更新 mongodb版本升级_数据库_03


驱动升级:

  1. java 应用、ttop-rest 框架升级
  2. groovy 脚本
  3. node js

压力测试结果:

编码业务脚本


mongodb补丁更新 mongodb版本升级_测试数据_04


YCSB 测试脚本


mongodb补丁更新 mongodb版本升级_nodejs升级_05


总结:

  1. v4.0版本的update吞吐量大幅提升(10倍)优于v2.6。 由于引擎的更换。
  2. v4.0版本的query优化幅度极小,可以忽略不计。
  3. query and update v4.0版本的吞吐量大幅提升(10倍)。
  4. 内存足够大的情况下,CPU是瓶颈,CPU表现越好的机器,性能越好。

线上运行

当前线上环境已经全部升级完毕,稳定的运行了几个月了,未发生任何异常,性能也杠杠的。