说一件有意思的事情
最近工作之外的事情比较多,就没有更新公众号了。产量也有明显下降,忙完这段时间,后续慢慢写吧。
这两天有一个比较好玩的事情,跟大家分享一下。
前几天在线上遇到了一个MongoDB的问题:
背景:
MongoDB 3.4.7 版本升级MongoDB 3.6.3 版本
升级过程:
MongoDB升级一般是先滚动升级MongoDB从库,然后再进行主库切换,选举出来新的高版本从库,最后升级MongoDB老主库,最后执行
代码语言:javascript复制db.adminCommand( { setFeatureCompatibilityVersion: "version" } )
即可,其中,version填对应的版本,例如3.4、3.6这样子
问题:
这个操作流程,之前执行过几遍,都没有遇到问题,前两天执行的时候,发生了一个奇怪的现象:版本升级过后,MongoDB的实例,一个一个从副本集中掉出来了,实例自动关机,日志中报一个段错误
代码语言:javascript复制[thread74] Invalid access at address: 0x18
[thread74] Got signal: (Segmentation fault).
解决过程:
当时遇到这个问题,还是比较懵逼的,不知道为什么节点一个一个掉出副本集,并且自动关闭。
方案一:(结果表明不奏效)
手工启动挂掉的节点。
手工启动之后,确实有效果,集群恢复了正常,但是仅仅持续了1分钟,就又开始一个一个掉出集群了。报错跟之前一样。
方案二:(结果表明不奏效)
怀疑集群数据不一致导致的数据回滚报错,最终实例宕机。于是我使用rs.remove()命令将集群中部分节点去掉了,只保留了主库,想着集群节点少一些,或许能避免这个问题。
事实打脸,这样还是不行,主库还是会自动宕机。
方案三:
这个问题似乎之前确实没有遇到过,我也百思不得其解,就在我抓耳挠腮想不出办法的时候,同事已经通过网上的文章找到了解决方案,说是3.6.3版本的一个bug,具体的原因是:
MonogDB集群分为2种,一种是普通的副本集,一种是分片集群。当mongodb在3.6.3版本的普通副本集配置文件中写入了分片集群的参数(如下)之后:
代码语言:javascript复制sharding:
clusterRole:shardsvr
副本集成员就会一个一个的掉出集群,这是记录在案的一个bug。
jira的链接如下:
https://jira.mongodb.org/browse/SERVER-34746
https://jira.mongodb.org/browse/SERVER-32677
到这里,知道问题是bug导致的,那我们就解决bug即可:
在配置文件中,取消掉sharding这项配置即可。
因为我们是普通的副本集,不需要分片集群配置也可以运行起来。从遇到的现象中也不难总结出来,在MongoDB升级的过程中,3.4.7版本一开始可以运行没问题,但是升级之后,高版本3.6.3中触发了这个bug,所以导致了文中描述的现象。
最后知道真相的我眼泪掉下来
我看了看我同事在网上找到的那篇文章,想看个究竟,到底是谁遇到了这个跟我一样的问题,结果发现:那篇文章是我自己写的。