Percona XtraDB Cluster 8.4.11-11 3 节点集群部署指南
PXC 8.4.11-11 三节点同步多主集群全流程实测:bootstrap 引导、SST 全量同步、IST 增量回归、多主写入与自增值协调、无主键限制、仲裁降级与全集群重启恢复。
Percona XtraDB Cluster 8.4.11-11 3 节点集群部署指南
目标:从零组建一套 Percona XtraDB Cluster(PXC)8.4.11-11 三节点同步多主集群,完整实测首个节点引导(bootstrap)、第二/三节点加入(SST 全量状态传输)、多主交叉写入、自增值协调、节点优雅停机后的 IST 增量回归、强杀节点后的仲裁降级与自动回归,以及全集群重启的引导恢复流程。全部命令于 2026-10-20 在三台 Ubuntu Server 22.04 实测通过;单机安装见《Ubuntu 22.04 安装 Percona XtraDB Cluster 8.4.11-11 指南》,状态变量与运维工具见《Percona XtraDB Cluster 8.4.11-11 常用 CLI 命令与工具详解》。
一、环境信息
| 项目 | 值 |
|---|---|
| 操作系统 | Ubuntu Server 22.04 LTS(jammy),x86_64,共 3 台 |
| 软件版本 | Percona XtraDB Cluster 8.4.11-11(Galera 4.27 / WSREP 26.1.4.3),XtraBackup 8.4.0-7 |
| 集群名 | pxc-cluster |
| 节点数 | 3(奇数,保证写入仲裁 quorum) |
| 实测日期 | 2026-10-20 |
| SST 方法 | xtrabackup-v2(默认) |
三台机器均已按《Ubuntu 22.04 安装 Percona XtraDB Cluster 8.4.11-11 指南》方案 A 完成安装,并显式安装了 percona-xtrabackup-84(SST 依赖)。
二、集群规划
2.1 节点信息
| 节点 | 主机名 | 内网地址 | server-id | wsrep_node_name |
|---|---|---|---|---|
| 节点一 | pxc1 | 10.89.62.11 | 1 | pxc1 |
| 节点二 | pxc2 | 10.89.62.12 | 2 | pxc2 |
| 节点三 | pxc3 | 10.89.62.13 | 3 | pxc3 |
2.2 端口清单
| 端口 | 用途 | 说明 |
|---|---|---|
| 3306 | MySQL 客户端连接 | 常驻监听 |
| 4567 | Galera 集群通信(gcomm) | 常驻监听,实测 ss -tlnp 可见 0.0.0.0:4567;节点间必须互通 |
| 4568 | IST 增量状态传输 | 由 ist.recv_addr 指定本机地址,仅在 IST 期间使用 |
| 4444 | SST 全量状态传输 | 仅 SST 期间监听,由 donor 经 socat 流式发送 |
| 9200 | clustercheck 健康检查 | 可选,见常用 CLI 文档 |
防火墙放行以上端口(节点间全通)。
2.3 三个关键机制(部署前须知)
- SST(全量状态传输):新节点加入时若本地无数据,由 donor 节点通过
xtrabackup-v2做物理全量备份并流式送达(4444 端口)。8.4 起 SST 账号全自动(donor 临时创建本地专用账号、随机密码、用完即删),无需也不能再配置wsrep_sst_auth(该变量已移除,写了会拒启)。 - IST(增量状态传输):节点短暂离线后回归,若其 seqno 仍在 donor 的 gcache(默认
galera.cache128MB)范围内,仅补传缺失的 writeset,秒级完成;超出范围则退化为 SST。 - 认证 TLS:首次启动时 datadir 会自动生成一套集群证书(
ca.pem/server-cert.pem/server-key.pem),gcomm 通道全程 TLS。三节点必须使用同一套证书,否则握手报certificate signature failure(实测踩坑,见 10.2)。
三、三个节点统一安装
按安装指南完成以下动作(三节点一致):
sudo apt-get update
sudo apt-get install -y percona-xtradb-cluster percona-xtrabackup-84
安装完成后先停掉安装期自动拉起的服务(Ubuntu 打包 enabled,postinst 自动启动并以空 gcomm:// 自举成了单节点集群,且生成了各自独立的证书——带着错误的集群状态与证书入网是实测踩过的坑):
sudo systemctl stop mysql
四、节点一(pxc1)配置与引导
4.1 写入集群配置
创建 /etc/mysql/mysql.conf.d/mysqld.cnf(覆盖包自带同名文件):
[mysqld]
server-id=1
datadir=/var/lib/mysql
log-error=/var/log/mysql/error.log
binlog_expire_logs_seconds=604800
# ---- Galera 集群核心 ----
wsrep_provider=/usr/lib/galera4/libgalera_smm.so
wsrep_cluster_address=gcomm://10.89.62.11,10.89.62.12,10.89.62.13
wsrep_cluster_name=pxc-cluster
wsrep_node_name=pxc1
wsrep_node_address=10.89.62.11
binlog_format=ROW
wsrep_slave_threads=8
wsrep_log_conflicts
innodb_autoinc_lock_mode=2
# ---- SST ----
wsrep_sst_method=xtrabackup-v2
# ---- 严格模式 ----
pxc_strict_mode=ENFORCING
innodb_buffer_pool_size=512M
要点:
wsrep_cluster_address列出全部节点(含自身);首个节点引导时不需改成空值,mysql@bootstrap单元通过--wsrep-new-cluster参数强制建立新主组件(见 4.3,实测/etc/default/mysql.bootstrap中EXTRA_ARGS=" --wsrep-new-cluster ")。wsrep_node_address显式指向本机内网 IP,避免 Galera 自行猜测地址。innodb_autoinc_lock_mode=2是多主并行写所必需(interleaved 模式)。pxc_strict_mode=ENFORCING会自动启用sql_require_primary_key,无主键表在该模式下被禁止(实测见 7.3)。
节点二/节点三使用同一模板,仅三处不同:server-id=2|3、wsrep_node_address=10.89.62.12|10.89.62.13、wsrep_node_name=pxc2|pxc3。
4.2 首次引导(bootstrap)
sudo systemctl start mysql@bootstrap
该单元读取 /etc/default/mysql.bootstrap 环境文件(内容 EXTRA_ARGS=" --wsrep-new-cluster "),并在启动前自动执行崩溃恢复计算起始位点(单元内 ExecStartPre 调用 /usr/bin/mysql-systemd galera-recovery)。
注意:如果 4.1 之前忘了停掉自启的 mysql.service,本步会因 3306/4567 端口被占而失败(实测现象)。先 systemctl stop mysql 再引导。
4.3 核验单节点主组件
mysql -uroot -p -e "SHOW GLOBAL STATUS LIKE 'wsrep_cluster%'; SHOW GLOBAL STATUS LIKE 'wsrep_local_state_comment';"
实测回显:
Variable_name Value
wsrep_cluster_conf_id 1
wsrep_cluster_size 1
wsrep_cluster_state_uuid df796f5f-cbe0-11f1-bd19-6f7c18a9d266
wsrep_cluster_status Primary
Variable_name Value
wsrep_local_state_comment Synced
同时确认 datadir 生成的证书三件套(后续要分发给其他节点):
ls /var/lib/mysql/ca.pem /var/lib/mysql/server-cert.pem /var/lib/mysql/server-key.pem
五、节点二(pxc2)加入集群(SST 全量同步)
5.1 写入配置
同 4.1 模板,差异三处:server-id=2、wsrep_node_address=10.89.62.12、wsrep_node_name=pxc2。wsrep_cluster_address 与集群名保持一致。
5.2 分发集群证书
把节点一 datadir 的证书三件套复制到节点二/三的 datadir 并保持属主与权限(三节点必须同一套证书):
# 在 pxc1 上执行(对 pxc2、pxc3 各做一次)
sudo systemctl stop mysql
sudo tar czf /tmp/pxc-cert.tgz -C /var/lib/mysql ca.pem server-cert.pem server-key.pem
sudo scp /tmp/pxc-cert.tgz pxc2:/tmp/
# 在 pxc2 上执行
sudo tar xzf /tmp/pxc-cert.tgz -C /var/lib/mysql/
sudo chown mysql:mysql /var/lib/mysql/ca.pem /var/lib/mysql/server-cert.pem /var/lib/mysql/server-key.pem
md5sum /var/lib/mysql/*.pem # 与 pxc1 的 md5sum 逐一核对一致
实测教训:证书分发若只复制了部分文件(如漏了 ca.pem),节点能启动但 TLS 握手失败,且表现为长时间停在 Joiner 状态(见 10.2 排障路径)。
5.3 启动并观察 SST
sudo systemctl start mysql
节点二此时为 Joiner:日志出现 Initiating SST/IST transfer on JOINER side,donor(pxc1)收到 Prepared SST request: xtrabackup-v2|10.89.62.12:4444/xtrabackup_sst//1 并通过 4444 端口流式发送物理备份。
实测成功关键日志(pxc2 /var/log/mysql/error.log):
[Note] [WSREP] Initiating SST/IST transfer on JOINER side (wsrep_sst_xtrabackup-v2 --role 'joiner' --address '10.89.62.12' --datadir '/var/lib/mysql/' ...)
[Note] [WSREP] Prepared SST request: xtrabackup-v2|10.89.62.12:4444/xtrabackup_sst//1
[Note] [WSREP-SST] Skipping mysql_upgrade (sst): local version (8.4.11) == donor version (8.4.11)
[Note] [Galera] Processing SST received
[Note] [Galera] SST received: df796f5f-cbe0-11f1-bd19-6f7c18a9d266:19
[Note] [Galera] IST received: df796f5f-cbe0-11f1-bd19-6f7c18a9d266:19
5.4 核验
mysql -uroot -p -e "SHOW GLOBAL STATUS LIKE 'wsrep_cluster_size'; SHOW GLOBAL STATUS LIKE 'wsrep_local_state_comment';"
# 实测:wsrep_cluster_size = 2,wsrep_local_state_comment = Synced
六、节点三(pxc3)加入集群
同节点二流程:写配置(差异三处 server-id=3、wsrep_node_address=10.89.62.13、wsrep_node_name=pxc3)→ 分发同一套证书 → sudo systemctl start mysql。
实测日志(pxc3):
[Note] [WSREP] Initiating SST/IST transfer on JOINER side (wsrep_sst_xtrabackup-v2 --role 'joiner' --address '10.89.62.13' ...)
[Note] [WSREP-SST] Skipping mysql_upgrade (sst): local version (8.4.11) == donor version (8.4.11)
[Note] [Galera] SST received: df796f5f-cbe0-11f1-bd19-6f7c18a9d266:20
[Note] [Galera] IST received: df796f5f-cbe0-11f1-bd19-6f7c18a9d266:20
三节点齐备后的集群总览(任一节点查询,实测):
mysql -uroot -p -e "SHOW GLOBAL STATUS LIKE 'wsrep_cluster%'; SHOW GLOBAL STATUS LIKE 'wsrep_local_state%';"
Variable_name Value
wsrep_cluster_conf_id 7
wsrep_cluster_size 3
wsrep_cluster_state_uuid df796f5f-cbe0-11f1-bd19-6f7c18a9d266
wsrep_cluster_status Primary
wsrep_local_state_uuid df796f5f-cbe0-11f1-bd19-6f7c18a9d266
wsrep_local_state 4
wsrep_local_state_comment Synced
七、多主写入验证
7.1 三节点交叉写入
准备测试库表(在 pxc1 执行):
CREATE DATABASE demo;
CREATE TABLE demo.t1 (
id INT NOT NULL AUTO_INCREMENT,
node VARCHAR(16) DEFAULT NULL,
ts TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE=InnoDB;
三个节点各自写一行(多主写实测):
mysql -uroot -p -e "INSERT INTO demo.t1(node) VALUES ('n1-final'); SELECT LAST_INSERT_ID();"
mysql -uroot -p -e "INSERT INTO demo.t1(node) VALUES ('n2-final'); SELECT LAST_INSERT_ID();"
mysql -uroot -p -e "INSERT INTO demo.t1(node) VALUES ('n3-final'); SELECT LAST_INSERT_ID();"
实测:pxc1 写入得到 LAST_INSERT_ID()=19,pxc2 得到 21,pxc3 得到 23;在 pxc1 上复查三行全部可见:
SELECT id,node FROM demo.t1 ORDER BY id DESC LIMIT 3;
id node
23 n3-final
21 n2-final
19 n1-final
7.2 自增值协调取证
Galera 自动协调各节点自增值(实测三个节点均为 auto_increment_increment=3,offset 自动错开):
# pxc1 实测
auto_increment_increment 3
auto_increment_offset 1
# pxc2 实测
auto_increment_increment 3
auto_increment_offset 3
# pxc3 实测
auto_increment_increment 3
auto_increment_offset 2
与 7.1 的写入结果对上:19=3×6+1(offset 1)、21=3×6+3(offset 3)、23=3×7+2(offset 2)——全局无冲突。该协调由 wsrep_auto_increment_control(默认 ON)自动完成,无需手工配置。
7.3 ENFORCING 模式下无主键表被拒
pxc_strict_mode=ENFORCING(默认)下建无主键表实测报错:
mysql> CREATE TABLE demo.nopk (a INT);
ERROR 3750 (HY000) at line 1: Unable to create or change a table without a primary key,
when the system variable 'sql_require_primary_key' is set. Add a primary key to the table
or unset this variable to avoid this message. Note that tables without a primary key can
cause performance problems in row-based replication, so please consult your DBA before
changing this setting.
设计表结构时必须带主键;确需临时绕过可将会话级 sql_require_primary_key 关闭,但集群 strict 模式的设计本意是保证所有表可被 Galera 认证复制。
八、节点维护:宕机与回归
8.1 优雅停机 + IST 增量回归
停 pxc2(sudo systemctl stop mysql),期间在 pxc1/pxc3 继续写入 3 条(实测集群保持 Primary,wsrep_cluster_size=2)。随后重启 pxc2:
sudo systemctl start mysql
实测日志(pxc2 回归过程):本地 seqno 落在 pxc1/pxc3 的 gcache 范围内,走 IST 而非 SST,3 个 writeset(seqno 26-28)增量补齐,秒级回到 Synced。donor 侧日志可见:
[Note] [WSREP] Initiating SST/IST transfer on DONOR side (wsrep_sst_xtrabackup-v2 --role 'donor' ... --gtid 'df796f5f-...:25' --bypass)
[Note] [Galera] IST sender sent EOF. Waiting for joiner to close the connection
--bypass 与 --gtid <uuid>:<seqno> 是 IST 的标志(对比 SST 无此参数)。
8.2 强杀节点后的降级仲裁
对 pxc3 执行强杀(模拟宕机):
sudo systemctl stop mysql # 或进程级强杀
实测剩余两节点视图:wsrep_cluster_size=2、wsrep_cluster_conf_id 递增、wsrep_cluster_status=Primary——期间 pxc1/pxc2 读写完全不受影响。3 节点集群可容忍 1 个节点故障(quorum = 2/3)。
8.3 故障节点回归
pxc3 重新 systemctl start mysql,IST 补齐离线期间的写入(实测 seqno 30-32 增量到达),wsrep_local_state_comment 回到 Synced,集群恢复 size=3。
九、全集群重启与引导恢复
全集群都停过之后,不能随便挑一台直接 start——需要选"数据最新"的节点引导,其余节点随后加入:
-
逐台检查
grastate.dat(datadir 下):sudo cat /var/lib/mysql/grastate.dat # 实测样例: # uuid: df796f5f-cbe0-11f1-bd19-6f7c18a9d266 # seqno: -1 # safe_to_bootstrap: 0seqno: -1表示上次非干净关闭、位点未知,由引导单元自动跑galera-recovery计算真实位点;safe_to_bootstrap: 1的节点可安全引导(通常为最后停止/数据最新的节点)。 -
在选定的引导节点上执行:
sudo systemctl start mysql@bootstrap -
其余节点依次
sudo systemctl start mysql(一个个来,确认 Synced 后再下一台)。 -
全部完成后
wsrep_cluster_size应回到 3。
十、常见问题
10.1 Joiner 长时间无进展,报 failed to reach primary view
日志出现 failed to reach primary view (pc.wait_prim_timeout)(默认 pc.wait_prim_timeout=PT30S)。按序排查:
- 网络连通性:4567 端口节点间 TCP 是否互通(
ss -tlnp确认监听,telnet/nc 跨节点探测); wsrep_cluster_name三节点是否完全一致;- 证书是否同一套(见 10.2,实测中它是"网络通但始终握不上手"的头号元凶);
- 集群侧是否处于无主组件状态(刚全停还没 bootstrap)。
10.2 证书不一致导致 gcomm TLS 握手失败
现象:节点日志反复 Initiating SST/IST transfer on JOINER side 但始终收不到数据, donor 侧亦无 Prepared SST request。排障路径(实测):
# 用 TLS 客户端直连对方 4567 验证握手
openssl s_client -connect 10.89.62.11:4567
# 实测不一致证书的报错:
# ... ssl handshake failure / certificate signature failure
确认三节点 md5sum /var/lib/mysql/{ca.pem,server-cert.pem,server-key.pem} 完全一致后重启各节点即可。永远从首个引导节点分发证书,绝不让后续节点自生成(自生成只发生在节点以空 gcomm:// 自举时——安装后立即改配置并停服可避免,见 3.4/三)。
10.3 配置 wsrep_sst_auth 后拒绝启动
8.4 已移除该变量:unknown variable 'wsrep_sst_auth=...'。直接删除配置行——SST 凭据已全自动。
10.4 SST 期间 4444/4568 端口连接被拒
4444(SST socat 流)与 4568(IST 接收)仅在传输期间活跃,非传输期不监听属正常。防火墙需预先放行,否则表现为 SST 卡在传输起点。
十一、参考链接
- Percona XtraDB Cluster 8.4 官方文档(部署章节):https://docs.percona.com/percona-xtradb-cluster/8.4/
- Galera Cluster 文档(SST/IST/quorum 机制):https://galeracluster.com/library/documentation/
- wsrep 系统变量参考:https://docs.percona.com/percona-xtradb-cluster/8.4/wsrep-system-index.html
- 本专栏安装篇:《Ubuntu 22.04 安装 Percona XtraDB Cluster 8.4.11-11 指南》
- 状态变量与运维工具实测:《Percona XtraDB Cluster 8.4.11-11 常用 CLI 命令与工具详解》
- 生态认知与选型对比:《Percona XtraDB Cluster 8.4.11-11 介绍与选型指南》
- 异构复制方案参照(MySQL 官方半同步/组复制对照):《MySQL 8.0 组复制(MGR)集群部署指南》