PXC(Percona XtraDB Cluster)集群安装记录

PXC 遵循 CAP 定理中的 CP(一致性 + 分区容错性):

  1. 当网络分区发生时,系统必须在“可用性”和“一致性”之间选择。
  2. PXC 选择 一致性(Consistency),牺牲可用性(部分节点不可写)。
  3. 只有多数派(majority)节点组成的子集群才能继续读写,确保数据一致。

    ✅ 举例:3 节点集群,1 个节点孤立 → 2 节点多数派继续服务,1 节点只读或拒绝写入。

环境

Centos 7

关闭 SELinux 和 防火墙 firewalld

网络配置:

开放必要的端口:

3306:MySQL 客户端连接
4567:Galera Cluster 通信
4568:IST (Incremental State Transfer) 流量
4444:SST 流量(如使用 xtrabackup-v2)

确保新节点能通过主机名或 IP 与集群内所有节点双向通信。

配置my.cnf

[mysqld]
# 基础配置
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock

# PXC 配置
wsrep_provider = /usr/lib64/galera4/libgalera_smm.so  # 根据实际路径调整
# 已有集群节点 IP
wsrep_cluster_address = "gcomm://node1_ip,node2_ip,node3_ip"  

wsrep_node_address = 192.168.1.8 # 新节点的IP地址
wsrep_node_name = node4  # 建议设置唯一节点名

# SST 配置
wsrep_sst_method = xtrabackup-v2
wsrep_sst_auth = sstuser:s3cretPassw0rd  # SST 认证用户和密码

# 其他推荐配置
binlog_format = ROW
default_storage_engine = InnoDB
innodb_autoinc_lock_mode = 2

SST 验证用户

CREATE USER 'sstuser'@'%' IDENTIFIED BY 's3cretPassw0rd';
GRANT RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'sstuser'@'%';
FLUSH PRIVILEGES;

启动

systemctl start mysql

检查状态

-- 查看集群大小
SHOW STATUS LIKE 'wsrep_cluster_size';

-- 查看节点状态
SHOW STATUS LIKE 'wsrep_connected';
SHOW STATUS LIKE 'wsrep_ready';
SHOW STATUS LIKE 'wsrep_local_state_comment';

-- 正常状态应为:
-- wsrep_cluster_size >= 2
-- wsrep_connected: ON
-- wsrep_ready: ON
-- wsrep_local_state_comment: Synced

修改hots

在 /etc/hosts 中配置所有节点的 IP 和主机名映射,避免 DNS 解析问题

配置项解析

wsrep_cluster_address

wsrep_cluster_address 定义了节点启动时尝试连接的集群地址列表(即“种子节点”)。
集群成员信息是动态维护的,不由 wsrep_cluster_address 决定,它用于:

  1. 新节点加入时,连接到集群中的任意一个存活节点,获取集群视图。
  2. 节点重启后,重新加入集群。

这个配置不需要包含集群中所有节点的 IP,只需要包含至少一个当前存活的节点即可。

wsrep_cluster_status

正常节点:wsrep_cluster_status = Primary
孤立节点:wsrep_cluster_status = Non-Primary

若通过systemctl stop mysql 的方式停止,并不会导致其它节点进入Non-Primary
进入Non-Primary之后,只响应 Select ,其它:

  1. INSERT/UPDATE/DELETE 写入 ❌ 拒绝,报错:
    Error 1064: WSREP has not yet prepared node for application use

    Error 1047: WSREP has not yet prepared node for application use

  2. DDL 操作 ❌ 拒绝

注意

通过 systemctl stop mysql 正常关闭另外两个节点,而不是突然断电或网络隔离,那么集群会进行“干净的视图变更”,剩下的节点可能被确认为新的 Primary 组件。

查看状态

SHOW STATUS LIKE 'wsrep_ready'; -- 应为 ON
SHOW STATUS LIKE 'wsrep_connected'; -- 应为 ON
SHOW STATUS LIKE 'wsrep_local_state_comment'; -- 应为 'Synced'

参考文档

https://docs.percona.com/percona-xtradb-cluster/8.0/yum.html#prerequisites