知识卡片
KV存储引擎选型压测方法论:用真实线上流量压测暴露理论对比看不出的抖动
内容
面对LevelDB、RocksDB、BeansDB、LMDB、Riak这几个候选KV存储引擎,团队没有依赖官方文档或社区口碑做选择,而是用统一的硬件配置(2台机器、32核CPU、32GB内存、SSD)、真实的数据规模(1.7亿条数据、800多GB、单条5~30KB)、以及最关键的——用TCPcopy直接把线上真实流量导入压测环境、执行随机写+随机读的混合压测用例,来横向对比各个引擎的实际表现。压测结果揭示了一个纯粹理论对比很难发现的关键差异:LevelDB和RocksDB(RocksDB是LevelDB的改进版,专门针对SSD做了优化)如果单独测试纯写或纯读,性能表现都很好,但一旦切换成读写混合的真实流量模式,就会因为LSM-Tree结构固有的归并(compaction)操作而产生明显的性能抖动,归并发生时基本会把磁盘IO打到瓶颈;而LMDB引擎在同样的混合读写压测下没有出现类似的大幅抖动,基本满足业务对稳定性的要求,最终团队选择了LMDB作为线上方案。这个案例给出了一条存储选型的重要方法论:抽象的基准测试(纯读、纯写)容易掩盖引擎在真实业务负载下才会暴露的问题(如LSM-Tree类引擎的归并抖动),只有用尽可能贴近生产环境的真实流量、真实数据规模、真实的读写混合比例去压测,才能真正看清一个存储引擎在自己的业务场景下到底表现如何——选型决策不应该基于”哪个引擎理论上更快”,而应该基于”哪个引擎在我们真实的访问模式下表现最稳定”。
参考来源
- 位置:《高可用架构(第1卷)》第3章《电商架构热点专题》"3.1 亿级商品详情页架构演进技术解密"节,"3.1.3 遇到的一些问题和解决方案"(源文件:_epub-src/OEBPS/Text/Chapter3_1_4.xhtml)
- 结论依据:原文详细说明LevelDB、RocksDB、LMDB的压测配置和结果,"LevelDB压测时,随机读+随机写会产生抖动……RocksDB是改造自LevelDB,对SSD做了优化,我们压测时单独写或读,性能非常好,但是读写混合时就会因为归并产生抖动……LMDB引擎没有大的抖动……基本满足我们的需求",直接支撑本卡片结论。
- 原始内容:LevelDB压测时,随机读+随机写会产生抖动……RocksDB是改造自LevelDB,对SSD做了优化,我们压测时单独写或读,性能非常好,但是读写混合时就会因为归并产生抖动……LMDB引擎没有大的抖动……基本满足我们的需求。