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

相关推荐
A小辣椒19 小时前
TShark:Wireshark CLI 功能
linux
A小辣椒1 天前
TShark:基础知识
linux
AlfredZhao1 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334662 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪2 天前
linux 拷贝文件或目录到指定的位置
linux
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush43 天前
嵌入式linux学习记录十四、术语
linux·嵌入式