开源共创,全球领先 腾讯MongoDB 主讲人:杨亚洲 开源共创,全球领先 •腾讯云MongoDB/WiredTiger内核PR贡献列表 •MongoDB内核性能优化PR贡献举例 •MongoDB官方感谢信 01腾讯云MongoDB贡献列表 腾讯云MongoDB/WiredTiger贡献列表 做为MongoDB官方合作伙伴,最近几年腾讯云MongoDB产品发展迅速,除了云服务基础服务能力不断增强之外,内核能力的提升也是产品能力和影响力提升的核心因素。除了自研内核能力给客户带来更多的服务外,我们也将自己在云上服务广大客户锁进行的技术积累,积极贡献给MongoDB/WiredTiger开源社区。 过去一年腾讯云给MongoDB内核贡献涵盖稳定性、性能、功能和可观测性等诸多方面,涉及B+tree、checkpoint、reconcile持久化、block、page锁、 api、事务、wtperf性能压测、wt问题分析工具、系统诊断分析、分片路由等,贡献数总结如下: 业务无缝迁移我们的影响力 新特性:7个 性能优化:10个 •除了MongDB官方,腾讯云是全球唯一一家能同时对MongoDB及wiredTiger存储引擎进行深度PR贡献的外部云厂商。 Bugfix:13个 可观察性:18个 •腾讯对MongoDB/wiredtiger内核贡献全球排名:top35左右。 •腾讯云是全球给MongoDB/wiredtiger存储引擎PR贡献最多的外部云厂商。 其他:10 •MongoDB官方连续两封感谢信表达对腾讯MongoDB的谢意。 02性能优化PR贡献举例 PR1:路由底座优化,性能千倍提升 问题背景 当前线上接触的真实分片集群,当单个表的路由chunks达到20W(约3-5T数据),增量路由获取就会有200ms左右的抖动;随着数据量越来越大,路由chunks也会继续增加,抖动也会越加明显,当达到100W路由chunks(约15-25T数据)后,抖动增加到秒级。 影响 如果分片间chunk不均、chunksplit或者balance的时候会引起路由版本的变化,只要mongos或者mongod检测到路由版本发生变化就会从configserver获取最新的变化路由信息。获取路由过程中,只要chunk表路由过多(例如百万路由),就会引起秒级别的业务请求抖动,即使获取很少的几个增量chunk,整个过程业务请求也会全部阻塞。 影响版本:所有MongoDB分片集群内核版本。 问题现象 当一个70万路由的表获取增量变化路由的时候,慢日志中会因为刷新路由产生大量慢查,刷路由耗时如下: 获取增量路由抖动程度: mongos约1200ms抖动 | mongod约1500ms抖动 获取增量路由抖动程度: mongos约1200ms抖动 | mongod约1400ms抖动 PR1:路由底座优化,性能千倍提升 线上真实抖动案例1(4.0版本) 线上真实抖动案例2(4.2版本) 数据量: 50亿行,1.2T数据 chunk数:25万 数据量: 55亿行,25T数据 chunk数:约150万 获取增量路由抖动程度: mongos约200ms抖动|mongod约300ms抖动 线上真实抖动案例3(3.6版本) 线上真实抖动案例4(4.2版本) 数据量: 1200亿行,80T数据 chunk数:450万 数据量: 200亿行,30T数据 chunk数:约200万 获取增量路由抖动程度: mongos约4000ms抖动|mongod约4500ms抖动 PR1:路由底座优化,性能千倍提升 服务千行百业助力业务创新 流程1:根据已有的oldChunkVector和变化的增量chunkInfo-2生成一个最新ChunkVector ChunkVector-old ChunkInfo*ChunkInfo*。。。。。ChunkInfo*ChunkInfo* ChunkInfo-1ChunkInfo-2ChunkInfo-4999999newChunkInfo-5000000 ChunkInfo-2拆分为2个chunk ChunkVector 性能瓶颈点: 如左图所示,假设chunkInfo-2拆分为了两个新的chunkInfo2和chunkInfo3,由于整个chunkVector是一个连续的内存,因此存在数组中chunkInfo的拷贝和移动。当vector中ChunkInfo过多,则拷贝移动耗时会很长。 ChunkInfo* ChunkInfo* ChunkInfo* ...... ChunkInfo* ChunkInfo* ChunkInfo-1ChunkInfo-2 ChunkInfo-3 ChunkInfo-5000000 new ChunkInfo-5000001 PR1:路由底座优化,性能千倍提升 流程2:遍历新生成的ChunkVector,计算出每个分片的ShardVersion updatedChunkMao.ChunkVector ChunkType*ChunkType*。。。。。ChunkType*ChunkType* 性能瓶颈点: 遍历整个vector,计算每个shard的shardVersion。如果vector中路由太多,这里遍历也会非常耗时。 ChunkType-0 ChunkType-1 ChunkType-5000000ChunkType-5000001 ShardVersionMap 遍历ChunkVector,生成最新的 ShardVersionMap bucket0 ...... Bucket-n Shard0|version0Shardx|versionxShard3|version3 Shard1|version1 PR1:路由底座优化,性能千倍提升 流程3:遍历老的oldvector,释放历史无用资源 遍历vector,释放old中所有的chunkInfo指针 CHunkVector-old 性能瓶颈点: oldverctor中的指针空间释放,这时候也需要遍历整个oldvector,因此有一定耗时。 ChunkInfo*ChunkInfo*。。。。。ChunkInfo*ChunkInfo* ChunkInfo-1ChunkInfo-2ChunkInfo-4999999 new ChunkInfo-5000000 PR1:路由底座优化,性能千倍提升 腾讯云MongoDB路由底座优化 verticalVector ChunkInfo*pChunkInfo*pChunkInfo*pChunkInfo*p two-DimensionalVactor ChunkInfo*pChunkInfo*pChunkInfo*pChunkInfo*pChunkInfo*pChunkInfo*pChunkInfo*pChunkInfo*p [1500,1600>[1300,1400> [1200,1300> [1100,1200> [1000,1100> [800,900> [-700,800>[600,-700> ChunkInfo*pChunkInfo*pChunkInfo*pChunkInfo*pChunkInfo*pChunkInfo*pChunkInfo*pChunkInfo*p Sorting&Search 性能瓶颈点: [500000,max>[500000600,500000700>[500000500,500000600>[500000400,500000500>[500000300,500000400> [500000200,500000300> [500000100,500000200> [500000000,500000100> 如左图所示,腾讯云采样二维排序搜索算法对chunkInfo进行二维排序。当需要修改指定增量chunkInfo时, VerticalVector | |OrderBymaxKey ChunkInfo*pChunkInfo*pChunkInfo*pChunkInfo*p [500,600>[400,500>[300,400> [200,300> [500,600> [0,100> [-100,0>[min,-100> ChunkVector*p600 ChunkVector*p1600 ...... ...... 只需要快速定位到其所在的纵向列, 对该列做修改即可,从而避免整个 vector的修改。 ChunkVector*pmax horizontalMap:orderbymacKeyofChunkInfo 该PR(SERVER-71627)优化 来着官方的感谢: PR2:WiredTiger小page压缩功能支持 问题背景 某用户在做分布式数据库选型的时候,发现MongoDB大部分场景性能不错,但是在大量随机点查场景性能没有优势,通过优化调小MongoDB存储引擎WiredTiger的leaf_page_max从32K到4K,该大量随机点查SQL性能提升一倍。 但是该优化却引入了另外一个问题,mongod节点磁盘占用增加了4倍。 问题根因 通过深入分析,最终确认该问题是wt的一个bug,wiredtiger忽略了16K以下leafpage的压缩功能。最终,腾讯云提交PR优化,支持了16K以下page的压缩功能。 PR(WT-12653)收益 1.大量随机点查性能提升一倍。 2.小leafpage磁盘占用节省3倍。 更多PR优化: 具体PR 功能说明 SERVER-71627 分片路由底座优化,性能千倍提升 WT-12653 16K以下leafpage压缩功能支持,提升点查性能,磁盘数倍节省 WT-11954 小page场景优化,读写性能提升 WT-11877/WT-13182 平滑io_capacity功能支持,最大化减少磁盘抖动 WT-12562 新增WAL预写日志文件预创建功能,解决WAL文件创建引起的MongoDB秒级抖动问题 WT-11711 MongoDB/WiredTigerallverbose功能支持,方便问题排查及降低学习难度 WT-13122 新增MongoDB请求维度全链路重点模块耗时分析功能,慢日志中直观体现“慢在哪儿”,减少问题分析难度 WT-13022 新增page锁阻塞等待分析功能 WT-12961 增加事务异常快照列表信息,直观分析事务异常 SERVER-84220/WT-12141 wiredTigerEngineRuntimeConfig支持记录所有历史配置修改功能,解决多次优化wiredtiger引擎配置后遗忘历史优化记录 WT-12044 Block重叠检查及可视化优化 WT-12012 新增请求阻塞情况下零时evict及checkpointverbose调整恢复功能 更多PR优化 具体PR 功能说明 WT-12001 Checkpoint状态异常修复,新增btreecheckpoint耗时诊断统计功能 WT-11834 新增磁盘IO阻塞耗时诊断功能 WT-12040 MongoDB存储引擎磁盘ext元数据优化,解决大量ext遍历引起的业务抖动和磁盘碎片问题 WT-11999 Checkpointscrub状态异常修复,并新增scrub诊断统计功能 WT-12336 Wtperf新增性能耗时分析功能 WT-12176 wtblock支持明文分析wt文件功能 WT-13023 解决wiredtiger存储引擎findAndModify耗时不一致问题 WT-12782 优化遍历计数,减少CPU开销 WT-11728 DumpKV可视化输出优化,增加内容可读性 WT-11705 解决history_storeverbose调整报错异常问题 WT-12566 解决cursor异常统计不一致问题 WT-1228