Linux-Percona XtraDB Cluster (PXC)集群部署实战

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(推荐)、mysqldumprsync
  • 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上查看

相关推荐
承渊政道9 小时前
Linux系统学习【Linux基础开发工具】
linux·运维·笔记·学习·centos·编辑器
艾莉丝努力练剑9 小时前
【Linux:文件】基础IO
linux·运维·c语言·c++·人工智能·io·文件
_OP_CHEN9 小时前
【Linux系统编程】(二十七)手撕动静态库原理与实战:从底层逻辑到代码落地
linux·操作系统·动态库·静态库·c/c++·库的原理与制作
南烟斋..9 小时前
Linux设备驱动开发完全指南:从启动流程到Platform驱动模型
linux·驱动开发·uboot
脏脏a10 小时前
告别物理出勤:Nginx 搭配 cpolar 实现远程开发无缝协作
运维·nginx
小草cys11 小时前
在 openEuler 上安装 DDE 图形桌面环境(适用于华为鲲鹏服务器/PC)
运维·服务器
天才奇男子18 小时前
HAProxy高级功能全解析
linux·运维·服务器·微服务·云原生
小李独爱秋18 小时前
“bootmgr is compressed”错误:根源、笔记本与台式机差异化解决方案深度指南
运维·stm32·单片机·嵌入式硬件·文件系统·电脑故障
学嵌入式的小杨同学18 小时前
【Linux 封神之路】信号编程全解析:从信号基础到 MP3 播放器实战(含核心 API 与避坑指南)
java·linux·c语言·开发语言·vscode·vim·ux
酥暮沐19 小时前
iscsi部署网络存储
linux·网络·存储·iscsi