Percona XtraDB Cluster 8.4.11-11 3 节点集群部署指南

PXC 8.4.11-11 三节点同步多主集群全流程实测:bootstrap 引导、SST 全量同步、IST 增量回归、多主写入与自增值协调、无主键限制、仲裁降级与全集群重启恢复。

Percona XtraDB ClusterPercona XtraDB ClusterMySQL数据库高可用集群2026/10/20

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-idwsrep_node_name
节点一pxc110.89.62.111pxc1
节点二pxc210.89.62.122pxc2
节点三pxc310.89.62.133pxc3

2.2 端口清单

端口用途说明
3306MySQL 客户端连接常驻监听
4567Galera 集群通信(gcomm)常驻监听,实测 ss -tlnp 可见 0.0.0.0:4567;节点间必须互通
4568IST 增量状态传输由 ist.recv_addr 指定本机地址,仅在 IST 期间使用
4444SST 全量状态传输仅 SST 期间监听,由 donor 经 socat 流式发送
9200clustercheck 健康检查可选,见常用 CLI 文档

防火墙放行以上端口(节点间全通)。

2.3 三个关键机制(部署前须知)

  1. SST(全量状态传输):新节点加入时若本地无数据,由 donor 节点通过 xtrabackup-v2 做物理全量备份并流式送达(4444 端口)。8.4 起 SST 账号全自动(donor 临时创建本地专用账号、随机密码、用完即删),无需也不能再配置 wsrep_sst_auth(该变量已移除,写了会拒启)。
  2. IST(增量状态传输):节点短暂离线后回归,若其 seqno 仍在 donor 的 gcache(默认 galera.cache 128MB)范围内,仅补传缺失的 writeset,秒级完成;超出范围则退化为 SST。
  3. 认证 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——需要选"数据最新"的节点引导,其余节点随后加入:

  1. 逐台检查 grastate.dat(datadir 下):

    sudo cat /var/lib/mysql/grastate.dat
    # 实测样例:
    # uuid:    df796f5f-cbe0-11f1-bd19-6f7c18a9d266
    # seqno:   -1
    # safe_to_bootstrap: 0
    

    seqno: -1 表示上次非干净关闭、位点未知,由引导单元自动跑 galera-recovery 计算真实位点;safe_to_bootstrap: 1 的节点可安全引导(通常为最后停止/数据最新的节点)。

  2. 在选定的引导节点上执行:

    sudo systemctl start mysql@bootstrap
    
  3. 其余节点依次 sudo systemctl start mysql(一个个来,确认 Synced 后再下一台)。

  4. 全部完成后 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)。按序排查:

  1. 网络连通性:4567 端口节点间 TCP 是否互通(ss -tlnp 确认监听,telnet/nc 跨节点探测);
  2. wsrep_cluster_name 三节点是否完全一致;
  3. 证书是否同一套(见 10.2,实测中它是"网络通但始终握不上手"的头号元凶);
  4. 集群侧是否处于无主组件状态(刚全停还没 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 卡在传输起点。

十一、参考链接

  1. Percona XtraDB Cluster 8.4 官方文档(部署章节):https://docs.percona.com/percona-xtradb-cluster/8.4/
  2. Galera Cluster 文档(SST/IST/quorum 机制):https://galeracluster.com/library/documentation/
  3. wsrep 系统变量参考:https://docs.percona.com/percona-xtradb-cluster/8.4/wsrep-system-index.html
  4. 本专栏安装篇:《Ubuntu 22.04 安装 Percona XtraDB Cluster 8.4.11-11 指南》
  5. 状态变量与运维工具实测:《Percona XtraDB Cluster 8.4.11-11 常用 CLI 命令与工具详解》
  6. 生态认知与选型对比:《Percona XtraDB Cluster 8.4.11-11 介绍与选型指南》
  7. 异构复制方案参照(MySQL 官方半同步/组复制对照):《MySQL 8.0 组复制(MGR)集群部署指南》