当降压的()是错误的我们可以看到,在Percona解决很多不同的问题。雷竞技下载官网这是最新的一个让我抓我的头最近一段时间。

的场景

我们有一个分片集群环境运行MongoDB 4.0,需要升级到MongoDB 4.2。简单的对吧?唯一特定的关于这个环境,MongoDB是运行在一个定制的码头工人在AWS环境。

我们开始用通常的方法禁用均衡器和升级配置服务器的副本集。在这种情况下,配置服务器的副本运行MongoDB 4.0组有三个成员。而不是升级,我们选择运行MongoDB 4.2添加三个新成员。现在我们一共有六个节点。下一步是降压的主要的一个新的4.2节点最后解除旧服务器。

测试迁移计划

我们开始计划non-prod环境中。起初,一切正常;我们得到了配置服务器的副本将六名成员和设置优先级,这样一个新的4.2服务器是唯一的候选人成为主要从当前退位后。所以我们继续跑rs.stepDown ()命令像往常一样,这是当事情开始出错。客户突然开始报告以下信息:

我的第一想法是在网络层一定是错的,但是检查所有主机之间的连接并没有发现问题。接下来,我们看着码头工人,但一切似乎都好了。

更深入的研究

我们连接本地服务器配置成为主要的,我们看到一个奇怪的情况。服务器无法完成升压过程成为主要的,而且中途它:

看着最后四行我们可以看到host6应该是主要的但不是完全提升。我们也检查了db.currentOp ()它显示所有会话似乎在等待一些锁相关副本设置状态转换,和下面的操作似乎困的创建索引config.chunks集合:

奇怪的是这个集合包含只有几个文档,所以这个操作应该非常快(也索引已经存在)。

在这一点上,我们怀疑可能触及一些bug,开始看很多关于死锁问题的报道在降压的/加速的过程。不幸的是,我们空手上来了。

解决方案

接下来,我们检查了配置服务器副本集本身的配置,注意到一些不寻常的“设置”部分rs.conf ():

getLastErrorDefaults运行时设置是省略了大部分时间rs.initialize (),因为写的问题是通常控制在每会话的基础上。在这种情况下,配置服务器副本被初始化getLastErrorDefaults{w:多数,j:真}而不是默认的值w: {1}

我们尝试重置副本配置设置为默认值如下:

这样做之后,rs.stepDown ()完美地工作,我们可以有4.2基本到位。

结论

这个故事的寓意是,我们应该检查写担忧副本的默认值设置水平促进MongoDB 4.2主第一次。

非默认写问题之前没有选举的问题,所以一些改变在MongoDB 4.2引发这种行为。这个问题是特定于配置服务器,同样没有发生与普通碎片复制集。

有趣的是,从MongoDB 5.0我们不能再指定一个默认写关心使用settings.getLastErrorDefaults对一个副本集。

这也证明了值的测试设置,模拟真实的生产环境中,能够测试和捕捉这些问题在生产之前咬我们。

订阅
通知的
客人

0评论
内联反馈
查看所有评论