xtrabackup-v2 SST方法
Contents
In MariaDB 10.1 and later, Mariabackup is the recommended backup method to use instead of Percona XtraBackup.
In MariaDB 10.3, Percona XtraBackup is not supported. See Percona XtraBackup Overview: Compatibility with MariaDB for more information.
In MariaDB 10.2 and MariaDB 10.1, Percona XtraBackup is only partially supported. See Percona XtraBackup Overview: Compatibility with MariaDB for more information.
xtrabackup-v2
SST 方法使用 Percona XtraBackup 工具执行 SST。这是一种不会阻塞捐赠节点的方法。
请注意,如果您使用 xtrabackup-v2
SST 方法,则还需要在服务器上安装 socat。这是将备份从捐赠节点流式传输到加入者节点所需的。
由于 Percona XtraBackup 是第三方产品,因此可能需要额外的安装和配置。有关供应商的信息,请参阅 Percona 的 xtrabackup SST 文档。
选择 Percona XtraBackup 进行 SST
要使用 xtrabackup-v2
SST 方法,必须在捐赠节点和加入者节点上设置 wsrep_sst_method=xtrabackup-v2
。可以使用 SET GLOBAL
在您打算成为 SST 捐赠者的节点上动态更改它。例如:
SET GLOBAL wsrep_sst_method='xtrabackup-v2';
可以在启动节点之前的服务器 option group 中的 option file 中设置它:
[mariadb] ... wsrep_sst_method = xtrabackup-v2
为了使 SST 正常工作,捐赠节点和加入者节点必须使用相同的 SST 方法。因此,建议在所有节点上将 wsrep_sst_method
设置为相同的值,因为任何节点通常都会成为捐赠者或加入者节点。
认证和权限
要使用 xtrabackup-v2
SST 方法,Percona XtraBackup 需要能够在捐赠节点上进行本地身份验证,以便它可以创建备份并流式传输到加入者。您可以通过设置 wsrep_sst_auth
系统变量来告诉捐赠节点使用哪个用户名和密码。它可以在您打算成为 SST 捐赠者的节点上使用 SET GLOBAL
命令进行动态更改。例如:
SET GLOBAL wsrep_sst_auth = 'xtrabackup:mypassword';
它也可以在服务器 选项组 中的 选项文件 中设置,以在启动节点之前进行设置:
[mariadb] ... wsrep_sst_auth = xtrabackup:mypassword
某些 认证插件 不需要密码。例如,unix_socket
和 gssapi
认证插件不需要密码。如果您使用的是不需要密码即可登录的用户帐户,则可以将 wsrep_sst_auth
的密码组件留空。例如:
[mariadb] ... wsrep_sst_auth = xtrabackup:
执行 SST 的备份用户帐户需要具有 与 Percona XtraBackup 相同的权限,即 RELOAD
、PROCESS
、LOCK TABLES
和 REPLICATION CLIENT
全局权限。为了安全起见,您应该确保在集群中的每个节点上都设置了这些权限。Percona XtraBackup 在捐赠节点上本地连接以执行备份,因此以下用户应该足够:
CREATE USER 'xtrabackup'@'localhost' IDENTIFIED BY 'mypassword'; GRANT RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'xtrabackup'@'localhost';
无密码身份验证 - Unix Socket
可以使用 unix_socket
身份验证插件为执行 SST 的用户帐户提供身份验证。这将提供不需要在 wsrep_sst_auth
中配置明文密码的好处。
用户帐户必须具有与运行 mysqld
进程的操作系统用户帐户相同的名称。在许多系统上,这是配置为 user
选项的用户帐户,并且通常默认为 mysql
。
例如,如果已经安装了 unix_socket
身份验证插件,则可以执行以下操作以创建用户帐户:
CREATE USER 'mysql'@'localhost' IDENTIFIED VIA unix_socket; GRANT RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'mysql'@'localhost';
然后,要配置 wsrep_sst_auth
,可以在启动节点之前的服务器 选项组 中的 选项文件 中设置以下内容:
[mariadb] ... wsrep_sst_auth = mysql:
无密码身份验证 - GSSAPI
可以使用 gssapi
身份验证插件为执行 SST 的用户帐户提供身份验证。这将提供不需要在 wsrep_sst_auth
中配置明文密码的好处。
必须先执行以下步骤:
- 您需要运行 MIT Kerberos 或 Microsoft Active Directory 的 KDC。
- 您需要为 MariaDB 服务器 创建一个 keytab 文件。
- 您需要 安装包含
[[authentication-plugin-gssapi|gssapi
身份验证插件的软件包]]。
- 您需要在 MariaDB 中 安装插件,以便可以使用
gssapi
身份验证插件。 - 您需要 配置插件。
- 您需要 创建一个使用
[[authentication-plugin-gssapi|gssapi
身份验证插件进行身份验证的用户帐户]],以便可以将该用户帐户用于 SST。此用户帐户将需要对应于后端 KDC 上存在的用户帐户。
例如,您可以执行以下操作以在 MariaDB 中创建用户帐户:
CREATE USER 'xtrabackup'@'localhost' IDENTIFIED VIA gssapi; GRANT RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'xtrabackup'@'localhost';
然后,要配置 wsrep_sst_auth
,可以在启动节点之前的服务器 选项组 中的 选项文件 中设置以下内容:
[mariadb] ... wsrep_sst_auth = xtrabackup:
选择捐赠节点
使用Percona XtraBackup创建SST的备份时,XtraBackup在备份结束时需要系统范围锁定。这是通过FLUSH TABLES WITH READ LOCK
完成的。
如果集群中的特定节点通过接收所有应用程序的写入流量而充当primary节点,则通常不应将此节点用作捐赠节点,因为系统范围锁定可能会干扰应用程序。在这种情况下,您可以通过设置wsrep_sst_donor
系统变量来定义一个或多个首选捐赠节点。
例如,假设我们有一个5节点集群,其中节点为node1
,node2
,node3
,node4
和node5
,并且假设node1
充当primary节点。可以通过在启动节点之前在服务器option group中的option file中设置以下内容来配置node2
的首选捐赠节点:
[mariadb] ... wsrep_sst_donor=node3,node4,node5,
尾随逗号告诉服务器允许在首选捐赠者不可用时使用任何其他节点作为捐赠者。因此,如果集群中只剩下node1
,尾随逗号允许将其用作捐赠节点。
Socat依赖项
在SST过程中,捐赠节点使用socat将备份流式传输到加入者节点。然后加入者节点在恢复之前准备备份。为使其正常工作,必须在捐赠节点和加入者节点上都安装socat实用程序。否则,MariaDB错误日志将包含类似于以下内容的错误:
WSREP_SST: [ERROR] socat not found in path: /usr/sbin:/sbin:/usr//bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin (20180122 14:55:32.993)
在RHEL/CentOS上安装Socat
在RHEL/CentOS上,可以从Extra Packages for Enterprise Linux (EPEL)存储库安装socat
。
TLS
此SST方法支持三种不同的TLS方法。可以通过在MariaDB配置文件的[sst]
部分中设置encrypt
选项来选择特定方法。选项如下:
- 使用内置于
socat
中的OpenSSL加密的TLS(encrypt=2
) - 使用具有与Galera兼容的证书和密钥的OpenSSL加密的TLS(
encrypt=3
) - 使用具有与MariaDB兼容的证书和密钥的OpenSSL加密的TLS(
encrypt=4
)
请注意,encrypt=1
是指已弃用并删除的TLS加密方法。
使用内置于Socat的OpenSSL加密进行TLS
要生成与此加密方法兼容的密钥,可以遵循这些说明。
例如:
- 首先,生成密钥和证书:
FILENAME=sst openssl genrsa -out $FILENAME.key 1024 openssl req -new -key $FILENAME.key -x509 -days 3653 -out $FILENAME.crt cat $FILENAME.key $FILENAME.crt >$FILENAME.pem chmod 600 $FILENAME.key $FILENAME.pem
- 在某些系统上,您还必须将dhparams添加到证书中:
openssl dhparam -out dhparams.pem 2048 cat dhparams.pem >> sst.pem
- 然后将证书和密钥复制到集群中的所有节点。
- 然后,在集群中的所有节点上配置以下内容:
[sst] encrypt=2 tca=/etc/my.cnf.d/certificates/sst.crt tcert=/etc/my.cnf.d/certificates/sst.pem
但是用适用于您系统的路径替换路径。
这应该允许加密您的SST。
使用 OpenSSL 加密和 Galera 兼容证书和密钥的 TLS
要生成与此加密方法兼容的密钥,您可以按照这些说明进行操作。
例如:
- 首先,生成密钥和证书:
# CA openssl genrsa 2048 > ca-key.pem openssl req -new -x509 -nodes -days 365000 \ -key ca-key.pem -out ca-cert.pem # server1 openssl req -newkey rsa:2048 -days 365000 \ -nodes -keyout server1-key.pem -out server1-req.pem openssl rsa -in server1-key.pem -out server1-key.pem openssl x509 -req -in server1-req.pem -days 365000 \ -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 \ -out server1-cert.pem
- 然后,在群集中的所有节点上复制证书和密钥。
- 然后,在群集中的所有节点上配置以下内容:
[sst] encrypt=3 tkey=/etc/my.cnf.d/certificates/server1-key.pem tcert=/etc/my.cnf.d/certificates/server1-cert.pem
但用适用于您系统的路径替换这些路径。
这样应该可以加密您的 SST。
使用 OpenSSL 加密和 MariaDB 兼容证书和密钥的 TLS
要生成与此加密方法兼容的密钥,您可以按照这些说明进行操作。
例如:
- 首先,生成密钥和证书:
# CA openssl genrsa 2048 > ca-key.pem openssl req -new -x509 -nodes -days 365000 \ -key ca-key.pem -out ca-cert.pem # server1 openssl req -newkey rsa:2048 -days 365000 \ -nodes -keyout server1-key.pem -out server1-req.pem openssl rsa -in server1-key.pem -out server1-key.pem openssl x509 -req -in server1-req.pem -days 365000 \ -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 \ -out server1-cert.pem
- 然后,在群集中的所有节点上复制证书和密钥。
- 然后,在群集中的所有节点上配置以下内容:
[sst] encrypt=4 ssl-ca=/etc/my.cnf.d/certificates/ca-cert.pem ssl-cert=/etc/my.cnf.d/certificates/server1-cert.pem ssl-key=/etc/my.cnf.d/certificates/server1-key.pem
但用适用于您系统的路径替换这些路径。
这样应该可以加密您的 SST。
日志
xtrabackup-v2
SST 方法有自己的日志记录,不在 MariaDB Server 日志记录之外。
记录到 SST 日志
默认情况下,在捐赠节点上,它记录到innobackup.backup.log
。此日志文件位于datadir
中。
默认情况下,在加入节点上,它记录到innobackup.prepare.log
和innobackup.move.log
。这些日志文件位于.sst
目录中,该目录是位于datadir
内部的隐藏目录。
每个后续 SST 都会覆盖这些日志文件,因此如果 SST 失败,最好在启动另一个 SST 之前将它们复制到安全位置,以便可以分析日志文件。请参见 MDEV-17973。
将日志记录到 Syslog
您可以通过在 选项文件 的 [sst]
#option-groups 中设置以下内容,将 SST 日志重定向到 syslog:
[sst] sst-syslog=1
您还可以通过在 选项文件 的 [mysqld_safe]
#option-groups 中设置以下内容,将 SST 日志重定向到 syslog:
[mysqld_safe] syslog
使用 IPv6 地址执行 SST
如果您正在使用 IPv6 地址执行 Percona XtraBackup SST,则需要将 socat
实用程序传递给 pf=ip6
选项。这可以通过在 选项文件 的 [sst]
#option-groups 中设置 sockopt
选项来完成。例如:
[sst] sockopt=",pf=ip6"
有关更多信息,请参见 MDEV-18797。
使用 Percona XtraBackup 手动执行 SST
在某些情况下,如果 Galera Cluster 的自动 SST 反复失败,则执行“手动 SST”可能会有所帮助。请参见以下页面以了解如何执行此操作: