说一件有意思的事情。

2022-12-07 09:02:49 浏览数 (1)

说一件有意思的事情

最近工作之外的事情比较多,就没有更新公众号了。产量也有明显下降,忙完这段时间,后续慢慢写吧。

这两天有一个比较好玩的事情,跟大家分享一下。

前几天在线上遇到了一个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,所以导致了文中描述的现象。

最后知道真相的我眼泪掉下来

我看了看我同事在网上找到的那篇文章,想看个究竟,到底是谁遇到了这个跟我一样的问题,结果发现:那篇文章是我自己写的。

0 人点赞