CentOS 7.9构建MySQL PXC高可用集群

小柒博客 MySQL评论1.1K14字数 19961阅读66分32秒阅读模式

一、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也是一种多主架构。

要搭建PXC架构至少需要3个MySQL实例来组成一个集群,3个实例之间不是主从模式,而是各自为主,所以三者是对等关系,不分从属,这就叫multi-master架构。客户端写入和读取数据时,连接哪个实例都是一样的,读取到的数据也都是相同的,写入任意一个实例之后,集群自身会将新写入的数据同步到其它实例上,这种架构不共享任何数据,是一种高冗余架构。

2、PXC原理

PXC最常使用如下4个端口号:

1)3306:数据库对外服务的端口号

2)4444:请求SST的端口号

3)4567:组成员之间进行沟通的端口号

4)4568:用于传输IST的端口号

备注:

SST:State Snapshot Transfer,全量数据传输

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

5、配置epel源

# 所有节点执行

[root@node1 ~]# yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm

6、安装清华大学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

5、配置epel源

# slave节点

[root@node4 ~]# yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm

6、安装清华大学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

7、slave节点安装PXC

[root@node4 ~]# yum -y install Percona-XtraDB-Cluster-57

8、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

9、slave节点初始化MySQL数据

[root@node4 ~]# mysqld --initialize --user=mysql

10、slave节点启动MySQL服务

[root@node4 ~]# systemctl start mysql.service

[root@node4 ~]# systemctl enable mysql.service

[root@node4 ~]# systemctl status mysql.service

11、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)

12、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

13、slave节点还原数据

[root@node4 ~]# mysql -uroot -p

mysql> source /root/mysql_all.sql;

14、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

CentOS 7.9构建MySQL PXC高可用集群

15、slave节点停止MySQL服务

[root@node4 ~]# systemctl stop mysql

16、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

17、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

18、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

19、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节点

若文章图片、下载链接等信息出错,请在评论区留言反馈,博主将第一时间更新!如本文“对您有用”,欢迎随意打赏,谢谢!

继续阅读
Wechat
微信扫一扫,加我!
weinxin
微信公众号
微信扫一扫,关注我!
weinxin
MySQL最后更新:2024-1-24
小柒博客
  • 本文由 小柒博客 发表于 2022年9月1日11:52:15
  • 声明:本站所有文章,如无特殊说明或标注,本站文章均为原创。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。转载请务必保留本文链接:https://www.yangxingzhen.com/8249.html
匿名

发表评论

匿名网友
:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

拖动滑块以完成验证