如何阻止一个节点上的死锁崩溃整个群集?

时间:2017-06-20 17:03:12

标签: php mysql mysqli mariadb galera

我在MariaDB下运行3x节点Galera集群。该应用程序使用mysqli扩展在PHP中。

偶尔我会写Deadlock。我正在努力改进我的应用程序以处理或避免这种类型的失败,但同时我需要集群在发生这种情况时保持警惕。

问题是,一旦发生死锁,不只是一个,而是群集中的所有三个节点都崩溃了。发生死锁的节点遇到MySQL server has gone away错误,max_connect_errors开始永久拒绝连接,因此需要手动重启服务器。

我没有得到的是为什么其他节点也会崩溃。它们都开始出错“WSREP尚未为应用程序使用准备节点”,这意味着整个应用程序崩溃,没有数据库节点接受连接。

当一个节点遇到罕见的死锁时,如何确保群集的其余部分保持正常?

更新

一个月后,另一个死锁导致了类似的问题。同样,一个节点会降低一切。

第一个连接遇到死锁(在提交阶段),因此应用程序尝试重放事务。这种情况持续了将近一分钟,并再次失败。

第一次连接无法恢复后,所有其他连接开始失败,并显示(1205)“超出锁定等待超时”,导致整个群集无效。

我应该补充说应用程序不使用锁。然而,它本身就是一个结,只是常规的交易查询。

1 个答案:

答案 0 :(得分:0)

我正在回答我自己的问题,因为我设法避免崩溃。但是,我仍然遇到辅助错误问题,并且已经开始a new thread具体细节。

我的恢复代码现在以不同方式处理二级错误。它会重试几次死锁,但只有在错误发生时才会出现死锁。如果发生任何其他类型的错误,应用程序将放弃。

虽然这意味着失败的用户收到错误,但我没有因为此更改而导致群集崩溃,并且没有看到可怕的“服务器消失”错误。