mariadb galera - 节点关闭时出错 ERROR 1047 WSREP 尚未准备好节点以供应用程序使用

Posted

技术标签:

【中文标题】mariadb galera - 节点关闭时出错 ERROR 1047 WSREP 尚未准备好节点以供应用程序使用【英文标题】:mariadb galera - Error when a node shutdown ERROR 1047 WSREP has not yet prepared node for application use 【发布时间】:2017-03-31 21:32:02 【问题描述】:

我在 2 个 CentOs 6.6 服务器上安装了 2 个 Mariadb Galera 节点 (mariadb-galera-10.0.27-linux-x86_64.tar.gz)。

安装后,我用参数--wsrep-new-cluster启动node1,然后不带这个参数启动node2。 它们工作正常,数据在 2 个节点之间成功同步。

但是,当我关闭 node1. Node2 仍在运行,但是当我尝试访问数据库时。它显示此错误:

use testdb;
ERROR 1047 (08S01): WSREP has not yet prepared node for application use 

在这种情况下会发生什么? 这是我在 2 个节点上的配置(只是不同的 IP 地址)

[galera] 
wsrep_on=ON
wsrep_cluster_name='mysql-cluster'
wsrep_provider='/home/mariadb/mariadb-galera/lib/galera/libgalera_smm.so'
wsrep_provider_options="gcache.size=1G"
wsrep_cluster_address="gcomm://10.211.26.116:4567?

pc.wait_prim=no"
wsrep_sst_method=rsync
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
wsrep_node_address=10.211.26.117:4567
wsrep_node_name='db2'

【问题讨论】:

【参考方案1】:

两节点集群

双节点集群中,单节点故障会导致另一个停止工作。

情况

您有一个仅由两个节点组成的集群。其中一个节点不优雅地离开集群。也就是说,它不是通过 init 或 systemd 关闭,而是崩溃或失去网络连接。剩下的节点变得不可操作。在第三方(例如人工操作员或其他节点)提供一些额外信息之前,它一直如此。

如果节点在另一个节点不正常地离开集群后仍保持运行,则两个节点中的每个节点都可能认为自己是主要组件。为防止这种情况,节点将变为不可操作。

解决方案

您可以使用两种解决方案:

您可以使用 pc.boostrap wsrep Provider 选项引导幸存节点以形成新的主组件。为此,请登录数据库客户端并运行以下命令:

SET GLOBAL wsrep_provider_options='pc.bootstrap=YES';

这会将幸存的节点引导为新的主要组件。当其他节点重新上线或与该节点重新建立网络连接时,它将发起状态转移并赶上该节点。

如果您希望节点继续运行,您可以使用 pc.ignore_sb wsrep Provider 选项。为此,请登录数据库客户端并运行以下命令:

SET GLOBAL wsrep_provider_options='pc.ignore_sb=TRUE';

节点会继续处理更新并将继续这样做,即使它怀疑存在裂脑情况。

注意警告:在多主机设置中启用 pc.ignore_sb 是危险的,因为存在上述脑裂情况的风险。但是,它确实简化了主从集群中的事情(尤其是在您只使用两个节点的情况下)。

除了上面提供的解决方案之外,您还可以使用 Galera Arbitrator 完全避免这种情况。 Galera Arbitrator 在仲裁计算中充当奇数节点。这意味着,如果您在双节点集群中的一个节点上启用 Galera Arbitrator,则该节点仍然是主要组件,即使另一个节点出现故障或失去网络连接。

http://galeracluster.com/documentation-webpages/twonode.html

【讨论】:

我使用SET GLOBAL wsrep_provider_options='pc.bootstrap=YES'; 出现:ERROR 1210 (HY000): Incorrect arguments to SET 【参考方案2】:

可能的原因是您的 node1 不正常地关闭了,或者至少 node2 认为它确实如此。在这种情况下,2 节点集群会出现脑裂情况,集群的其余部分无法决定它们是否应该是主要组件。这就是不推荐使用 2 节点集群的原因。

查看node1的日志,看它是否正常关闭,如果正常关闭,则查看node2的日志,看看它是如何感知这种情况的。如果它看到 node1 正常关闭,它会说类似

[Note] WSREP: forgetting xxxxxxx (tcp://X.X.X.X:XXXX)

等等;但是如果它认为另一个节点丢失了,那就更像

[Note] WSREP: (70f85e74, 'tcp://x.x.x.x:xxxx') turning message relay requesting on, nonlive peers: tcp://X.X.X.X:XXXX

等等。

请参阅http://nirbhay.in/blog/2015/02/split-brain/ 了解更多详细信息并记录脑裂情况的示例。

避免这种情况最便宜的方法是使用 Galera 仲裁器:http://nirbhay.in/blog/2013/11/what-is-galera-arbitrator/

【讨论】:

谢谢!出现此错误是因为我突然重新启动 Node1。但我只有两台服务器。我可以在 2 个服务器上安装 2 个 Galera Arbitrator 来解决这个问题吗? @elenst 技术上你可以,但它没有帮助。如果您倾向于重新启动整台机器,那么在那里运行的仲裁器也会出现故障,并且您将具有相同的脑裂,只是不是 1/1(剩下 1 个节点,丢失 1 个),而是 2/ 2.如果您的一台主机重启的风险很高,而另一台主机更稳定,您可以考虑为稳定的主机设置更高的权重 通过运行SET GLOBAL wsrep_provider_options="pc.weight=3" 或类似的东西。在这种情况下,当“弱”节点出现故障时,更强的节点会知道它仍然是主节点。如果碰巧强的那个掉了,你可以通过运行SET GLOBAL wsrep_provider_options='pc.bootstrap=true' 来恢复剩下的那个。请注意不要将两个节点都设置为引导程序,否则您最终会拥有两个单独的集群。 那么真正的解决方案是什么,我也面临这个问题

以上是关于mariadb galera - 节点关闭时出错 ERROR 1047 WSREP 尚未准备好节点以供应用程序使用的主要内容,如果未能解决你的问题,请参考以下文章

MariaDB Galera Cluster环境搭建及高可用测试

实战Mariadb galera Cluster集群架构

MariaDB GALERA 集群双节点部署

MariaDB Galera Cluster 之二 MariaDB Galera Cluster主要功能优缺点和对比

超时错误重新启动 mysql (mariadb) 这是 3 节点 galera 集群中的节点之一

Mariadb Galera Cluster 部署