Percona XtraDB Cluster高可用与状态快照传输(PXC 5.7 )

2018-04-13 HVA_hk

Percona XtraDB Cluster(下称PXC)高可用集群支持任意节点在运行期间的重启,升级或者意外宕机,即它解决了单点故障问题。那在这个意外宕机或者重启期间,该节点丢失的数据如何再次进行同步呢?本文介绍了在节点故障和重启PXC如何实现高可用以及状态快照传输的几种方法优缺点。

一、高可用

在具有3个节点的基本设置中,如果您关闭任何节点,Percona XtraDB集群将继续运行。在任何时候,您都可以关闭任何节点来执行维护或进行配置更改。即使在非计划的情况下(如节点崩溃或者通过网络无法使用),Percona XtraDB集群将继续工作,您将能够在工作节点上运行查询。

如果在节点关闭期间数据发生更改,则节点在再次加入群集时可以使用两个选项:

状态快照传输State Snapshot Transfer(SST),即将所有数据从一个节点复制到另一个时。

通常在新节点加入集群并从现有节点接收所有数据时使用SST。Percona XtraDB集群中有三种可用的SST方法:

mysqldump

rsync

xtrabackup

mysqldump与rsync的缺点是,当数据正在被复制的时候,您的集群状态将变为只读(这2个SST方式使用了FLUSH TABLES WITH READ LOCK)

使用SST xtrabackup方式,在整个同步过程中,不需要读锁(READ LOCK),仅用于同步.frm文件(与常规备份相同)。

增量状态传输Incremental State Transfer(IST)是指仅将增量更改从一个节点复制到另一个节点时。

即使没有将群集锁定在只读状态,SST可能会影响并干扰服务的正常运行。 IST可以避免这种情况。 如果某个节点短时间内关闭,它能够获取仅仅发生故障时刻的更改。 IST是在节点上使用缓存机制来实现。 每个节点都包含一个高速缓存,最后N次更改的环形缓冲区(大小可配置),并且该节点能够传输该高速缓存的一部分。 显然,只有当传输所需的变化量小于N时才能完成IST。如果它超过N,那么加入节点必须执行SST。

可以使用以下命令监视节点的当前状态:

SHOW STATUS LIKE ‘wsrep_local_state_comment’ ;

当一个节点处于状态Synced (6)时,它是集群的一部分并可以对外提供服务

二、状态快照传输

状态快照传输(SST)是从一个节点(捐献者)到加入节点(加入者)的完整数据拷贝。当新节点加入群集时使用它。为了与群集同步,新节点必须从已经是群集一部分的节点接收数据。

Percona XtraDB集群中有三种可用的SST方法:

mysqldump

rsync

xtrabackup

mysqldump和rsync缺点是捐献节点变为READ-ONLY当数据被复制时。另一方面,Xtrabackup SST使用备份锁定,这意味着Galera提供程序不会像FTWRL(带有读锁的刷新表)那样暂停。SST方法可以使用wsrep_sst_method变量进行配置。

注意

如果gcs.sync_donor变量设置为Yes (默认为No),那么如果捐献节点被SST阻塞,则整个集群将被阻塞。

1、选择SST捐献节点

如果没有可用的节点可以安全地执行增量状态传输(IST),则群集默认为SST。

如果有可用的节点可以执行IST,则集群首选远程节点上的本地节点作为捐献节点。

如果没有本地节点可用于执行IST,则群集将选择一个远程节点作为捐献节点。

如果有多个本地和远程节点可以执行IST,则群集将选择最高seqno的节点作为捐献节点。

2、使用Percona Xtrabackup

默认的SST方法是使用Percona XtraBackup的xtrabackup-v2。这是利用备份锁的最少阻塞方法。XtraBackup在捐献节点上本地运行,因此在捐献节点上设置正确的用户凭证非常重要。为了让Percona XtraDB集群使用XtraBackup执行SST,需要在wsrep_sst_auth变量中设置用于连接到捐献节点的证书。除了凭证之外,还需要在服务器配置文件my.cnf中指定datadir,否则传输过程将失败。

有关所需凭据的更多信息,请参阅XtraBackup手册。

要测试凭据是否可用,请在捐献节点上使用wsrep_sst_auth变量中指定的用户名和密码运行innobackupex。例如,如果值wsrep_sst_auth是root:Passw0rd,在innobackupex命令应该是这样的:

innobackupex –user = root –password = Passw0rd /tmp/

Percona XtraBackup SST配置文档中提供了有关此方法的详细信息。

3、使用mysqldump

此方法使用标准mysqldump实用程序来转储来自捐献节点的所有数据库,并将其导入加入节点。要使此方法有效,wsrep_sst_auth需要使用根证书设置变量。这种方法是最慢的,它在SST期间执行全局锁定,这阻止了对捐献节点的写入。

用于此方法的脚本是/usr/bin/wsrep_sst_mysqldump ,它包含在Percona XtraDB Cluster二进制包中。

4、运用 rsync

此方法使用rsync将文件从捐献节点复制到加入节点。在某些情况下,这可能比使用XtraBackup更快,但它需要一个全局数据锁定,这将阻止写入到捐献节点。此方法不需要在wsrep_sst_auth变量中设置根凭证。

用于此方法的脚本是/usr/bin/wsrep_sst_rsync ,它包含在Percona XtraDB Cluster二进制包中。

5、表空间不在数据目录中的表的SST

例如:

CREATE TABLE t1 (c1 INT PRIMARY KEY ) DATA DIRECTORY = ‘/alternative/directory’ ;

结果取决于SST方法:

SST使用 rsync

SST会报告成功,但表格的数据不会被复制,因为rsync只是复制文件。您将无法访问joiner节点上的表:

mysql> select * from t1;

ERROR 1812 (HY000): Tablespace is missing for table sbtest . t1 .

SST 使用mysqldump

按预期工作。如果文件不存在,它将被创建。否则,它将尝试使用该文件(如果该文件没有预期的格式,则返回错误)。

使用Percona XtraBackup的SST

XtraBackup会将表格还原到joiner节点上的相同位置。如果目标目录不存在,它将被创建。如果目标文件已经存在,则会返回错误,因为XtraBackup无法清除不在数据目录中的表空间。

三、更多参考

https://www.percona.com/doc/percona-xtradb-cluster/LATEST/features/highavailability.html https://www.percona.com/doc/percona-xtradb-cluster/LATEST/manual/state_snapshot_transfer.html