一、Percona XtraDB Cluster相关概念及原理
1、Percona XtraDB Cluster简介
Percona XtraDB Cluster是基于Galera协议的MySQL高可用集群架构。Galera是Codership提供的多主数据同步复制机制,具有高可用性,方便扩展,可以实现多个MySQL节点间的数据同步复制以及读写,并且可保障数据库的服务高可用及数据一致性。基于Galera的高可用方案主要有MariaDB Galera Cluster和Percona XtraDB Cluster(简称PXC)。PXC属于一套近乎完美的MySQL高可用集群解决方案,相比那些传统的基于主从复制模型的集群架构MHA和MM+Keepalived,Galera Cluster最突出的特点就是解决了诟病已久的数据复制延迟问题,基本上可以达到实时同步,而且节点与节点之间,它们相互的关系是对等的。本身Galera Cluster也是一种多主架构。文章源自小柒网-https://www.yangxingzhen.cn/8249.html
要搭建PXC架构至少需要3个MySQL实例来组成一个集群,3个实例之间不是主从模式,而是各自为主,所以三者是对等关系,不分从属,这就叫multi-master架构。客户端写入和读取数据时,连接哪个实例都是一样的,读取到的数据也都是相同的,写入任意一个实例之后,集群自身会将新写入的数据同步到其它实例上,这种架构不共享任何数据,是一种高冗余架构。
文章源自小柒网-https://www.yangxingzhen.cn/8249.html
2、PXC原理
文章源自小柒网-https://www.yangxingzhen.cn/8249.html
PXC最常使用如下4个端口号:
文章源自小柒网-https://www.yangxingzhen.cn/8249.html
1)3306:数据库对外服务的端口号
文章源自小柒网-https://www.yangxingzhen.cn/8249.html
2)4444:请求SST的端口号
文章源自小柒网-https://www.yangxingzhen.cn/8249.html
3)4567:组成员之间进行沟通的端口号
文章源自小柒网-https://www.yangxingzhen.cn/8249.html
4)4568:用于传输IST的端口号
文章源自小柒网-https://www.yangxingzhen.cn/8249.html
备注:
文章源自小柒网-https://www.yangxingzhen.cn/8249.html
SST:State Snapshot Transfer,全量数据传输
文章源自小柒网-https://www.yangxingzhen.cn/8249.html
IST:Incremental State Transfer,增量数据传输
Mysql PXC的操作流程,首先客户端发起一个事务,该事务先在本地执行,执行完成后发起对事务的提交操作。在提交之前需要将产生的复制写集广播出去,然后获取到一个全局的事务ID号,一并传送到另一节点上。通过验证合并数据之后,发现没有冲突数据,执行apply_cb和commit_cb操作,否则就需要取消(discard)此次事务的操作。而当前server节点通过验证之后,执行提交操作,并返回OK,如果验证没通过,则执行回滚。当然在生产中至少要有三个节点的集群环境,如果其中有一个节点没有验证通过,出现了数据冲突,那么此时采取的方式就是将出现不一致的节点踢出集群环境,而且它自己会执行shutdown命令,自动关机。
3、PXC架构的优缺点
1)优点:
1、实现MySQL集群架构的高可用性和数据强一致性
2、实现真正的多节点读写集群方案
3、改善了传统意义上的主从复制延迟问题,基本上达到了实时同步
4、新加入的节点可以自动部署,无需提供手动备份,维护方便
5、多节点写入,数据库故障切换容易
2)缺点:
1、只支持InnoDB引擎,其它存储引擎的更改不复制,DDL语句在statement级别被复制,并且对mysql.*表的更改会基于此被复制,例如:CREATE USER...语句会被复制,但INSERT INTO mysql.user...语句则不会被复制,可通过wsrep_replicate_myisam参数开启MyISAM存储引擎的复制,但这只是一个实验性的参数
2、新加入节点采用SST时的代价高
3、存在写扩大问题
4、任何更新事务都需要全局验证通过,才会在每个节点库上执行,集群性能/吞吐量受限于性能最差的节点,也就是经常说的短板效应
5、由于需要保证数据的一致性,所以在多节点并发写时,锁冲突及死锁问题比较严重
6、所有表必须含有主键
7、不支持LOCK TABLE等显式表级别的锁定操作
8、不支持XA
4、PXC中涉及到的重要概念和核心参数
1)集群中节点的数量:整个集群中节点数量应该控制在最少3个、最多8个的范围内。最少3个节点是为了防止出现脑裂现象,因为只有在2个节点下才会出现此现象。脑裂现象的标志就是输入任何命令,返回的结果都是unknown command。节点在集群中,会因新节点的加入或故障、同步失效等原因发生状态的切换。
2)节点状态的变化阶段:
1、open:节点启动成功,尝试连接到集群时的状态
2、primary:节点已处于集群中,在新节点加入并选取donor进行数据同步时的状态
3、joiner:节点处于等待接收同步文件时的状态
4、joined:节点完成数据同步工作,尝试保持和集群进度一致时的状态
5、synced:节点正常提供服务时的状态,表示已经同步完成并和集群进度保持一致
6、donor:节点处于为新加入的节点提供全量数据时的状态
备注:donor节点就是数据的贡献者,如果一个新节点加入集群,此时又需要大量数据的SST数据传输,就有可能因此而拖垮整个集群的性能,所以在生产环境中,如果数据量较小,还可以使用SST全量数据传输,但如果数据量很大就不建议使用这种方式,可以考虑先建立主从关系,然后再加入集群。
3)节点的数据传输方式:一种叫SST全量数据传输,另一种叫IST增量数据传输。SST数据传输有xtrabackup、mysqldump和rsync三种方式,而增量数据传输就只有一种方式xtrabackup,但生产环境中一般数据量较小时,可以使用SST全量数据传输,但也只使用xtrabackup方法。
4)GCache模块:在PXC中一个特别重要的模块,它的核心功能就是为每个节点缓存当前最新的写集。如果有新节点加入进来,就可以把新数据的增量传递给新节点,而不需要再使用SST传输方式,这样可以让节点更快地加入集群中,涉及如下参数:
1、gcache.size:缓存写集增量信息的大小,它的默认大小是128MB,通过wsrep_provider_options参数设置,建议调整为2GB~4GB范围,足够的空间便于缓存更多的增量信息。
2、gcache.mem_size:GCache中内存缓存的大小,适度调大可以提高整个集群的性能
3、gcache.page_size:如果内存不够用(GCache不足),就直接将写集写入磁盘文件中
二、准备工作(如无特殊说明,3个节点都需要执行如下操作)
1、演示环境
IP地址 |
操作系统 |
主机名 |
角色 |
数据库版本 |
安装方式 |
172.16.80.198 |
Centos 7.9 |
node1 |
master1 |
Percona-XtraDB-Cluster-57-5.7.39 |
yum |
172.16.80.199 |
Centos 7.9 |
node2 |
master2 |
Percona-XtraDB-Cluster-57-5.7.39 |
yum |
172.16.80.200 |
Centos 7.9 |
node3 |
master3 |
Percona-XtraDB-Cluster-57-5.7.39 |
yum |
2、关闭SELinux和firewalld
# 所有节点执行以下命令
[root@localhost ~]# sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl stop firelwalld
3、配置主机名
# Node1
[root@localhost ~]# hostnamectl set-hostname node1
# Node2
[root@localhost ~]# hostnamectl set-hostname node2
# Node3
[root@localhost ~]# hostnamectl set-hostname node3
4、配置/etc/hosts文件
# 所有节点执行
[root@node1 ~]# cat >>/etc/hosts <<EOF
172.16.80.198 node1
172.16.80.199 node2
172.16.80.200 node3
EOF
6、配置epel源
# 所有节点执行
[root@node1 ~]# yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
7、安装清华大学mysql源
# 所有节点执行
[root@node1 ~]# cat >/etc/yum.repos.d/mysql-community.repo <<EOF
[mysql-connectors-community]
name=MySQL Connectors Community
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql-connectors-community-el7-\$basearch/
enabled=1
gpgcheck=1
gpgkey=https://repo.mysql.com/RPM-GPG-KEY-mysql
[mysql-tools-community]
name=MySQL Tools Community
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql-tools-community-el7-\$basearch/
enabled=1
gpgcheck=1
gpgkey=https://repo.mysql.com/RPM-GPG-KEY-mysql
[mysql-5.7-community]
name=MySQL 5.7 Community Server
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql-5.7-community-el7-\$basearch/
enabled=1
gpgcheck=1
gpgkey=https://repo.mysql.com/RPM-GPG-KEY-mysql
EOF
三、yum方式安装配置PXC(如无特殊说明,3个节点都需要执行如下操作)
1、安装PXC
# 所有节点执行
[root@node1 ~]# yum -y install Percona-XtraDB-Cluster-57
备注:安装后生成的比较重要的配置文件
- /etc/percona-xtradb-cluster.conf.d/mysqld.cnf
- /etc/percona-xtradb-cluster.conf.d/mysqld_safe.cnf
- /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
2、master1节点修改mysqld.cnf配置文件
# master1节点操作
[root@node1 ~]# cat >/etc/percona-xtradb-cluster.conf.d/mysqld.cnf <<EOF
[mysqld]
server-id=1
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
log_bin=mysql-bin
log_bin_index=mysql-bin.index
log_slave_updates
expire_logs_days=7
symbolic-links=0
port=3306
lower_case_table_names=1
character_set_server=utf8mb4
collation_server=utf8mb4_general_ci
innodb_file_per_table=1
skip_name_resolve=1
slow_query_log=1
slow_query_log_file=slow.log
EOF
# master2节点操作
[root@node2 ~]# cat >/etc/percona-xtradb-cluster.conf.d/mysqld.cnf <<EOF
[mysqld]
server-id=2
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
log_bin=mysql-bin
log_bin_index=mysql-bin.index
log_slave_updates
expire_logs_days=7
symbolic-links=0
port=3306
lower_case_table_names=1
character_set_server=utf8mb4
collation_server=utf8mb4_general_ci
innodb_file_per_table=1
skip_name_resolve=1
slow_query_log=1
slow_query_log_file=slow.log
EOF
# master3节点操作
[root@node3 ~]# cat >/etc/percona-xtradb-cluster.conf.d/mysqld.cnf <<EOF
[mysqld]
server-id=3
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
log_bin=mysql-bin
log_bin_index=mysql-bin.index
log_slave_updates
expire_logs_days=7
symbolic-links=0
port=3306
lower_case_table_names=1
character_set_server=utf8mb4
collation_server=utf8mb4_general_ci
innodb_file_per_table=1
skip_name_resolve=1
slow_query_log=1
slow_query_log_file=slow.log
EOF
备注:
1)尽管Galera Cluster不再需要通过binlog的形式进行同步,但还是建议在配置文件中开启二进制日志功能,原因是后期如果有新节点需要加入,老节点通过SST全量传输的方式向新节点传输数据,很可能会拖垮集群性能,所以让新节点先通过binlog方式完成同步后再加入集群会是一种更好的选择
3、master1节点修改wsrep.cnf配置文件
# master1节点操作
[root@node1 ~]# cat >/etc/percona-xtradb-cluster.conf.d/wsrep.cnf <<EOF
[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
wsrep_provider_options="gcache.size=2G"
wsrep_cluster_address="gcomm://node1,node2,node3"
binlog_format=ROW
default_storage_engine=InnoDB
wsrep_slave_threads=8
wsrep_log_conflicts
innodb_autoinc_lock_mode=2
wsrep_node_address=172.16.80.198
wsrep_cluster_name=pxc-cluster
wsrep_node_name=node1
pxc_strict_mode=ENFORCING
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth="sstuser:s3cretPass"
EOF
# master2节点操作
[root@node2 ~]# cat >/etc/percona-xtradb-cluster.conf.d/wsrep.cnf <<EOF
[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
wsrep_provider_options="gcache.size=2G"
wsrep_cluster_address="gcomm://node1,node2,node3"
binlog_format=ROW
default_storage_engine=InnoDB
wsrep_slave_threads=8
wsrep_log_conflicts
innodb_autoinc_lock_mode=2
wsrep_node_address=172.16.80.199
wsrep_cluster_name=pxc-cluster
wsrep_node_name=node2
pxc_strict_mode=ENFORCING
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth="sstuser:s3cretPass"
EOF
# master3节点操作
[root@node3 ~]# cat >/etc/percona-xtradb-cluster.conf.d/wsrep.cnf <<EOF
[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
wsrep_provider_options="gcache.size=2G"
wsrep_cluster_address="gcomm://node1,node2,node3"
binlog_format=ROW
default_storage_engine=InnoDB
wsrep_slave_threads=8
wsrep_log_conflicts
innodb_autoinc_lock_mode=2
wsrep_node_address=172.16.80.200
wsrep_cluster_name=pxc-cluster
wsrep_node_name=node3
pxc_strict_mode=ENFORCING
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth="sstuser:s3cretPass"
EOF
常用配置参数说明:
1)wsrep_provider:Galera库的路径和文件名
2)wsrep_provider_options:Galera库的额外参数
3)wsrep_cluster_address:集群中各节点IP
4)binlog_format:二进制日志的记录格式
5)default_storage_engine:默认使用的存储引擎
6)wsrep_slave_threads:使用的从属线程个数
7)wsrep_node_address:本节点IP
8)wsrep_cluster_name:集群名称
9)wsrep_node_name:本节点在集群中的名称
10)wsrep_sst_method:SST传输数据的方式,有xtrabackup、mysqldump和rsync三种,前两者在传输时都需要对donor加全局只读锁(FLUSH TABLES WITH READ LOCK),而xtrabackup则不需要(它使用percona自己提供的backup lock),强烈推荐使用xtrabackup-v2方式
11)wsrep_sst_auth:在SST传输时需要使用的认证凭据,格式为"用户:密码"
备注:需要注意wsrep_cluster_name、wsrep_node_address、wsrep_node_name三个参数
4、初始化MySQL数据
[root@node1 ~]# mysqld --initialize --user=mysql
备注:确保初始化前/var/lib/mysql目录为空,初始化完成后会在此目录中生成各类文件
5、master1节点启动MySQL服务
[root@node1 ~]# systemctl start mysql@bootstrap.service
# 开机自启
[root@node1 ~]# systemctl enable mysql@bootstrap.service
# 查看服务状态
[root@node1 ~]# systemctl status mysql@bootstrap.service
# 查看mysqld进程
[root@node1 ~]# ps -ef |grep mysqld
5、master1节点授权root用户远程登录和创建PXC传输用户sstuser
# 查看初始化密码
[root@node1 ~]# grep "password" /var/log/mysqld.log
[root@node1 ~]# mysql -uroot -p
mysql> set password=password('Aa123456');
Query OK, 0 rows affected, 1 warning (0.34 sec)
mysql> create user 'root'@'172.16.80.%' identified by 'Aa123456';
Query OK, 0 rows affected (0.23 sec)
mysql> grant all on *.* to 'root'@'172.16.80.%';
Query OK, 0 rows affected (0.08 sec)
mysql> create user 'sstuser'@'localhost' identified by 's3cretPass';
Query OK, 0 rows affected (0.17 sec)
mysql> grant reload, lock tables, process, replication client on *.* to 'sstuser'@'localhost';
Query OK, 0 rows affected, 1 warning (0.07 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.11 sec)
备注:之后的MySQL版本将不支持grant授权的同时创建用户,而是需要先创建用户,再进行授权
6、master2和master3节点分别启动MySQL服务
# master2节点
[root@node2 ~]# systemctl start mysql.service
# 开机自启
[root@node2 ~]# systemctl enable mysql.service
# 查看服务状态
[root@node2 ~]# systemctl status mysql.service
# 查看mysqld进程
[root@node2 ~]# ps -ef |grep mysqld
# master3节点
[root@node3 ~]# systemctl start mysql.service
# 开机自启
[root@node3 ~]# systemctl enable mysql.service
# 查看服务状态
[root@node3 ~]# systemctl status mysql.service
# 查看mysqld进程
[root@node3 ~]# ps -ef |grep mysqld
7、查看PXC集群状态
mysql> show global status like 'wsrep_cluster%';
1)wsrep_local_state_uuid:与wsrep_cluster_state_uuid的值一致,且所有节点该值都相同
2)wsrep_cluster_state_uuid:所有节点该值都相同,如果有不同值的节点,说明该节点没有与集群建立连接
3)wsrep_last_committed:集群已经提交事务的数量,是一个累计值,所有节点该值都相同,如果出现不一致,说明事务有延迟,可以用来计算延
4)wsrep_replicated:从本节点复制出去的写集数量,wsrep_replicated_bytes为写集的总字节数,可以用于参考节点间的负载均衡是否平衡,该值较大的节点较为繁忙
5)wsrep_received:与wsrep_replicated对应,本节点接收来自其它节点的写集数量
6)wsrep_local_state:所有节点该值都应该为4,表示正常,节点状态有如下6个取值
1、取值1:节点启动并与集群建立连接
2、取值2:当节点成功执行状态传输请求时,该节点开始缓存写集
3、取值3:节点接收了SST全量数据传输,该节点现在拥有所有集群数据,并开始应用已缓存的写集
4、取值4:节点完成与集群数据的同步,它的从属队列现在是空的,并启用流控使其保持为空
5、取值5:节点接收了状态传输请求,该节点现在对donor不执行流控,该节点已缓存所有的写集但无法应用
6、取值6:节点完成对joiner节点的状态传输
7)wsrep_incoming_addresses:集群中所有节点的IP,且每个节点该值都相同
8)wsrep_cluster_size:集群中的节点数量,所有节点该值都相同
9)wsrep_cluster_conf_id:所有节点该值都相同,如果值不同,说明该节点被临时"分区"了
10)wsrep_cluster_status:集群组成的状态,所有节点该值都为"Primary",如果该值不为"Primary",说明该节点出现"分区"或"脑裂"现象
11)wsrep_connected:所有节点该值都为"ON",表示本节点已经与集群建立连接
12)wsrep_ready:所有节点该值都为"ON",表示本节点可以正常提供服务
四、测试PXC
1、master1节点创建测试数据
mysql> create database db;
Query OK, 1 row affected (0.50 sec)
mysql> create table db.tb(id int unsigned auto_increment primary key not null,name char(20) not null);
Query OK, 0 rows affected (0.41 sec)
mysql> insert into db.tb(name) values('zhangsan'),('lisi');
Query OK, 2 rows affected (0.40 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from db.tb;
+----+----------+
| id | name |
+----+----------+
| 2 | zhangsan |
| 5 | lisi |
+----+----------+
2 rows in set (0.07 sec)
2、master2和master3节点分别查看测试数据
[root@node2 ~]# mysql -uroot -pAa123456
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| db |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.01 sec)
mysql> select * from db.tb;
+----+----------+
| id | name |
+----+----------+
| 2 | zhangsan |
| 5 | lisi |
+----+----------+
2 rows in set (0.00 sec)
[root@node3 ~]# mysql -uroot -pAa123456
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| db |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.15 sec)
mysql> select * from db.tb;
+----+----------+
| id | name |
+----+----------+
| 2 | zhangsan |
| 5 | lisi |
+----+----------+
2 rows in set (0.17 sec)
3、master2节点创建测试数据
mysql> insert into db.tb(name) values('wangwu'),('zhaoliu');
Query OK, 2 rows affected (0.03 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from db.tb;
+----+----------+
| id | name |
+----+----------+
| 2 | zhangsan |
| 5 | lisi |
| 6 | wangwu |
| 9 | zhaoliu |
+----+----------+
4 rows in set (0.00 sec)
4、master1和master3节点分别查看测试数据
# master1节点
mysql> select * from db.tb;
+----+----------+
| id | name |
+----+----------+
| 2 | zhangsan |
| 5 | lisi |
| 6 | wangwu |
| 9 | zhaoliu |
+----+----------+
4 rows in set (0.18 sec)
# master3节点
mysql> select * from db.tb;
+----+----------+
| id | name |
+----+----------+
| 2 | zhangsan |
| 5 | lisi |
| 6 | wangwu |
| 9 | zhaoliu |
+----+----------+
4 rows in set (0.18 sec)
5、master3节点创建测试数据
mysql> insert into db.tb(name) values('jack'),('tom');
Query OK, 2 rows affected (2.67 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from db.tb;
+----+----------+
| id | name |
+----+----------+
| 2 | zhangsan |
| 5 | lisi |
| 6 | wangwu |
| 9 | zhaoliu |
| 16 | jack |
| 19 | tom |
+----+----------+
6 rows in set (0.08 sec)
6、master1和master2节点分别查看测试数据
# master1节点
mysql> select * from db.tb;
+----+----------+
| id | name |
+----+----------+
| 2 | zhangsan |
| 5 | lisi |
| 6 | wangwu |
| 9 | zhaoliu |
| 16 | jack |
| 19 | tom |
+----+----------+
6 rows in set (0.08 sec)
# master2节点
mysql> select * from db.tb;
+----+----------+
| id | name |
+----+----------+
| 2 | zhangsan |
| 5 | lisi |
| 6 | wangwu |
| 9 | zhaoliu |
| 16 | jack |
| 19 | tom |
+----+----------+
6 rows in set (0.08 sec)
五、模拟新节点加入PXC
# 将一个新节点加入PXC集群,需要SST全量数据传输,很有可能拖垮集群整体性能,可以考虑让新节点先成为PXC集群中某个节点(此处以master3节点为例)的从节点,然后在线快速通过IST方式加入集群。
1、演示环境
IP地址 |
操作系统 |
主机名 |
角色 |
数据库版本 |
安装方式 |
172.16.80.198 |
Centos 7.9 |
node1 |
master1 |
Percona-XtraDB-Cluster-57-5.7.39 |
yum |
172.16.80.199 |
Centos 7.9 |
node2 |
master2 |
Percona-XtraDB-Cluster-57-5.7.39 |
yum |
172.16.80.200 |
Centos 7.9 |
node3 |
master3 |
Percona-XtraDB-Cluster-57-5.7.39 |
yum |
172.16.80.201 |
Centos 7.9 |
node4 |
slave |
Percona-XtraDB-Cluster-57-5.7.39 |
yum |
2、关闭SELinux和firewalld
# 所有节点执行以下命令
[root@localhost ~]# sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl stop firelwalld
3、配置主机名
[root@localhost ~]# hostnamectl set-hostname node4
4、配置/etc/hosts文件
# slave节点
[root@node4 ~]# cat >>/etc/hosts <<EOF
172.16.80.198 node1
172.16.80.199 node2
172.16.80.200 node3
172.16.80.201 node4
EOF
# 其他节点
[root@node1 ~]# cat >>/etc/hosts <<EOF
172.16.80.201 node4
EOF
6、配置epel源
# slave节点
[root@node4 ~]# yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
7、安装清华大学mysql源
# slave节点
[root@node4 ~]# cat >/etc/yum.repos.d/mysql-community.repo <<EOF
[mysql-connectors-community]
name=MySQL Connectors Community
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql-connectors-community-el7-\$basearch/
enabled=1
gpgcheck=1
gpgkey=https://repo.mysql.com/RPM-GPG-KEY-mysql
[mysql-tools-community]
name=MySQL Tools Community
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql-tools-community-el7-\$basearch/
enabled=1
gpgcheck=1
gpgkey=https://repo.mysql.com/RPM-GPG-KEY-mysql
[mysql-5.7-community]
name=MySQL 5.7 Community Server
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql-5.7-community-el7-\$basearch/
enabled=1
gpgcheck=1
gpgkey=https://repo.mysql.com/RPM-GPG-KEY-mysql
EOF
8、slave节点安装PXC
[root@node4 ~]# yum -y install Percona-XtraDB-Cluster-57
9、slave节点修改mysqld.cnf配置文件
[root@node4 ~]# cat >/etc/percona-xtradb-cluster.conf.d/mysqld.cnf <<EOF
[mysqld]
server-id=4
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
log_bin=mysql-bin
log_bin_index=mysql-bin.index
log_slave_updates
expire_logs_days=7
symbolic-links=0
port=3306
lower_case_table_names=1
character_set_server=utf8mb4
collation_server=utf8mb4_general_ci
innodb_file_per_table=1
skip_name_resolve=1
slow_query_log=1
slow_query_log_file=slow.log
relay_log=relay-log
relay_log_index=relay-log.index
read_only=1
EOF
10、slave节点初始化MySQL数据
[root@node4 ~]# mysqld --initialize --user=mysql
11、slave节点启动MySQL服务
[root@node4 ~]# systemctl start mysql.service
[root@node4 ~]# systemctl enable mysql.service
[root@node4 ~]# systemctl status mysql.service
12、master3节点创建具有复制权限的用户backup
[root@node3 ~]# mysql -uroot -pAa123456
mysql> grant replication slave on *.* to 'backup'@'172.16.80.%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.04 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
13、master3节点使用mysqldump对所有数据库进行全量热备,并将导出的sql文件复制至slave节点
[root@node3 ~]# mysqldump -uroot -pAa123456 -E -F -R -q --single-transaction --master-data=2 -A > mysql_all.sql
# 拷贝备份SQL文件到node4
[root@node3 ~]# scp mysql_all.sql root@node4:/root
14、slave节点还原数据
[root@node4 ~]# mysql -uroot -p
mysql> source /root/mysql_all.sql;
15、slave节点使用具有复制权限的用户连接至master3
# master3节点获取Binlog File、Binlog Position
[root@node3 ~]# mysql -uroot -pAa123456
mysql> show master status;
# Slave节点
mysql> change master to master_host='172.16.80.200',master_user='backup',master_password='123456',master_port=3306,master_log_file='mysql-bin.000002',master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.03 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G
16、slave节点停止MySQL服务
[root@node4 ~]# systemctl stop mysql
17、slave节点注释/etc/percona-xtradb-cluster.conf.d/mysqld.cnf的[mysqld]配置段中read_only=1选项
[root@node4 ~]# sed -i '/read_only/s/^/#/' /etc/percona-xtradb-cluster.conf.d/mysqld.cnf
18、slave节点启用PXC的相关配置
cat >/etc/percona-xtradb-cluster.conf.d/wsrep.cnf <<EOF
[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
wsrep_provider_options="gcache.size=2G"
wsrep_cluster_address="gcomm://node1,node2,node3,node4"
binlog_format=ROW
default_storage_engine=InnoDB
wsrep_slave_threads=8
wsrep_log_conflicts
innodb_autoinc_lock_mode=2
wsrep_node_address=172.16.80.197
wsrep_cluster_name=pxc-cluster
wsrep_node_name=node4
pxc_strict_mode=ENFORCING
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth="sstuser:s3cretPass"
EOF
19、master3节点确认PXC需要同步的位置
[root@node3 ~]# mysqlbinlog /var/lib/mysql/mysql-bin.000001 |grep Xid
#220831 15:18:41 server id 1 end_log_pos 803 CRC32 0x90167b14 Xid = 9
#220831 15:22:57 server id 2 end_log_pos 1073 CRC32 0x058d5408 Xid = 10
#220831 15:25:14 server id 3 end_log_pos 1348 CRC32 0x82759fd9 Xid = 11
#220831 15:24:54 server id 2 end_log_pos 1605 CRC32 0x42ea6922 Xid = 12
#220831 15:24:56 server id 2 end_log_pos 1863 CRC32 0xcc63ffd9 Xid = 13
#220831 15:29:39 server id 3 end_log_pos 2132 CRC32 0x42855b0c Xid = 14
备注:master3节点在使用mysqldump对所有数据库进行全量热备时使用了"-F"选项,备份时会自动滚动二进制日志,所以此处命令中使用的二进制日志为mysql-bin.000001,Xid的值为最新的14
20、master3节点查看grastate.dat文件的内容,并将grastate.dat文件复制至slave节点的对应目录下
[root@node3 ~]# cat /var/lib/mysql/grastate.dat
# GALERA saved state
version: 2.1
uuid: 61d72bad-28fa-11ed-8028-eb0356c0c488
seqno: -1
safe_to_bootstrap: 0
备注:
1)uuid:集群中wsrep_cluster_state_uuid的值
2)seqno:集群中swrep_last_committed的值,根据此值可以直接判断下次节点启动时做增量传输的位置,目前master2节点处于正常运行的状态,所以值为-1
[root@node3 ~]# scp -p /var/lib/mysql/grastate.dat node4:/var/lib/mysql/
20、Slave节点设置同步开始位置
[root@node4 ~]# sed -i '/seqno/s/-1/14/' /var/lib/mysql/grastate.dat
[root@node4 ~]# cat /var/lib/mysql/grastate.dat
# GALERA saved state
version: 2.1
uuid: 61d72bad-28fa-11ed-8028-eb0356c0c488
seqno: 14
safe_to_bootstrap: 0
备注:修改seqno的值,将seqno: -1修改为刚才获取的position 2132对应Xid的值14,这就是PXC同步开始的位置
21、slave节点启动MySQL服务
[root@node4 ~]# systemctl start mysql.service
22、slave节点停止主从复制
[root@node4 ~]# mysql -uroot -pAa123456
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)
23、master1查看PXC集群状态
mysql> show global status like 'wsrep_cluster%';
+--------------------------+--------------------------------------+
| Variable_name | Value |
+--------------------------+--------------------------------------+
| wsrep_cluster_weight | 4 |
| wsrep_cluster_conf_id | 15 |
| wsrep_cluster_size | 4 |
| wsrep_cluster_state_uuid | 61d72bad-28fa-11ed-8028-eb0356c0c488 |
| wsrep_cluster_status | Primary |
+--------------------------+--------------------------------------+
5 rows in set (0.01 sec)
五、模拟PXC中某个节点故障并恢复
1、master3节点停止MySQL服务
[root@node3 ~]# systemctl stop mysql
2、查看PXC集群状态
mysql> show global status like 'wsrep%';
1)wsrep_incoming_addresses:目前集群中所有节点的IP(198、199、201),且每个节点该值都相同
2)wsrep_cluster_size:集群中的节点数量
3)所有节点该值都相同
3、master3节点修改wsrep.cnf配置文件
[root@node3 ~]# sed -i '/wsrep_cluster_address/s/node3/node3,node4/' /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
4、master1写入测试数据
mysql> insert into db.tb(name) values('xiaowang'),('xiaoming');
Query OK, 2 rows affected (0.72 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from db.tb;
+----+----------+
| id | name |
+----+----------+
| 2 | zhangsan |
| 5 | lisi |
| 6 | wangwu |
| 9 | zhaoliu |
| 16 | jack |
| 19 | tom |
| 22 | xiaowang |
| 25 | xiaoming |
+----+----------+
8 rows in set (0.12 sec)
5、master3节点启动MySQL服务
[root@node3 ~]# systemctl start mysql
6、master1查看PXC集群状态
mysql> show global status like 'wsrep%';
7、master3查看数据是否同步
[root@node3 ~]# mysql -uroot -pAa123456
mysql> select * from db.tb;
+----+----------+
| id | name |
+----+----------+
| 2 | zhangsan |
| 5 | lisi |
| 6 | wangwu |
| 9 | zhaoliu |
| 16 | jack |
| 19 | tom |
| 22 | xiaowang |
| 25 | xiaoming |
+----+----------+
8 rows in set (0.08 sec)
注:宕机时在其它可用节点中写入的数据,已复制给master3节点
原文链接:https://blog.51cto.com/qiuyue/2406117
若文章图片、下载链接等信息出错,请在评论区留言反馈,博主将第一时间更新!如本文“对您有用”,欢迎随意打赏,谢谢!
![weinxin](https://www.yangxingzhen.com/images/weixin.jpg)
![weinxin](https://www.yangxingzhen.com/images/weixingongzhonghao.png)
评论