连环触发!MongoDB核心集群雪崩故障背后竟是……( 七 )
Q4:为何A机房代理抖动的时候 , A机房业务切到B机房后 , 还是抖动?
答:当A机房业务抖动 , 业务切换到B机房的时候 , 客户端需要重新和服务端建立链接认证 , 又会触发大量反复建链断链和读取随机数"/dev/urandom"的流程 , 所以最终造成机房多活失败 。
Q5:为何异常时候抓包分析 , 客户端频繁建链断链 , 并且同一个链接建链到断链间隔很短?
答:频繁建链断链的根本原因是系统sy%负载高 , 客户端极短时间内建立链接后又端口的原因是客户端配置超时时间太短 。
Q6:理论上代理就是七层转发 , 消耗资源更少 , 相比mongod存储应该更快 , 为何mongod存储节点无任何抖动 , mongos代理却有严重抖动?
答:由于采用分片架构 , 所有mongod存储节点前面都有一层mongos代理 , mongos代理作为mongod存储节点的客户端 , 超时时间默认秒级 , 不会出现超时现象 , 也就不会出现频繁的建链断链过程 。
Q7:如果MongoDB集群采用普通复制集模式 , 客户端频繁建链断链是否可能引起mongod存储节点同样的”雪崩”?
答:会 。 如果客户端过多 , 操作系统内核版本过低 , 同时超时时间配置过段 , 直接访问复制集的mongod存储节点 , 由于客户端和存储节点的认证过程和与mongos代理的认证过程一样 , 所以还是会触发引起频繁读取"/dev/urandom"文件 , 引起CPU sy%负载过高 , 极端情况下引起雪崩 。
四、 “雪崩”解决方法
从上面的一系列分析 , 问题在于客户端配置不合理 , 加上MongoDB内核认证过程读取随机数在极端情况下存在缺陷 , 最终造成雪崩 。 如果没有MongoDB内核研发能力 , 可以通过规范化客户端配置来避免该问题 。 当然 , 如果客户端配置规范化 , 同时MongoDB内核层面解决极端情况下的随机数读取问题 , 这样问题可以得到彻底解决 。
1、JAVA SDK客户端配置规范化
在业务接口很多 , 客户端机器很多的业务场景 , 客户端配置一定要做到如下几点:
- 超时时间设置为秒级 , 避免超时时间设置过端引起反复的建链断链 。
- 客户端需要配置所有mongos代理地址 , 不能配置单点 , 否则流量到一个mongos很容易引起瞬间流量峰值的建链认证 。
- 增加mongos代理数量 , 这样可以分流 , 保证同一时刻每个代理的新键链接尽可能的少 , 客户端在多代理配置时 , 默认是均衡流量分发的 , 如果某个代理负载高 , 客户端会自动剔除 。
2、MongoDB内核源码优化(摈弃内核态获取随机数 , 选择用户随机数算法)
详见2.5.2章节 。
3、PHP短链接业务 , 如何规避踩坑?
由于PHP业务属于短链接业务 , 如果流量很高 , 不可避免的要频繁建链断链 , 也就会走sasl认证流程 , 最终多线程频繁读取"/dev/urandom"文件 , 很容易引起前面的问题 。 这种情况 , 可以采用4.1 java客户端类似的规范 , 同时不要使用低版本的Linux内核 , 采用3.x以上内核版本 , 就可以规避该问题的存在 。
五、MongoDB内核源码设计与实现分析
本文相关的MongoDB线程模型及随机数算法实现相关源码分析如下:
MongoDB动态线程模型源码设计与实现分析:
MongoDB一个链接一个线程模型源码设计与实现分析
MongoDB内核态及用户态随机数算法实现分析
作者丨杨亚洲
来源丨Mongoing中文社区(ID:mongoing-mongoing)
dbaplus社群欢迎广大技术人员投稿 , 投稿邮箱:editor@dbaplus.cn
2020 DAMS中国数据智能管理峰会即将于10月30日在上海举办 , 部分精彩议题先睹为快:
推荐阅读
- centos7 安装 MongoDB (复制粘贴系列)
- 谷歌证实有线耳机亦可触发Google Assistant通知朗读功能
- 十分钟了解Mongodb数据库
- 阿里后端面试官的连环炮,看看你能撑到哪一步?
- docker 安装 MongoDB 就是这么简单?