目录
Galera Cluster 概述
核心架构与组件
WSREP API
Group Communication System (GCP)
同步复制机制
复制流程详解
冲突检测算法
关键特性
多主架构实现
强一致性保障
自动成员管理
性能优化策略
并行复制实现
流控机制详解
批处理与压缩
部署与监控
详细配置指南
监控指标体系
维护命令示例
常见问题与解决方案
脑裂处理方案
SST故障处理
性能调优建议
总结与建议
Galera Cluster 概述
Galera Cluster 是一个基于同步复制的多主数据库集群解决方案,主要支持 MySQL/MariaDB。它采用先进的认证复制(Certification-Based Replication)机制,确保所有节点数据保持强一致性。其核心特点是:
- 真正的多主架构:所有节点均可读写,无需主从切换
- 同步复制:数据变更实时同步到所有节点
- 自动故障转移:节点故障时自动处理,确保高可用性
- 透明集成:对应用表现为单一数据库实例
典型应用场景包括:
- 金融交易系统:需要强一致性的关键业务
- 电商平台:高并发读写需求
- 实时分析系统:需要最新数据的分析应用
核心架构与组件
WSREP API
WSREP(Write Set Replication)API 是 Galera 的核心接口层,提供以下功能:
-
事务写集管理:
- 捕获事务中的行变更(DML操作)
- 生成包含主键信息的写集(Write Set)
- 示例:UPDATE customers SET balance=100 WHERE id=5 将生成包含id=5记录的变更集
-
冲突检测机制:
- 基于主键的认证测试(Certification Test)
- 使用全局事务ID(GTID)进行版本控制
- 冲突解决策略:先提交者获胜(First-Commit-Wins)
-
节点状态管理:
- 维护节点状态机(Joining, Donor, Synced等)
- 处理节点加入/离开事件
- 协调数据同步过程
Group Communication System (GCP)
GCP 负责集群的底层通信,主要功能包括:
-
成员管理:
- 心跳检测(默认每1秒)
- 故障检测(可配置超时时间)
- 视图变更通知
-
消息传递:
- 使用gcomm协议或外部工具(如Corosync)
- 支持TCP/UDP多播
- 消息排序保证(Total Order Broadcast)
-
典型配置参数:
wsrep_provider_options = "gmcast.listen_addr=tcp://0.0.0.0:4567;gmcast.peer_timeout=PT3S"
同步复制机制
复制流程详解
-
本地事务阶段:
- 事务在发起节点执行
- 生成二进制日志(binlog)
- 创建写集(包含所有受影响的行数据)
-
全局认证阶段:
- 写集广播到所有节点
- 各节点并行执行认证测试:
- 检查主键冲突
- 验证事务依赖关系
- 通过测试的事务获得全局提交顺序
-
异步应用阶段:
- 写集进入回放队列
- 回放线程(applier)按序应用变更
- 应用完成后释放客户端连接
冲突检测算法
认证测试的数学表示:
Certify(Tx) = ∀ T ∈ committed_transactions:if WS(Tx) ∩ WS(T) ≠ ∅ ∧ T.seqno < Tx.seqnothen ABORT(Tx)else COMMIT(Tx)
实际执行过程示例:
- 节点A提交事务T1修改行R1
- 节点B同时提交事务T2也修改行R1
- 集群检测到冲突,保留先到达认证阶段的事务
关键特性
多主架构实现
-
写入流程:
- 任何节点都能接受写请求
- 自动路由到最优节点(可配置负载均衡)
- 典型配置:wsrep_slave_threads=16
-
冲突处理:
- 使用序列号(seqno)全局排序
- 支持人工冲突解决(通过自定义冲突解决函数)
-
优势场景:
- 地理分布式部署
- 读写分离困难的应用
- 需要快速故障恢复的系统
强一致性保障
-
一致性级别:
- 同步(SYNC):等待所有节点确认
- 异步(ASYNC):本地提交即返回
- 半同步(SEMI-SYNC):多数节点确认
-
配置示例:
wsrep_sync_wait = 1 # 确保读操作能看到最新写入
-
实现原理:
- 使用全局事务ID(GTID)
- 每个事务关联唯一标识符
- 读操作等待相关GTID在所有节点应用
自动成员管理
-
节点加入流程:
- 新节点发起加入请求
- 集群选择Donor节点
- 执行SST(State Snapshot Transfer)或IST(Incremental State Transfer)
-
状态转移方法:
方法 描述 适用场景 rsync 文件级全量同步 新节点加入 mariabackup 热备份同步 生产环境首选 xtrabackup 物理备份同步 MySQL环境 -
故障检测配置:
wsrep_provider_options = "evs.keepalive_period=PT1S;evs.suspect_timeout=PT5S"
性能优化策略
并行复制实现
-
线程模型:
- 主线程:接收和排序写集
- 工作线程:并行应用写集
- 配置建议:wsrep_slave_threads = CPU核心数×2
-
依赖处理:
- 相同主键的写集顺序执行
- 不同主键的写集可以并行
- 监控指标:wsrep_cert_deps_distance
-
性能对比:
单线程:1000 TPS 8线程:6500 TPS 16线程:12000 TPS
流控机制详解
-
触发条件:
- 接收队列长度 > wsrep_flow_control_threshold
- 应用延迟 > wsrep_flow_control_interval
-
工作流程:
- 落后节点发送PAUSE请求
- 其他节点暂停发送新事务
- 队列降至阈值后恢复
-
配置建议:
wsrep_flow_control_threshold = 65536 wsrep_flow_control_interval = 100
批处理与压缩
-
传输优化:
- 写集聚合:wsrep_trx_fragment_size=1MB
- 压缩算法:支持LZ4、Zstd等
- 网络节省:典型压缩率30-70%
-
配置示例:
wsrep_trx_fragment_unit = 'bytes' wsrep_trx_fragment_size = 1024000 wsrep_slave_threads = 16
-
性能影响:
- 增加少量CPU开销
- 显著降低网络延迟
- 特别适合广域网部署
部署与监控
详细配置指南
-
基本参数:
[mysqld] binlog_format=ROW default_storage_engine=InnoDB innodb_autoinc_lock_mode=2
-
集群配置:
wsrep_provider=/usr/lib/galera/libgalera_smm.so wsrep_cluster_name="production_cluster" wsrep_cluster_address="gcomm://192.168.1.101,192.168.1.102,192.168.1.103" wsrep_node_name="node1" wsrep_node_address="192.168.1.101"
-
同步方法选择:
wsrep_sst_method=mariabackup wsrep_sst_auth="sst_user:s3cret"
监控指标体系
-
集群状态:
- wsrep_cluster_size:节点数量
- wsrep_cluster_status:集群健康状况
- wsrep_ready:服务可用性
-
性能指标:
指标 健康值 说明 wsrep_flow_control_paused <0.1 流控时间占比 wsrep_local_recv_queue <100 接收队列长度 wsrep_local_send_queue <10 发送队列长度 -
复制延迟:
- wsrep_local_bf_aborts:冲突中止次数
- wsrep_cert_deps_distance:事务依赖距离
- wsrep_apply_oooe:无序应用比例
维护命令示例
-
状态检查:
SHOW STATUS LIKE 'wsrep%';
-
安全重启:
systemctl stop mysql galera_recovery systemctl start mysql
-
节点移除:
SET GLOBAL wsrep_provider_options='pc.ignore_sb=true';
常见问题与解决方案
脑裂处理方案
-
预防措施:
- 使用奇数节点(3个或更多)
- 配置网络冗余
- 设置合理超时:
evs.inactive_timeout=PT15S evs.suspect_timeout=PT5S
-
恢复步骤:
- 识别存活分区
- 手动选择主分区
- 重启其他节点以加入:
mysqld --wsrep_cluster_address=gcomm://primary_node
-
仲裁方案:
- 专用仲裁节点
- 外部仲裁服务
- 云提供商托管仲裁
SST故障处理
-
常见错误:
- 认证失败
- 磁盘空间不足
- 网络中断
-
解决步骤:
# 检查日志定位原因 tail -f /var/log/mysql/error.log# 手动执行SST mysql -e "SET GLOBAL wsrep_sst_donor='node2'"
-
最佳实践:
- 预先测试SST过程
- 监控磁盘空间
- 使用专用SST账户
性能调优建议
-
参数优化:
innodb_buffer_pool_size=12G innodb_log_file_size=4G wsrep_slave_threads=16
-
架构优化:
- 读写分离
- 数据分片
- 缓存层引入
-
硬件建议:
- 10Gbps网络
- SSD存储
- 充足内存(>64GB用于大型集群)
总结与建议
Galera Cluster 为MySQL/MariaDB提供了企业级的高可用解决方案,但在实际部署时需要注意:
-
适用场景:
- 需要强一致性的关键业务
- 中等写入负载(<5000 TPS)
- 网络延迟稳定的环境
-
限制因素:
- 所有节点必须具有相同数据
- 网络分区可能导致服务中断
- 跨数据中心部署需高带宽
-
运维建议:
- 建立完善的监控系统
- 定期进行故障演练
- 保持软件版本一致
通过合理配置和持续优化,Galera Cluster可以为企业提供稳定可靠的数据库集群服务。