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上查看

相关推荐
十月南城2 小时前
压测方法论——目标、场景、指标与容量评估的闭环
运维·web安全·ci/cd·微服务·云计算
txinyu的博客2 小时前
std::function
服务器·开发语言·c++
吃花椒的冰冰2 小时前
ubuntu自动检测断网重联
运维·服务器
刘哥测评技术zcwz6262 小时前
希音shein自养号测评怎么做,有哪些技术要求
运维·服务器·网络
a程序小傲2 小时前
国家电网面试被问:FactoryBean与BeanFactory的区别和动态代理生成
java·linux·服务器·spring boot·spring·面试·职场和发展
txinyu的博客3 小时前
static_cast、const_cast、dynamic_cast、reinterpret_cast
linux·c++
“αβ”3 小时前
TCP相关实验
运维·服务器·网络·c++·网络协议·tcp/ip·udp
qq_254674413 小时前
Cisco Nexus 9504交换机上
java·linux·服务器
etp_3 小时前
连击非第一击无伤害
运维·nginx