我正在管理一个具有 3 个节点的 galera 集群,为 Laravel 应用程序提供服务,HAProxy 是集群的网关。我们遇到了一个有趣的问题,我无法弄清楚为什么 Laravel 应用程序中会出现错误消息。以下是我所知道的: 13:25:36 在 Node1 上有一条注释,... connection to peer f3e3XXXX-XXX with addr tcp://X.X.X.X:4567 timed out, no messages seen in PT3S, ...
该 IP 代表 Node2。大约在同一时间 13:25:37,在 Node2 上,日志中出现以下消息... WSREP: (f3e3XXXX-XXX, 'tcp://X.X.X.X:4567') turning message relay requesting on, nonlive peers: tcp://X.X.X.X:4567 ...
This 2nd IP indicates Node1。我将在帖子后面发布更详细的日志。
所以我的理解是集群之间可能出现网络中断,Node2(和 3)必须重新加入集群。与此同时,有人触发了 Larave 应用程序,对集群进行了查询。但此请求最终出现一条错误消息:[2023-11-07 13:25:46] production.ERROR: SQLSTATE[08S01]: Communication link failure: 1047 WSREP has not yet prepared node for application use .....
如果我对集群应该如何工作的理解是正确的,我不知道发生了什么。galera 集群是否应该能够管理节点从集群中消失并使用现有节点来处理传入查询?这是否是一个 HAProxy 问题,它无法检测到 Node2 和 3 不可用并以任何方式向那里发送查询?
这个问题持续了大约 10 秒,从那时起集群就工作得很好(我认为......wsrep_cluster_size
是3
ATM,所以它一定没问题)。
现在我不想用所有日志来“垃圾邮件”这篇文章,所以我将把来自 Node1 和 2 的日志插入到 Pastebin 中,并提供 URL。
!!! 谁能向我解释一下在这种情况下到底发生了什么?也许有一种方法可以避免将来发生这种情况?!!!
先感谢您 !
MariaDB 日志: https://pastebin.com/SpDbe7Bb
Laravel 日志:
[2023-11-07 13:25:46] production.ERROR: SQLSTATE[08S01]: Communication link failure: 1047 WSREP has not yet prepared node for application use (SQL: select * from .......) {"exception":"[object] (Illuminate\\Database\\QueryException(code: 08S01): SQLSTATE[08S01]: Communication link failure: 1047 WSREP has not yet prepared node for application use (SQL: select * from .......) at /var/www/html/myproject/releases/184/vendor/laravel/framework/src/Illuminate/Database/Connection.php:671)
如果只有 3 个节点,其中 2 个节点(2 和 3)处于某种
ERROR
状态,则其余节点将不会接受任何事务,因为它不知道集群的当前状态。请参阅https://galeracluster.com/library/documentation/crash-recovery.html “两个节点从集群中消失”