PXC 是一套 MySQL 高可用集群解决方案,与传统的基于主从复制模式的集群架构相比 PXC 最突出特点就是解决了诟病已久的数据复制延迟问题,基本上可以达到实时同步。而且节点与节点之间,他们相互的关系是对等的。PXC 最关注的是数据的一致性,对待事物的行为时,要么在所有节点上执行,要么都不执行,它的实现机制决定了它对待一致性的行为非常严格,这也能非常完美的保证 MySQL 集群的数据一致性
官方安装文档如下:Install Percona XtraDB Cluster on Red Hat Enterprise Linux and CentOS - Percona XtraDB Cluster
PXC 常用端口
参考官方文档,请保证下面端口被放行
Percona XtraDB Cluster requires the specific ports for communication. Make sure that the following ports are available:
3306
4444
4567
4568
本次实验所用的系统为Rocky Linux 8.10,三台,IP地址分别为192.168.40.{129,130,131}其中130为主引导节点,pxc内置有数据库
安装pxc
RHEL 8 and other EL8 systems enable the MySQL module by default. This module hides the Percona-provided packages and the module must be disabled to make these packages visible. The following command disables the module:
sudo yum module disable mysql
接下来按顺序执行以下命令:
sudo yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
sudo percona-release setup pxc-80
sudo yum install percona-xtradb-cluster
也可以采用在线安装
[root@localhost ~]# rpm -qa | grep percona
percona-telemetry-agent-1.0.3-3.el8.x86_64
percona-xtradb-cluster-server-8.0.40-31.1.el8.x86_64
percona-release-1.0-29.noarch
percona-xtradb-cluster-client-8.0.40-31.1.el8.x86_64
percona-xtradb-cluster-icu-data-files-8.0.40-31.1.el8.x86_64
percona-xtradb-cluster-shared-8.0.40-31.1.el8.x86_64
percona-xtradb-cluster-8.0.40-31.1.el8.x86_64
修改root用户密码和创建用于远程登录测试的用户:
启动一下pxc:systemctl start mysqld
tmp_pwd=$(awk '/temporary password/ {print $NF}'
mysql -uroot -p$tmp_pwd
登录之后修改root用户密码:alter user root@localhost identified with mysql_native_password by '@OPENlab123';
创建新用户:create user 'test'@'%' identified with mysql_native_password by '@OPENlab123';
赋予权限:grant all privileges on *.* to 'test'@'%' ;
以上操作在所有节点都需要执行一遍
然后停掉pxc,systemctl stop mysqld
配置
打开/etc/my.cnf里面提供了模板和一些默认的参数,绝大部分不需要改动它:
# Template my.cnf for PXC
# Edit to your requirements.
[client]
socket=/var/lib/mysql/mysql.sock
user=root
password=@OPENlab123
[mysqld]
server-id=30
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
# Binary log expiration period is 604800 seconds, which equals 7 days
binlog_expire_logs_seconds=604800
######## wsrep ###############
# Path to Galera library
wsrep_provider=/usr/lib64/galera4/libgalera_smm.so
# Cluster connection URL contains IPs of nodes
#If no IP is found, this implies that a new cluster needs to be created,
#in order to do that you need to bootstrap this node
wsrep_cluster_address=gcomm://192.168.40.130,192.168.40.129,192.168.40.131
# In order for Galera to work correctly binlog format should be ROW
binlog_format=ROW
# Slave thread to use
wsrep_slave_threads=8
wsrep_log_conflicts
# This changes how InnoDB autoincrement locks are managed and is a requirement for Galera
innodb_autoinc_lock_mode=2
# Node IP address
wsrep_node_address=192.168.40.130
# Cluster name
wsrep_cluster_name=pxc-cluster
#If wsrep_node_name is not specified, then system hostname will be used
wsrep_node_name=pxc130
#pxc_strict_mode allowed values: DISABLED,PERMISSIVE,ENFORCING,MASTER
pxc_strict_mode=ENFORCING
# SST method
wsrep_sst_method=xtrabackup-v2
我在这个配置文件中做出了以下修改:
1.在client中添加了这两行,懒得每次登录MySQL输入密码
user=root
password=@OPENlab123
2.集群的所有IP地址
wsrep_cluster_address=gcomm://192.168.40.130,192.168.40.129,192.168.40.131
3.当前节点的IP地址
wsrep_node_address=192.168.40.130
4.集群名称
wsrep_cluster_name=pxc-cluster
5.当前节点名称
wsrep_node_name=pxc130
6.服务id(这里不能相同和其他节点),这里取IP主机号
server-id=30
启动pxc
In Percona XtraDB Cluster 8.0, the Encrypting Replication Traffic is enabled by default (via the variable).pxc-encrypt-cluster-traffic
The replication traffic encryption cannot be enabled on a running cluster. If it was disabled before the cluster was bootstrapped, the cluster must to stopped. Then set up the encryption, and bootstrap (see Bootstrapping the First Node) again.
上面十分重要,由于默认开启了 Encrypting Replication Traffic,意味着所有集群流量都使用证书进行保护,所以要求所有节点使用相同的密钥和证书文件,systemctl start mysql启动初始话过程中生成默认密钥和证书文件,并将其放在datadir数据目录下,这就造成故障节点和其他节点密钥和证书文件不一致,因此需要将故障节点的*.pem全部删除,并将某一个正常节点数据目录下的 *.pem文件全部复制到故障节点。
所以这里以130,为启动节点,删除其他节点/var/lib/mysql/文件里面以.pem结尾的所有文件,将130这个里的.pem结尾的所有文件拷贝进这个文件
#各个节点
rm -rf /var/lib/mysql/*.pem
#启动节点
for i in {129,131} ; do scp /var/lib/mysql/*.pem root@192.168.40.$i:/var/lib/mysql/; done
现在拷贝之后这几个文件的权限都是属于root用户的,我们需要修改权限:
chown mysql:mysql /var/lib/mysql*.pem
以上准备工作就做好了,现在可以启动mysql了
注意启动规则,第一个必须为130这个节点,而且启动命令一定为
systemctl start mysql@bootstrap.service
其他节点正常启动即可:systemctl start mysqld
然后可以登入pxc,然后可以使用以下命令验证结果
查询集群信息:
show status like 'wsrep%';
集群下线:
要保证最先启动的节点,应该也是最后关闭的
systemctl stop mysql@bootstrap.service
其他节点systemctl stop mysqld
如果不是这样的话,那么第二如果还按照之前顺序启动,则无法正常启动
需要在集群中的每个节点上,检查grastate.dat文件中的seqno值。这个文件通常位于/var/lib/mysql/grastate.dat
seqno最大的值就是最后关闭服务的节点,这个节点的
[root@pxc131 ~]# cat /var/lib/mysql/grastate.dat
GALERA saved state
version: 2.1
uuid: 4b8f5003-e795-11ef-a7f1-eb470a5b3c18
seqno: 10
safe_to_bootstrap: 1
这里就是131是最后关闭的,这里的seqno就是最大的,并且safe_to_bootstrap为1
其他节点的都为0
这表明程序建议我们从这个节点作为启动节点启动,在此节点上面使用systemctl start mysql@bootstrap.service,其他节点正常启动即可