起因
最近接手大后端后,开始整理之前的遗留问题,其中mongodb还停留在很早之前的版本。线上的部署和监控也及其混乱,所以决定和运维一起升级到mongodb到新版本。
虽然官网的介绍,新版本用了新WT引擎,吞吐量提升10倍芸芸;但是只有经过自己的实践和测试才能确认。
测试目标
1.数据库V2.6 和 V 4.0版本对比测试
2.结合业务数据性能对比测试
测试计划
- 性能对比测试。 目的:通过测试数据确认升级版本有没有提升, 到底提升了多少。
- 核心业务压力对比测试。 目的:通过测试验证升级版本对业务相关数据的性能提升了多少。
- 业务代码驱动升级,为未来重构升级。原因:老业务驱动升级导致方法变得太大。
- 测试服切换到4.0 进行全面业务测试 。
- 正式服数据硬件升级。
- 正式服数据库配置准备。
- 正式服停机切换正式服。
压力测试服务器配置信息:
测试准备:
- 监控:在测试之前需要配置好监控,包含各种数据库性能指标以及机器资源使用率的监控。
- 测试场景的设计:在单独的数据库性能测试中,必须包含的几个场景有: 只读,读写混合,只写,这3个场景分别包含下面2个场景
- 数据库的初始化: 在测试之前需要准备测试数据,包含业务的测试需要制作业务的测试数据,纯数据库相关的测试可以自己生成测试数据。
- 预热:在测试之前需要将部分数据加载到内存中,如果没有预热,在测试的时候加载数据,这种情况与线上的情况不同,对测试结果又影响。
- 测试结果的分析,对于测试结果的分析一般要包含机器资源使用的分析,数据库监控指标的分析,慢sql的分析,数据库错误日志的查看。同时结合压测工具或自己配置的工具生成的结果去分析,是否有慢sql,是否有资源使用波动,结果的tps,qps是否满足预期等。在做性能测试的时候,目的是测试数据库的表现,不是测试数据库究竟能承受多大的压力,所以我们的测试机器配置一定要足够,不要出现因为机器资源导致的限制。
- 调整,优化:但是最好每次调整一个方面的配置,调整后再次测试,记录结果并对比查看效果。涉及业务的测试在分析的时候需要配合研发同学分析定位问题。
系统:
- 文件系统 :XFS
- ulimit - 623000
mongoDB conf配置
mongoDBconf 核心配置测试IP和端口
驱动升级:
- java 应用、ttop-rest 框架升级
- groovy 脚本
- node js
压力测试结果:
编码业务脚本
YCSB 测试脚本
总结:
- v4.0版本的update吞吐量大幅提升(10倍)优于v2.6。 由于引擎的更换。
- v4.0版本的query优化幅度极小,可以忽略不计。
- query and update v4.0版本的吞吐量大幅提升(10倍)。
- 内存足够大的情况下,CPU是瓶颈,CPU表现越好的机器,性能越好。
线上运行
当前线上环境已经全部升级完毕,稳定的运行了几个月了,未发生任何异常,性能也杠杠的。