1.什么是 PXC?(三个MySQL主机都可读写且同步)
Percona XtraDB Cluster 是 MySQL 的高可用性、高扩展性的开源解决方案。它将 Percona Server 与 Percona XtraBackup 和 Galera Library 集成,形成了一个多主、同步复制的 MySQL 集群。
特点:
三个节点(或更多)组成一个集群,每个节点都是可读写的,并且数据是同步复制的,即任何一个节点上的写操作都会同步到其他所有节点。
2.核心特效与优势
- 同步复制:数据在所有节点间实时同步提交,保证数据的强一致性。
- 多主架构 :可以在任何一个节点上进行读写操作,非常适合需要高写入扩展性的场景。
- 高可用性:单个或多个节点故障不会导致服务中断,剩余节点会自动组成新的集群。
- 真正的并行复制:基于行(ROW)的复制,在从节点应用时没有延迟。
- 自动节点配置:新节点可以自动从现有节点同步数据(SST),并加入集群。
- 严格一致性:所有节点在任何时刻都有完全相同的数据。
- 支持 InnoDB 存储引擎:提供完整的事务支持(ACID)。
3.关键概念与组件
- WSREP API:MySQL 与 Galera 库之间的接口,负责处理复制和集群通信。
- Galera Library:提供集群状态传输(SST/IST)和认证功能的底层核心库。
- Certification-Based Replication:一种避免复制冲突的机制。事务在本地执行,但在提交前会广播到所有节点进行"认证"(冲突检查)。只有通过所有节点认证的事务才会被提交。
- SST (State Snapshot Transfer) :全量同步 。当新节点加入集群或某个节点远远落后时,从一个 donor 节点获取完整的数据快照。常用工具是
xtrabackup(推荐)、mysqldump或rsync。
- IST (Incremental State Transfer) :增量同步 。当某个节点短暂离线后重新加入,并且所需的增量写集(write-sets)还在 donor 节点的
gcache.size中时,只传输缺失的数据,效率极高。
4.集群最小要求与建议
- 最小节点数 :3 个。这是为了避免脑裂(Split-Brain)。当网络分区时,拥有多数节点(至少 2个)的分区可以继续运行,少数分区(1个)会自动将自己设置为只读或关闭,以保证数据一致性。
- 硬件:建议所有节点硬件配置一致。
- 网络:低延迟、高带宽的网络至关重要,因为所有节点间需要持续同步数据。
5.环境准备
5.1集群规划
|-----------|-----------------|---------------------------|---------|
| 节点 | IP | 安装软件 | 操作系统 |
| pxc-node1 | 192.168.189.139 | Percona-XtraDB-Cluster-80 | Centos9 |
| pxc-node2 | 192.168.189.142 | Percona-XtraDB-Cluster-80 | Centos9 |
| pxc-node3 | 192.168.189.143 | Percona-XtraDB-Cluster-80 | Centos9 |
[集群规划]
5.2DNS本地配置主机名-/etc/hosts
|-----------|-----------------|
| 域名 | IP |
| pxc-node1 | 192.168.189.139 |
| pxc-node2 | 192.168.189.142 |
| pxc-node3 | 192.168.189.143 |
[本地DNS-/etc/hosts配置]
下图IP显示错误以上表为主

5.3关闭防火墙和 SELinux
systemctl disable --now firewalld
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
5.4安装集群软件包(所有节点)-wegt方式
官网:Software Downloads - Percona

5.4.1pxc-node1(在主机1上安装Percona XtraDB)
安装Percona XtraDB
禁用系统原有MySQL
dnf -y remove mysql
配置percon源
dnf -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
percona-release setup pxc-80
percona-release 配置、启用、禁用 Percona 软件仓库
setup pxc-80 设置 Percona XtraDB Cluster 8.0 的仓库
查看包
ll -h Percona-XtraDB-Cluster-8.0.44-r7284a5c-el9-x86_64-bundle.tar
创建目录(用来存放解压文件)
mkdir /root/per
解压包
tar -xvf Percona-XtraDB-Cluster-8.0.44-r7284a5c-el9-x86_64-bundle.tar -C per
关闭MySQL8.0源,防止软件包冲突
dnf config-manager --set-disabled mysql80-community
cd /root/per && dnf -y install percona-xtradb-cluster*
修改MySQL密码
systemctl start mysql
grep 'password' /var/log/mysqld.log
mysql -uroot -p"?<fZrkYGm0dQ" -使用初始密码登录
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Root@123'; -修改密码
mysql> FLUSH PRIVILEGES; -刷新
停止MySQL服务(重要!!)
systemctl stop mysql
5.4.2pxc-node2(在主机2上安装Percona XtraDB)
操作同上
5.4.3pxc-node3(在主机3上安装Percona XtraDB)
操作同上
6.配置集群
注意:必须保证所有节点mysql服务已停止
6.1pxc-node1创建集群
6.1.1配置mysql配置文件-/etc/my.cnf
vim /etc/my.cnf
wsrep_cluster_address=gcomm:// 所有节点IP/域名
wsrep_node_address=192.168.91.200 /域名 -当前节点的地址
wsrep_cluster_name=pxc-cluster -集群名,必须所有节点一致
wsrep_node_name=pxc-node1 -节点名,每个节点不一致
wsrep_cluster_address=gcomm://192.168.91.200,192.168.91.201,192.168.91.134 # 所有节点
wsrep_node_address=192.168.91.200 # 当前节点的地址
wsrep_cluster_name=pxc-cluster # 集群名,必须所有节点一致
wsrep_node_name=pxc-node1 # 节点名(逻辑名,可以和主机名不一样),每个节点不一致
pxc_strict_mode=ENFORCING # 确保最高级别的一致性(锁表、修改表、set global、DDL 均禁止操作)
#pxc_strict_mode=PERMISSIVE # 降低级别之后则允许
wsrep_sst_method=xtrabackup-v2 # 节点间验证方式
wsrep_provider_options="socket.ssl_key=server-key.pem;socket.ssl_cert=server-cert.pem;socket.ssl_ca=ca.pem"
[sst]
encrypt=4
ssl-ca=ca.pem # CA证书
ssl-key=server-key.pem # server私钥
ssl-cert=server-cert.pem # server证书

6.1.2生成证书
6.1.2.1生成CA密钥和证书
生成CA密钥文件
openssl genrsa 2048 > ca-key.pem
生成CA证书文件【自签名证书】
openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca.pem
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:BJ
Locality Name (eg, city) [Default City]:BJ
Organization Name (eg, company) [Default Company Ltd]:ca
Organizational Unit Name (eg, section) []:ca
Common Name (eg, your name or your server's hostname) []:ca
Email Address []:ca@126.com
6.1.2.2生成服务器密钥和证书
生成服务器密钥
openssl req -newkey rsa:2048 -days 3600 -nodes -keyout server-key.pem -out server-req.pem
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:BJ
Locality Name (eg, city) [Default City]:BJ
Organization Name (eg, company) [Default Company Ltd]:tianyun
Organizational Unit Name (eg, section) []:db
Common Name (eg, your name or your server's hostname) []:pxc-server
Email Address []:yangge@126.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:1234
An optional company name []:1234
移除保护密钥的密码
openssl rsa -in server-key.pem -out server-key.pem
创建服务器的证书
openssl x509 -req -in server-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
ll

将ca.pem,server-cert.pem,server-key.pem复制到/var/lib/mysql下(MySQL默认数据目录)
cp -rf ca.pem server-cert.pem server-key.pem /var/lib/mysql
启动第一个节点
systemctl start mysql@bootstrap.service
登录MySQL
mysql -uroot -p'Root@123'
查看集群状态
show status like 'wsrep%';
SHOW STATUS LIKE 'wsrep_cluster_size';
SHOW STATUS LIKE 'wsrep_incoming_addresses';


将ca证书、服务器的证书及私钥复制到其它节点(/var/lib/mysql为MySQL数据目录)
scp ca.pem server-cert.pem server-key.pem pxc-node2:/var/lib/mysql
scp ca.pem server-cert.pem server-key.pem pxc-node3:/var/lib/mysql
将配置文件模板复制到其它节点(/etc/my.cnf为MySQL的配置文件)
scp /etc/my.cnf pxc-node2:/etc/my.cnf
scp /etc/my.cnf pxc-node3:/etc/my.cnf
6.2pxc-node2加入集群
6.2.1查看是否接收到文件
cd /var/lib/mysql
ls -l ca.pem server-cert.pem server-key.pem

6.2.2配置/etc/my.cnf(MySQL配置文件)
vim /etc/my.cnf

6.2.3启动MySQL
systemctl start mysqld
mysql -uroot -p'Root@123'
验证效果
show status like 'wsrep%';

6.3pxc-node3加入集群(与pxc-node2相同)
6.3.1查看是否接收到文件
cd /var/lib/mysql
ls -l ca.pem server-cert.pem server-key.pem

6.3.2配置/etc/my.cnf(MySQL配置文件)
vim /etc/my.cnf

6.3.3启动MySQL
systemctl start mysqld
mysql -uroot -p'Root@123'
验证效果
show status like 'wsrep%';

7.验证复制
7.1使用pxc-node1创建数据库
CREATE DATABASE db1;
在pxc-node2与pxc-node3上查看


7.2使用pxc-node2创建表
CREATE TABLE user1(id INT,name VARCHAR(20));
在pxc-node1与pxc-node3上查看


7.3使用pxc-node3插入数据(默认只能在有主键的表中插入数据)
INSERT INTO db1.user1 VALUES(1,'jack');
在pxc-node1与pxc-node2上查看


