在MySQL高可用架构中,Galera Cluster以其多主同步复制能力而备受青睐。然而,在某些场景下,运维人员并不希望集群中的所有节点都“积极干活”——例如用于离线备份、延迟同步、只读报表服务,或是作为故障转移的冷备节点。那么,如何让一个Galera节点“什么都不做”却又能保持集群完整性?本文综合社区实践与官方文档,梳理了当前最有效的方法。

为什么需要“无所事事”的节点?

Galera集群默认所有节点均可读写,但以下需求催生了“被动节点”的概念:

  • 备份与恢复:节点不参与写操作,避免数据变更影响备份一致性;
  • 延迟复制:用于容灾,如误删数据时可从延迟节点恢复;
  • 只读查询:将复杂查询、报表分析导向不处理写入的节点,减轻主节点压力;
  • 灰度升级:节点暂停服务以进行软件升级或配置调整,而不中断集群。

“什么都不做”不等于离线

值得注意的是,Galera节点即便无写入压力,仍需保持心跳、状态交换(IST/DONOR)等内部通信。彻底脱离集群(如停止wsrep)会导致节点被标记为不可用,无法快速恢复服务。因此,“无所事事”实质是限制节点业务写入能力,同时维持集群协议参与度

行业共识:最佳方案组合

经过对MySQL官方文档及社区多位DBA经验的梳理,当前最安全、最灵活的方案是“READ_ONLY + wsrep_sync_wait”组合拳,辅以可选参数调整。

1. 设置全局只读模式

SET GLOBAL read_only = 1;
SET GLOBAL super_read_only = 1;  -- 阻止super权限用户写入

此操作使节点拒绝任何用户发起的写事务,但系统表仍可更新。需注意:若节点被选为DONOR进行SST传输,数据会临时写入,但此时读写模式自动绕过限制。

2. 控制写集同步等待

通过调整wsrep_sync_wait参数(默认值为0),可让节点在特定操作时等待集群确认。社区专家推荐在目标节点上执行:

SET GLOBAL wsrep_sync_wait = 1;  -- 仅SELECT等待同步,不影响INSERT/UPDATE

结合read_only,该节点不会产生新写操作,且可确保查询结果与集群一致。

3. 可选:将节点标记为“desync”

Galera提供wsrep_provider_options中的desync选项,允许节点暂时退出写入集但不脱离集群。使用方式:

SET GLOBAL wsrep_provider_options="desync=ON";

缺点是需要先确保节点没有待处理写操作,且会影响后续加入时的增量同步效率。故建议仅用于短期维护。

专家视角:利弊权衡

MySQL架构师王磊在技术博客中指出:“最佳方式永远是按需组合。若只是临时禁止写入,read_only已然足够;若需长期作为备份节点,则应配合wsrep_sync_wait甚至考虑在配置文件中固化参数。”

他同时提醒:完全不参与集群事务的节点(如启动时wsrep_cluster_address=gcomm://留空)不可取,因为此类节点无法获取最新数据,也无法作为故障切换目标。

实践验证:如何测试?

在Galera Cluster 3.x版本中,可通过以下步骤验证:

  1. 在目标节点执行上述只读设置;
  2. 在其他节点写入数据,观察目标节点show global status like 'wsrep_%'中的wsrep_local_state_comment变更为Synced
  3. 尝试在目标节点执行INSERT操作,应报错ERROR 1290 (HY000): The MySQL server is running with the --read-only option
  4. 若需恢复写入,执行SET GLOBAL read_only=0即可。

未来趋势:动态节点角色

随着Galera 4.x及MySQL 8.0+的演进,社区正在讨论更细粒度的节点角色控制。例如通过wsrep_flow_control参数的智能限流,或引入node_role系统变量。目前,“只用不做”的最佳实践仍是上述组合,但建议运维人员持续关注官方发布说明。


总结:让Galera节点“无所事事”绝非断开连接,而是通过read_onlywsrep_sync_wait的配合,在保持集群健康度前提下剥离业务写入压力。每次调整前务必确认副本数据完整性,并预留恢复通道。高可用的真谛,在于每个节点都时刻准备——即使它暂时“什么都不做”。