这场MongDB事故暴露的潜在危机,你是否也正在忽视?
副标题[/!--empirenews.page--]
一、MongoDB特性 MongoDB是一个可扩展的高性能基于文档的NoSQL数据库,具备但不限于以下特性: 无数据结构限制和高性能
丰富的支持
方便的冗余与扩展
良好的支持
二、MongoDB故障经历 基于MongoDB的优异性能,在我司也越来越多的使用。随着业务变更,负载增加,一些问题也逐渐暴露出来,在我司内部最近就遭遇多起MongoDB故障,下面简单介绍其中一个: 业务背景 该套系统为内部主机监控系统,包括IO、CPU、内存、文件系统以及网络数据等,根据其监控项目本身特性,采样频率几秒到10分钟不等,因接入监控的主机数量较多,每日数据量较大。 该业务初始使用了3分片的cluster,分片规划由业务侧同事规划实施。 故障过程 业务侧反馈特定某些时段业务无法连接到MongoDB,往往几分钟后自动恢复了正常,且最近业务响应比以前明显减慢。 故障分析 接到反馈后,检查MongoDB日志,发现阶段性出现连接用尽的告警,猜测可能是业务最近有过调整。后经业务同事确认,最近确认新接入了一批主机到该监控系统。
理论值和故障时情况匹配,判定造成业务间断性无法连接的原因是参数设置不合理。 间断性出现和业务模式有关系,前面提到业务不同指标间隔几秒到十分钟采样,采样入库峰值时部分业务失败。 临时处置 得益于MongoDB的副本集方便调整的特点,滚动修改了各个节点参数(调整open files value到64000),并重启MongoDB服务。 深入分析 此次故障原因很简单,但这引发了我们一些反思:
带着这样的问题,我们重新审视分析了该系统的使用情况。不查不知道,一查下一跳,真的检查出诸多问题:
调整优化 针对存在的问题做了以下几方面的调整: 调整系统参数
此外禁用了numa,Transparent HugePages及修改了磁盘调度策略: 开启MongoDB Profile
结合业务重新设置集合片键 重新设计分片是本次调整的重点,那么为什么说当前系统的分片不合理,分片的依据是什么呢?这里先说一下我们评估的依据: 好的片键
不好的片键
当前数据库内仅有少数集合进行了分片,并且片键均为时间类型,造成负载集中在其中一个分片上。我们希望能找到一种既能保证足够的粒度,不会造成巨型chunk,也能控制分片粒度,不会降低效率。 按照上述原则,我们搭建了测试环境,与业务同事共同讨论并进行了多次测试,尝试了不同的分片组合及分片方式,对比了不同分片下的业务性能,我们总结出如下规则: {Locality: 1,search : 1}:第一个字段控制局部的数据,第二个字段为常用的搜索字段;第一个字段为粗粒度字段,第二个字段为细粒度字段。 结果对比 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |