最近,我工作在一个非常不幸的情况下,围绕不同集群,数据丢失,丢失重要的错误日志,强迫命令雷竞技下载官网Percona XtraDB集群(PXC)。尽管PXC尽量解释发生了什么错误日志,我保证它可以错过或忽视当你不知道会发生什么。

这篇文章是一个警告的故事,邀请尝试自己和摔打东西(不是在生产,对吗?)。

TLDR:
你知道马上看到此日志时发生了什么?

示范

使用大https://github.com/datacharmer/dbdeployer:

让我们写一些数据

然后,假设有人想重启节点1。出于某种原因,他们阅读在你的内部文档要引导在这种情况下。dbdeployer,这将转化为:

它失败了,因为它应该。

在现实中,那些引导错误发生在自制的启动脚本,木偶或ansible模块,甚至内部应用程序错误的情况。

为什么会失败呢?第一个错误需要注意:

提醒:引导应该只用于当每个节点已经双重检查;这是一个手工操作。这里失败了,因为它没有强迫,因为该节点没有集群中的最后一个停止。

良好的反射:连接到其他mysql和检查之前“wsrep_cluster_size”和“wsrep_cluster_status”状态。

:盲目应用此日志告诉你做什么。

但我们是来“修复”,找到答案,让我们引导。

在这一点上,注意从node1,你有:

但从node2 node3你会:

看起来可疑。但是你的监控真的提醒你这个吗raybet雷竞技竞猜在线官网?

让我们写一些更多的数据,很明显在node1上,因为为什么呢?它看起来健康。

127年将是有用的。

噩梦随之而来

我们几天后。你还是写你的节点。一些新的理由node1是重启。也许你想申请一个参数。

失败了吗?

检查日志,你会发现:

瞧,我们再次找到我们的“127”。

很好的反射:视情况而定。需要自己的一篇文章,但这是一个严重的问题。

不:Force SST在这个节点。因为它会工作,每个数据插入node1将丢失。

这是什么意思?

迫使引导时,总是一个节点开始。它不会尝试连接到其他节点,如果他们是健康的。其他节点不会尝试连接到第三个;从他们的观点来看,它只是没有加入,所以它不是集群的一部分。

当重新启动之前引导node1在哪些模式中,这是他们第一次见面。

每次提交一个事务,它是复制通过序列号(seqno)。seqno日益增加。它使用节点来确定增量状态传输是可能的,或如果一个节点状态是一致的。

现在node1不再是在引导模式,node1连接到其他成员。node1股票其状态(最后一个主要成员,seqno)。其他节点正确地捡起,这seqno看起来可疑的,因为它是比自己高,这意味着节点加入可以应用更多的事务。这也意味着它是来自一些其他集群。

因为节点在疑问,什么都不会发生。Node1被拒绝加入,不会做任何事情。它不会自动尝试重新同步,不会碰它的数据。Node2 node3则不受影响;他们将作为太。

如何从有取决于没有一般的指导方针。理想情况下,应该发现真理的源泉。如果两个集群应用写道,在最艰难的情况,这是一个分裂的大脑。

请注意:seqno只是数字。有平等seqno并不保证底层事务应用是相同的,但它仍然是有用的作为一个简单的检查。如果我们浪费更多并应用127个事务在node2上,甚至在grastate seqno手动修改。dat,我们可以“有趣”的结果。试一下(不生产,请注意)!

请注意:如果你不知道引导以及如何正确恢复,查看文档

结论

最后引导是一个过程,不要强迫它轻。不要强迫SST马上如果一个节点没有想加入。你应该首先检查错误日志。

幸运的是,PXC并不盲目地让任何节点加入没有仔细检查。

减少意外停机时间与高可用性和数据丢失,开源MySQL集群解决方案。

今天下载Perco雷竞技下载官网na XtraDB集群

订阅
通知的
客人

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