PXC 遵循 CAP 定理中的 CP(一致性 + 分区容错性):
- 当网络分区发生时,系统必须在“可用性”和“一致性”之间选择。
- PXC 选择 一致性(Consistency),牺牲可用性(部分节点不可写)。
- 只有多数派(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 决定,它用于:
- 新节点加入时,连接到集群中的任意一个存活节点,获取集群视图。
- 节点重启后,重新加入集群。
这个配置不需要包含集群中所有节点的 IP,只需要包含至少一个当前存活的节点即可。
wsrep_cluster_status
正常节点:wsrep_cluster_status = Primary
孤立节点:wsrep_cluster_status = Non-Primary
若通过systemctl stop mysql 的方式停止,并不会导致其它节点进入Non-Primary
进入Non-Primary之后,只响应 Select ,其它:
-
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 -
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