崩溃恢复¶
与标准的MySQL复制不同,PXC集群就像一个逻辑实体,它控制每个节点的状态和一致性以及整个集群的状态。这允许比传统异步复制更有效地维护数据完整性,同时不会丢失多个节点上的安全写操作。
但是,在某些情况下,数据库服务可能会因为没有节点能够为请求提供服务而停止。
场景一:A节点安全停止¶
在一个有三个节点的集群(节点a、节点B、节点C)中,有一个节点(例如节点a)被优雅地停止:出于维护、配置更改等目的。
在这种情况下,其他节点收到来自停止节点的“good bye”消息,集群大小减小;一些属性,如仲裁计算或自动增量被自动更改。当节点A再次启动时,它将基于其节点A加入集群wsrep_cluster_address变量my.cnf.
如果写集缓存(gcache.size)在节点B和/或C上仍然执行所有的事务,而节点A关闭,连接是可能的坚持.如果坚持是不可能的,由于捐赠的gcache中缺少事务,备用决定是由捐赠和风场自动启动。
场景2:两个节点优雅停止¶
类似于场景一:A节点安全停止,集群大小减少到1 -甚至剩下的单个节点C构成了主要组件,并能够为客户端请求提供服务。要将节点返回到集群中,您只需要启动它们。
然而,当一个新节点加入集群时,节点C将切换到“Donor/Desynced”状态,因为它必须至少向第一个加入节点提供状态传输。在这个过程中仍然可以读/写它,但它可能会慢得多,这取决于在状态传输期间应该发送多少数据。此外,一些负载平衡器可能认为捐赠节点不可操作,并将其从池中移除。因此,最好避免出现只有一个节点处于up状态的情况。
如果您重新启动节点A,然后重新启动节点B,您可能希望确保注释B没有使用节点A作为状态传输提供者:节点A的gcache中可能没有所需的所有写集。在你的配置文件中指定节点C作为供体,并启动mysql服务:
$systemctl开始mysql
场景3:所有三个节点都被优雅地停止¶
集群已经完全停止,问题是重新初始化它。重要的是,PXC节点将其最后执行的位置写入grastate.dat文件。
通过比较这个文件中的seqno数字,您可以看到哪个是最高级的节点(很可能是最后停止的节点)。集群必须使用此节点进行引导,否则具有更高级位置的节点将不得不执行完整的引导风场加入从低级集群初始化的集群。因此,一些事务将会丢失)。要引导第一个节点,像这样调用启动脚本:
$systemctl开始mysql@bootstrap.service
请注意
即使从最高级的节点引导,其他节点的序列号也会更低。他们仍然需要通过完整的风场因为Galera缓存重启时不保留。
因此,建议停止对集群的写操作之前其完全关机,使所有节点都能停在同一位置。另请参阅pc.recovery.
场景四:集群中有一个节点消失¶
这是当一个节点由于断电、硬件故障、内核恐慌、mysqld崩溃、kill - 9mysqld pid,等等。
其余两个节点注意到与节点A的连接断开,并开始尝试重新连接。经过多次超时后,节点A被移出集群。仲裁被保存(3个节点中有2个是up的),因此不会发生服务中断。重启后,节点A自动加入场景一:A节点安全停止).
场景5:集群中消失2个节点¶
两个节点不可用,其余节点(节点C)不能单独形成仲裁。集群必须切换到非主模式,在这种模式下,MySQL拒绝为任何SQL查询提供服务。在这种状态下,mysqld节点C上的进程仍在运行,可以连接到,但任何与数据相关的语句都失败并报错
>选择*从test.sbtest1;
错误消息
错误1047 (08S01): wsprep还没有为应用程序使用准备节点
在节点C决定不能访问节点A和节点b之前,可以进行读操作。
只要其他节点可用,集群就会自动重新形成。如果节点B和节点C只是从节点A的网络断开,但它们仍然可以相互联系,它们将继续工作,因为它们仍然形成quorum。
如果节点A和节点B崩溃,您需要手动启用节点C上的主组件,然后才能启动节点A和节点B。执行此操作的命令是:
>集全球wsrep_provider_options=“pc.bootstrap = true”;
这种方法只有在其他节点关闭之前才有效!否则,您将得到两个具有不同数据的集群。
另请参阅
场景6:所有节点在没有适当的关机程序的情况下宕机¶
在数据中心电源故障或遇到MySQL或Galera错误时,可能会出现这种情况。此外,当集群检测到每个节点都有不同的数据时,可能会导致数据一致性受损。的grastate.dat文件未更新,且不包含有效序列号(seqno)。它可能是这样的:
$ cat /var/lib/mysql/grastate.dat # GALERA保存状态版本:2.1 uuid: 220dcdcb-1629-11e4-add3-aec059ad3734 seqno: -1 safe_to_bootstrap: 0
在这种情况下,您不能确保所有节点都是一致的。我们不能使用safe_to_bootstrap变量来确定最后一个事务被提交到的节点0对于每个节点。除非您开始,否则从这样的节点引导的尝试将会失败mysqld与——wsrep-recover参数:
$mysqld——wsrep-recover
在输出中搜索报告恢复位置的行,在节点UUID (1122在这种情况下):
预期的输出
……[注]wsprep:恢复位置:220dcdcb-1629-11e4-add3-aec059ad3734:1122…
被恢复位置标记为最大数字的节点是最佳引导候选节点。在其grastate.dat文件,将safe_to_bootstrap变量设置为1.然后,从这个节点开始引导。
请注意
中标记为安全的节点在关闭后,可以从该节点启动grastate.dat文件。
...Safe_to_bootstrap: 1…
另请参阅
Galera文档介绍Galera集群中的安全引导功能
在最近的加莱拉版本中,选项pc.recovery(默认启用)将集群状态保存到一个名为gvwstate.dat在每个成员节点上。正如这个选项的名称所示(pc - primary component),它只保存处于primary状态的集群。该文件的示例内容如下所示:
Cat /var/lib/mysql/gvwstate.dat my_uuid: 76de8ad9-2aac-11e4-8089-d27fd06893b9 #vwbeg view_id: 3 6c821ecc-2aac-11e4-85a5-56fe513c651f 3 bootstrap: 0 member: 6c821ecc-2aac-11e4-85a5-56fe513c651f 0 member: 6d80ec1b-2aac-11e4-8d1e-b2b2f6caf018 0 member: 76de8ad9-2aac-11e4- 8d1e- b2b2f6caf09 0 #vwend
我们可以看到一个三个节点的集群,所有成员都是向上的。多亏了这个新特性,一旦所有成员开始相互看到,节点将尝试恢复主组件。这使得PXC集群自动从关机状态恢复,无需任何手动干预!在日志中我们将看到:
场景7:集群因脑裂而失去主状态¶
为了本例的目的,让我们假设我们有一个由偶数个节点组成的集群:例如6个。其中三个在一个位置,而另外三个在另一个位置,它们失去了网络连接。避免这种拓扑是最佳实践:如果不能有奇数个实际节点,可以使用一个额外的仲裁器(garbd)节点或设置一个更高的pc。一些节点的权重。但是当大脑以任何方式分裂时,没有一个被分离的组可以维持quorum:所有节点必须停止服务请求,集群的两个部分将不断尝试重新连接。
如果希望在网络链路恢复之前恢复服务,可以使用中所述的相同命令使其中一个组再次成为主组场景5:集群中消失2个节点
>集全球wsrep_provider_options=“pc.bootstrap = true”;
在此之后,您可以在集群的手动恢复部分上工作,而另一半应该能够使用自动重新加入坚持只要网络链路恢复。
警告
如果在两个分离的部分上都设置了引导选项,那么最终将得到两个活动的集群实例,数据可能会彼此分离。在这种情况下,在节点重新启动和配置文件中指定的成员重新连接之前,恢复网络链路不会使它们重新连接。
然后,由于Galera复制模型真正关心数据一致性:一旦检测到不一致,由于数据差异而无法执行行更改语句的节点将执行紧急关闭,并且将节点带回集群的唯一方法是通过full风场
基于Percona数据库性能博客的材料雷竞技下载官网
本文基于Galera复制的博客文章-如何恢复PXC集群Przemysław Malkowski: https://www.雷竞技下载官网percona.com/blog/2014/09/01/galera-replication-how-to-recover-a-pxc-cluster/