vlambda博客
学习文章列表

PXC-mysql集群的部署及灾难恢复测试

自从生产发现mysql双主问题以来,瞬间开始了mysql大型填坑工程……,这次可以算完结篇了。


近期在看openstack的高可用架构,发现各种文档文章都在介绍galera+xtrabackup来实现元数据库的高可用架构,所以搭了个环境来测试实现原理及日常维护操作。


环境:4台虚拟机,Centos7.6,配置随意



概念提要:

galera作为mysql的真-多主集群架构,提供了三种同步方式:mysqldump、rsync和xtrabackup,以下是优缺点

galera的节点状态有以下几种:

Open

节点启动成功,尝试连接到集群

Primary

节点已处于集群中,在新节点加入时,选取donor进行数据库同步时会产生的状态

Joiner

节点处于等待接收或正在接收同步文件的状态

Joined

节点完成数据同步,但还有部分数据不是最新的,在追赶与集群数据一致的状态

Synced

节点正常提供服务的状态,表示当前节点数据状态与集群数据状态是一致的

Donor

表示该节点被选为Donor节点,正在为新加进来的节点进行全量数据同步,此时该节点对客户端不提供服务

使用show status like 'wsrep_local_state_comment';来查看


同步机制:

IST: Incremental State Transfer 增量同步
SST
State Snapshot Transfer 全量同步



部署开始:

http://rpm.pbone.net/index.php3下载libev依赖包并安装:

libev-4.15-7.el7.x86_64.rpm


yum install perl-Time-HiRes

yum -y installperl-DBD-MySQL.x86_64

yum -y install libaio*

yum -y install  perl

yum -y install  rsync


https://releases.galeracluster.com

下载galera和wsrep的rpm包

https://www.percona.com

下载percona-xtrabackup备份插件


rpm -qa | grep -E 'galera|wsrep|percona'

 

galera-3-25.3.28-1.el7.x86_64

mysql-wsrep-common-5.7-5.7.28-25.20.el7.x86_64

mysql-wsrep-client-5.7-5.7.28-25.20.el7.x86_64

percona-xtrabackup-24-2.4.18-1.el7.x86_64

mysql-wsrep-libs-compat-5.7-5.7.28-25.20.el7.x86_64

mysql-wsrep-libs-5.7-5.7.28-25.20.el7.x86_64

mysql-wsrep-server-5.7-5.7.28-25.20.el7.x86_64

percona-xtrabackup-24-debuginfo-2.4.18-1.el7.x86_64

安装完成后,配置mysql


 

[root@galera1 opt]# grep ^[0-Z] /etc/my.cnf

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

symbolic-links=0

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid

wsrep_provider=/usr/lib64/galera-3/libgalera_smm.so

wsrep_cluster_name=mysql_galera_cluster

wsrep_cluster_address="gcomm://192.168.245.131,192.168.245.132,192.168.245.133"

wsrep_sst_method=xtrabackup

wsrep_sst_auth=root:P@sswo2d

wsrep_node_name=galera1

#节点名称,各个节点需按实际配置

wsrep_node_address=192.168.245.131

#节点ip,各个节点需按实际配置


以galera作为主节点,启动主节点

/usr/bin/mysqld_bootstrap

配置mysql密码

grep -i 'temp' /var/log/mysqld.log

mysqladmin -uroot -ppassword 'P@sswo2d'


随后在galera2、galera3 启动mysqld

systemctl start mysqld


PXC-mysql集群的部署及灾难恢复测试

PXC-mysql集群的部署及灾难恢复测试


测试数据:

-- galera1

create database test;

use test;

create table t1(a int);

insert into t1 values(1);

 

-- galera2

use test;

create table t2(a int);

insert into t2 values(2);

 

-- galera3

use test;

create table t3(a int);

insert into t3 values(3);


PXC-mysql集群的部署及灾难恢复测试

galera集群配置安装配置完成!


场景一:

停机维护后启动集群

比较特殊的是,galera需要找到最后一台离开集群的节点作为主节点重新启动:

cat /var/lib/mysql/grastate.dat

[root@galera3 ~]# cat/var/lib/mysql/grastate.dat

# GALERA saved state

version: 2.1

uuid:   19c74031-318a-11ea-b151-923bc3a3d033

seqno:  8

safe_to_bootstrap: 1

 

发现galera3 是最后离开集群的,galera3 上执行(这种方式启动自带new-cluster)

/usr/bin/mysqld_bootstrap

其他节点启动:systemctl start mysqld

验证:

PXC-mysql集群的部署及灾难恢复测试


场景二:

添加新节点

新建虚拟机galera4,安装rpm包后

/etc/my.cnf

wsrep_provider=/usr/lib64/galera-3/libgalera_smm.so

wsrep_cluster_name=mysql_galera_cluster

wsrep_cluster_address="gcomm://192.168.245.131,192.168.245.132,192.168.245.133,192.168.245.134"

wsrep_sst_method=xtrabackup

wsrep_sst_auth=root:P@sswo2d

wsrep_node_name=galera4

wsrep_node_address=192.168.245.134


systemctl start mysqld

PXC-mysql集群的部署及灾难恢复测试

启动完成后查看同步效果

PXC-mysql集群的部署及灾难恢复测试

PXC-mysql集群的部署及灾难恢复测试

验证数据,在galera4上:

PXC-mysql集群的部署及灾难恢复测试


场景三:

恢复故障节点

假设galera3 节点服务器硬件损坏宕机,数据不同步

此时只需要删除galera缓存文件后重启mysql服务即可

PXC-mysql集群的部署及灾难恢复测试

重启mysqld

PXC-mysql集群的部署及灾难恢复测试

PXC-mysql集群的部署及灾难恢复测试


场景四:

假设数据文件全部损坏,删除/var/lib/mysql/目录下所有文件

PXC-mysql集群的部署及灾难恢复测试

重启后恢复

PXC-mysql集群的部署及灾难恢复测试

查看日志,galera3节点从其他节点拉取了数据文件,恢复服务

PXC-mysql集群的部署及灾难恢复测试

PXC-mysql集群的部署及灾难恢复测试


场景五:

生产环境中,数据过于巨大,由于SST在复制过程中会影响DDL业务,所以采用IST复制来减少影响,计划使用galera3的全量及增量备份来恢复galera4(模拟新加节点)的数据。


Galera3节点操作:

  本地全量备份:

innobackupex--defaults-file=/etc/my.cnf --user=root --password=P@sswo2d--socket=/var/lib/mysql/mysql.sock --galera-info --no-lock /root/galera-backup/full/


建个测试库,测试增量备份

mysql> create database backup;

Query OK, 1 row affected (0.01 sec)



本地增量备份:

innobackupex --defaults-file=/etc/my.cnf --user=root--password=P@sswo2d--incremental-basedir=/root/galera-backup/full/2020-01-08_04-30-05--incremental /root/galera-backup/incr/


从galera3 拷贝备份文件到galera4,删除galera4现有的数据文件,模拟该节点新加入集群,需要同步数据:

scp -r /root/galera-backup/ galera4:/root/


在galera4上先恢复全量restore:




innobackupex --defaults-file=/etc/my.cnf--user=root --password=P@sswo2d --apply-log --redo-only  /root/galera-backup/full/2020-01-08_04-30-05


回放增量recovery:

innobackupex --defaults-file=/etc/my.cnf--user=root --password=P@sswo2d --apply-log /root/galera-backup/full/2020-01-08_04-30-05 --incremental-dir=/root/galera-backup/incr/2020-01-08_04-31-43/


回放全量recovery:

innobackupex --defaults-file=/etc/my.cnf--user=root --password=P@sswo2d --apply-log /root/galera-backup/full/2020-01-08_04-30-05


生成数据文件cp-back:

innobackupex --defaults-file=/etc/my.cnf --user=root --password=P@sswo2d --copy-back /root/galera-backup/full/2020-01-08_04-30-05


生成grastate.dat文件

根据xtrabackup_galera_info文件中的内容生成grastate.dat文件,用于IST增量同步。查看galera4节点上的xtrabackup_galera_info文件


cat xtrabackup_galera_info

19c74031-318a-11ea-b151-923bc3a3d033:9


从galera3 拷贝grastate.dat并修改seqno:

# GALERA saved state

version: 2.1

uuid:   19c74031-318a-11ea-b151-923bc3a3d033

seqno:   9

safe_to_bootstrap: 0


更改权限

chown -R mysql:mysql /var/lib/mysql/

启动galera4:

systemctl startmysqld



PXC-mysql集群的部署及灾难恢复测试

验证数据

PXC-mysql集群的部署及灾难恢复测试



场景六:

  • 集群灾难恢复

做个全备和增量备份,这时误操作删库:

PXC-mysql集群的部署及灾难恢复测试

恢复

计划使用galera4 作为恢复节点,停库,清数据

先恢复全量restore

innobackupex --defaults-file=/etc/my.cnf--user=root --password=P@sswo2d --apply-log --redo-only  /root/galera-backup/full/2020-01-07_04-15-47


回放增量recovery

innobackupex --defaults-file=/etc/my.cnf--user=root --password=P@sswo2d --apply-log/root/galera-backup/full/2020-01-07_04-15-47/ --incremental-dir=/root/galera-backup/incr/2020-01-07_04-16-50/


回放全量recovery

innobackupex --defaults-file=/etc/my.cnf--user=root --password=P@sswo2d --apply-log/root/galera-backup/full/2020-01-07_04-15-47


生成数据文件cp-back

innobackupex --defaults-file=/etc/my.cnf --user=root --password=P@sswo2d --copy-back /root/galera-backup/full/2020-01-07_04-15-47


修改权限

chown -R mysql:mysql /var/lib/mysql/


停止其他节点mysqld,以主节点启动最新数据节点galera4

galera1、glera2、galera3上执行systemctl stop mysqld


galera4 以新集群主节点方式启动

/usr/bin/mysqld_bootstrap


验证数据恢复成功

PXC-mysql集群的部署及灾难恢复测试

其他节点已经加入集群

验证集群数据

全库完整恢复!


经过模拟的六个常见场景的恢复备份操作,架构确实实现了一个多主mysql集群的在线备份和恢复。


总结几个运维经常需要查看的状态和参数:

show status like ‘wsrep_local_state_comment'; 节点状态

show status like ‘wsrep_cluster_status'; 集群状态

show status like ‘wsrep_cluster_size'; 存活节点数量


大型集群中使用该架构作为元数据库的备份策略可以考虑这样:

3个节点,每个节点均配置定时备份策略,备份时间点错开。

每周日00:00点一次全备,每天00:00点进行增量备份,自动清理前一个月的备份文件。