我正在 MariaDB 下运行 3x 节点 Galera 集群。该应用程序采用 PHP 语言,使用 mysqli 扩展。
偶尔我会得到一个Deadlock https://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html#error_er_lock_deadlock写时。我正在努力改进我的应用程序以处理或避免此类故障,但与此同时,我需要集群在发生这种情况时保持运行。
问题是一旦发生死锁,集群中的不仅仅是一个节点,而是所有三个节点都崩溃了。产生死锁的节点MySQL服务器消失了 https://dev.mysql.com/doc/refman/5.5/en/error-messages-client.html#error_cr_server_gone_error错误和之后max_connect_errors
开始永久拒绝连接,因此需要手动重新启动服务器。
我不明白的是为什么其他节点也崩溃了。它们都开始出错“WSREP 尚未准备好节点供应用程序使用”,这意味着整个应用程序崩溃,没有数据库节点接受连接。
当一个节点遭遇罕见的死锁时,如何确保集群的其余部分保持正常运行?
Update:
一个月后,另一个僵局导致了类似的问题。同样,一个节点会导致一切崩溃。
第一个连接出现死锁(在提交阶段),因此应用程序尝试重播事务。这挂起近一分钟并再次失败。
第一个连接无法恢复后,所有其他连接开始失败,并显示 (1205)“超出锁定等待超时”,导致整个集群无用。
我应该补充一点,该应用程序不使用锁。然而它本身就陷入了困境,它只是与常规事务查询有关。
我正在回答我自己的问题,因为我设法避免了崩溃。但是,我仍然遇到次要错误的问题并已开始一个新线程 https://stackoverflow.com/questions/49753913/whats-causing-subsequent-errors-when-restarting-deadlocked-transaction与具体细节。
我的恢复代码现在以不同的方式处理次要错误。它会重试死锁几次,但仅限于错误是死锁时。如果发生任何其他类型的错误,应用程序将放弃。
尽管这意味着用户会收到错误而感到失望,但自从此更改以来,我没有遇到过集群崩溃,也没有看到可怕的“服务器消失”错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)