【发布时间】:2018-09-20 02:09:24
【问题描述】:
在提交阶段重新启动失败的事务时,我在重新启动事务时遇到第二次失败。这是在 MariaDB 10.2.6 下运行 Galera Cluster。
事件的顺序是这样的:
- 提交事务(比如单次插入)。
- COMMIT 失败并显示 error 1213“尝试获取锁定时发现死锁”
- 开始新事务以重放 SQL 语句。
- BEGIN 失败并显示 error 1047“WSREP 尚未准备好节点以供应用程序使用”
- 我的应用程序为避免更严重的崩溃而退出(请参阅下面的注释)
这种情况经常发生,尽管集群恢复了,但个别线程会收到故障。昨天这种情况在一秒钟内发生了 15 次。
我无法确定任何根本原因。看来死锁是问题的始作俑者。这种情况应该是可以恢复的(而且经常是)但是由于多个客户端都试图同时解决他们的死锁,整个事情似乎只是失败了。
注意事项:
这与earlier question 有关,其中重试失败的事务会导致集群完全崩溃。我已经设法通过仅在死锁上重试事务来防止崩溃。即,如果在重新启动期间发生不同类型的错误,应用程序将放弃。
我知道 10.2.6 不是 MariaDB 的最新版本。我现在很紧张,因为我有过如此糟糕的经历。我想在升级之前了解当前的问题,但我无法在测试环境中重现错误。
【问题讨论】: