Skip to content

MariaDB Galera Cluster 最佳实践

Galera Cluster 是一个基于同步复制的多主集群解决方案,为 MariaDB 提供了高可用性、高可靠性和高扩展性。它支持自动故障检测和恢复,允许在任何节点上进行读写操作,是构建企业级高可用数据库集群的理想选择。

架构设计最佳实践

1. 集群规模

节点数量

  • 建议 3-9 个节点:奇数节点可以避免脑裂问题
  • 最小 3 个节点:确保集群在单个节点故障时仍能正常运行
  • 避免过多节点:超过 9 个节点会增加集群通信开销,影响性能

节点角色

  • 所有节点都是主节点:Galera Cluster 是多主架构,所有节点均可读写
  • 节点功能
    • 数据节点:存储数据并参与复制
    • 仲裁节点(Arbiter):仅参与投票,不存储数据,用于扩展集群规模

2. 网络架构

专用网络

  • 为 Galera Cluster 通信使用专用网络
  • 避免与业务流量共享网络
  • 建议使用 10Gbps 以太网,确保低延迟和高带宽

网络延迟

  • 节点之间的网络延迟应控制在 1ms 以内
  • 避免跨数据中心部署,除非网络延迟能得到保证
  • 跨数据中心部署时,考虑使用 WAN 优化技术

网络分区处理

  • 配置 pc.weight 参数,设置节点权重
  • 配置 evs.suspect_timeoutevs.inactive_timeout 参数,调整网络超时时间
  • 考虑使用仲裁节点(Arbiter),增强集群在网络分区时的稳定性

3. 存储架构

存储设备

  • 使用 SSD 存储,提高 I/O 性能
  • 确保所有节点的存储设备性能一致
  • 考虑使用 RAID 10 配置,兼顾性能和可靠性

存储容量

  • 预留足够的存储空间,建议使用率不超过 70%
  • 考虑数据增长趋势,定期进行容量规划

部署配置最佳实践

1. 准备工作

系统要求

  • 操作系统:支持 Linux(CentOS/RHEL 7+, Ubuntu 18.04+)
  • MariaDB 版本
    • Galera Cluster 3.x:支持 MariaDB 10.0 - 10.3
    • Galera Cluster 4.x:支持 MariaDB 10.4+(推荐)
  • 内存:建议每个节点至少 8GB 内存
  • CPU:建议每个节点至少 4 核 CPU

系统优化

  • 关闭防火墙:或配置防火墙允许 Galera 端口(3306, 4567, 4568, 4444)

  • 关闭 SELinux:或配置 SELinux 允许 Galera 操作

  • 优化内核参数

    • 增加文件描述符限制
    • 优化网络参数
    • 关闭 swap(可选,提高性能)
  • 示例内核参数优化

bash
# /etc/sysctl.d/galera.conf
fs.file-max = 65535

# 网络参数优化
net.core.somaxconn = 4096
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 120
net.core.netdev_max_backlog = 4096

# 内存参数优化
vm.swappiness = 0

2. 安装配置

安装 Galera Cluster

  • 使用 MariaDB 官方仓库安装 Galera Cluster

  • 确保所有节点安装相同版本的 MariaDB 和 Galera

  • 示例安装命令(CentOS/RHEL 8)

bash
# 添加 MariaDB 仓库
curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash

# 安装 MariaDB 和 Galera
sudo dnf install -y MariaDB-server MariaDB-client galera-4 MariaDB-shared MariaDB-backup

配置文件

  • 基本配置

    • 配置 server-id,每个节点必须唯一
    • 配置 binlog_format = ROW
    • 配置 default_storage_engine = InnoDB
    • 配置 innodb_autoinc_lock_mode = 2
  • Galera 配置

    • wsrep_on = ON:启用 Galera
    • wsrep_provider:Galera 提供程序路径
    • wsrep_cluster_name:集群名称
    • wsrep_cluster_address:集群节点地址
    • wsrep_node_name:节点名称
    • wsrep_node_address:节点地址
    • wsrep_sst_method:状态快照传输(SST)方法
  • 配置示例

ini
# /etc/my.cnf.d/galera.cnf
[mysqld]
# 基本配置
server-id = 1
binlog_format = ROW
default_storage_engine = InnoDB
innodb_autoinc_lock_mode = 2
innodb_flush_log_at_trx_commit = 2
innodb_doublewrite = 0

# Galera 配置
wsrep_on = ON
wsrep_provider = /usr/lib64/galera-4/libgalera_smm.so
wsrep_cluster_name = "mariadb_galera_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:sst_password"

# 并行复制线程数(根据 CPU 核心数调整)
wsrep_slave_threads = 8

# 事务大小限制
wsrep_max_ws_rows = 131072
wsrep_max_ws_size = 1073741824

# 流控配置
wsrep_flow_control_mode = AUTO
wsrep_flow_control_interval = 1

# 认证配置
wsrep_provider_options = "gcache.size=1G; gcache.page_size=1G; gcomm.thread_prio=0; cert.ignore_server_names=1"

3. 集群初始化

首次启动

  • 选择一个节点作为引导节点

  • 使用 --wsrep-new-cluster 选项启动第一个节点

  • 其他节点正常启动,自动加入集群

  • 示例

bash
# 启动第一个节点(引导节点)
sudo systemctl start mariadb --wsrep-new-cluster

# 启动其他节点
sudo systemctl start mariadb

验证集群状态

  • 使用 SHOW GLOBAL STATUS LIKE 'wsrep%' 查看集群状态

  • 检查 wsrep_cluster_status 是否为 Primary

  • 检查 wsrep_cluster_size 是否等于节点数量

  • 检查 wsrep_local_state_comment 是否为 Synced

  • 示例

sql
-- 查看集群状态
SHOW GLOBAL STATUS LIKE 'wsrep%';

-- 检查集群大小
SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';

-- 检查节点状态
SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment';

性能优化最佳实践

1. 并行复制

  • 配置 wsrep_slave_threads

    • 根据 CPU 核心数调整,建议设置为 CPU 核心数的 1-2 倍
    • 增加并行复制线程数可以提高写操作的处理速度
  • 示例

ini
# /etc/my.cnf.d/galera.cnf
[mysqld]
wsrep_slave_threads = 8  # 8 核 CPU 配置

2. 事务大小

  • 限制事务大小

    • 配置 wsrep_max_ws_rowswsrep_max_ws_size
    • 建议单事务大小不超过 1GB
    • 避免大事务,将大事务拆分为小事务
  • 示例

ini
# /etc/my.cnf.d/galera.cnf
[mysqld]
wsrep_max_ws_rows = 131072  # 限制事务行数
wsrep_max_ws_size = 1073741824  # 限制事务大小为 1GB

3. 流控配置

  • 流控(Flow Control)

    • 自动调节集群写入速度,防止慢节点影响整个集群
    • 配置 wsrep_flow_control_mode = AUTO
    • 监控 wsrep_flow_control_paused 指标,评估流控影响
  • 示例

ini
# /etc/my.cnf.d/galera.cnf
[mysqld]
wsrep_flow_control_mode = AUTO
wsrep_flow_control_interval = 1

4. 缓存配置

  • Galera 缓存

    • 配置 gcache.size:Galera 写集缓存大小,建议设置为内存的 10%-20%
    • 配置 gcache.page_size:缓存页大小,建议与 gcache.size 相同
  • 示例

ini
# /etc/my.cnf.d/galera.cnf
[mysqld]
wsrep_provider_options = "gcache.size=1G; gcache.page_size=1G"

5. InnoDB 优化

  • 关闭 innodb_doublewrite:Galera 已经提供了类似的保护机制

  • 配置 innodb_flush_log_at_trx_commit = 2:平衡性能和安全性

  • 配置 innodb_buffer_pool_size:建议设置为服务器内存的 50%-70%

  • 示例

ini
# /etc/my.cnf.d/galera.cnf
[mysqld]
innodb_doublewrite = 0
innodb_flush_log_at_trx_commit = 2
innodb_buffer_pool_size = 8G  # 16GB 内存配置

监控最佳实践

1. 关键监控指标

集群状态指标

  • wsrep_cluster_status:集群状态(Primary 或 Non-Primary)
  • wsrep_cluster_size:集群节点数量
  • wsrep_cluster_weight:集群总权重
  • wsrep_connected:节点是否连接到集群

节点状态指标

  • wsrep_local_state_comment:节点状态(Joining, Donor, Synced 等)
  • wsrep_local_index:节点在集群中的索引
  • wsrep_local_weight:节点权重

复制指标

  • wsrep_replicated:节点发送的写集数量
  • wsrep_replicated_bytes:节点发送的写集大小
  • wsrep_received:节点接收的写集数量
  • wsrep_received_bytes:节点接收的写集大小
  • wsrep_local_recv_queue:接收队列长度
  • wsrep_local_send_queue:发送队列长度

性能指标

  • wsrep_flow_control_paused:流控暂停时间比例
  • wsrep_flow_control_sent:发送的流控消息数量
  • wsrep_flow_control_recv:接收的流控消息数量
  • wsrep_last_committed:最后提交的事务 ID
  • wsrep_local_cert_failures:认证失败次数

2. 监控工具

内置监控

  • SHOW STATUS:查看 Galera 状态变量
  • SHOW VARIABLES:查看 Galera 配置变量
  • Performance Schema:MariaDB 10.1+ 支持,提供详细的性能数据

第三方监控

  • Prometheus + Grafana:使用 mariadb_exporter 收集指标
  • Percona Monitoring and Management (PMM):支持 Galera Cluster 监控
  • Zabbix:使用 Zabbix 模板监控 Galera Cluster
  • Nagios/Icinga:使用插件监控 Galera Cluster

3. 告警配置

  • 集群状态告警

    • wsrep_cluster_status 不是 Primary
    • wsrep_cluster_size 小于预期
    • 节点状态不是 Synced
  • 性能告警

    • wsrep_flow_control_paused 超过 0.5(50%)
    • wsrep_local_recv_queue 超过 100
    • wsrep_local_send_queue 超过 100
  • 复制告警

    • wsrep_local_cert_failures 持续增加
    • wsrep_last_committed 停止增长

故障处理最佳实践

1. 节点故障

单个节点故障

  • 自动恢复:节点故障后,集群会自动调整,其他节点继续正常运行
  • 故障节点恢复
    1. 修复故障原因
    2. 启动节点,自动加入集群
    3. 节点会自动同步数据(IST 或 SST)

多个节点故障

  • 2 个节点故障(3 节点集群):集群将不可用,因为无法形成多数派
  • 恢复步骤
    1. 修复至少 2 个节点
    2. 选择一个节点作为引导节点,使用 --wsrep-new-cluster 启动
    3. 启动其他修复后的节点,自动加入集群

2. 脑裂问题

原因

  • 网络分区导致集群分裂为多个分区
  • 每个分区都认为自己是主分区

预防

  • 使用奇数节点,确保只有一个分区能形成多数派
  • 配置 pc.weight 参数,设置节点权重
  • 使用仲裁节点(Arbiter),增强集群在网络分区时的稳定性

处理

  1. 确定主分区:查看各分区的 wsrep_cluster_sizewsrep_incoming_addresses
  2. 关闭从分区节点:使用 systemctl stop mariadb
  3. 修复网络问题:确保所有节点之间网络连通
  4. 重启从分区节点:启动节点,自动加入主分区
  5. 验证集群状态:确保所有节点状态为 Synced

3. 流控问题

原因

  • 某个节点处理速度跟不上集群写入速度
  • 导致集群写入速度下降

处理

  • 增加慢节点的资源:升级 CPU、内存或存储
  • 调整 wsrep_slave_threads:增加并行复制线程数
  • 优化查询:减少慢查询,提高节点处理速度
  • 考虑分片:将数据分散到多个集群

4. 认证失败(Cert Failures)

原因

  • 并发事务修改相同的数据
  • 导致冲突,需要回滚

处理

  • 减少并发修改:优化应用逻辑,减少并发修改相同数据
  • 使用更细粒度的锁:在应用层使用更细粒度的锁
  • 增加 wsrep_cert_deps_distance:增加认证依赖距离
  • 监控 wsrep_local_cert_failures:及时发现和处理认证失败

备份与恢复最佳实践

1. 备份策略

全量备份

  • 使用 mariabackup:支持热备份,不影响集群运行

  • 在单个节点上执行:备份数据会自动复制到其他节点

  • 定期执行:根据业务需求,每天或每周执行一次

  • 示例

bash
# 使用 mariabackup 进行全量备份
mariabackup --backup --target-dir=/backup/galera_full --user=backup --password=backup_password

增量备份

  • 使用 mariabackup --incremental:基于全量备份进行增量备份

  • 定期执行:每小时或每天执行一次

  • 示例

bash
# 使用 mariabackup 进行增量备份
mariabackup --backup --target-dir=/backup/galera_inc1 --incremental-basedir=/backup/galera_full --user=backup --password=backup_password

2. 恢复策略

单节点恢复

  • 单节点故障不需要特殊恢复,节点启动后会自动同步数据

全集群恢复

  1. 停止所有节点
  2. 选择一个节点作为恢复节点
  3. 恢复备份数据
    bash
    # 准备全量备份
    mariabackup --prepare --target-dir=/backup/galera_full
    
    # 恢复数据
    mariabackup --copy-back --target-dir=/backup/galera_full
    
    # 修改数据目录权限
    chown -R mysql:mysql /var/lib/mysql
  4. 使用 --wsrep-new-cluster 启动恢复节点
  5. 启动其他节点,自动加入集群

维护最佳实践

1. 节点滚动升级

升级步骤

  1. 备份数据:在升级前进行全量备份
  2. 停止一个节点:选择负载较低的节点
  3. 升级节点:安装新版本的 MariaDB 和 Galera
  4. 启动节点:自动加入集群,同步数据
  5. 验证节点状态:确保节点状态为 Synced
  6. 重复步骤 2-5:升级其他节点

注意事项

  • 一次只升级一个节点
  • 确保升级后的节点能正常加入集群
  • 升级过程中监控集群状态

2. 配置修改

动态配置

  • 部分 Galera 配置可以动态修改,无需重启节点

  • 使用 SET GLOBAL 命令修改配置

  • 修改后使用 SHOW GLOBAL VARIABLES 验证

  • 示例

sql
-- 动态修改 wsrep_slave_threads
SET GLOBAL wsrep_slave_threads = 12;

-- 验证修改
SHOW GLOBAL VARIABLES LIKE 'wsrep_slave_threads';

静态配置

  • 部分配置需要重启节点才能生效
  • 修改配置文件后,重启节点
  • 建议在维护窗口进行

3. 定期检查

集群状态检查

  • 定期检查集群状态,确保所有节点正常运行
  • 检查 wsrep_cluster_statusPrimary
  • 检查所有节点状态为 Synced

日志检查

  • 定期检查 MariaDB 错误日志和 Galera 日志
  • 查看是否有异常信息
  • 及时处理发现的问题

性能检查

  • 监控集群性能指标
  • 分析慢查询日志
  • 优化查询和配置

常见问题 (FAQ)

Q: 如何添加新节点到 Galera Cluster?

A: 添加新节点步骤:

  1. 配置新节点:安装 MariaDB 和 Galera,配置相同的集群参数
  2. 启动新节点:正常启动,自动加入集群
  3. 数据同步:新节点会自动从现有节点同步数据(IST 或 SST)
  4. 验证状态:确保新节点状态为 Synced

Q: 如何处理 Galera Cluster 脑裂问题?

A: 脑裂问题处理:

  1. 确定主分区:查看各分区的 wsrep_cluster_sizewsrep_incoming_addresses
  2. 关闭从分区节点:使用 systemctl stop mariadb
  3. 修复网络问题:确保所有节点之间网络连通
  4. 重启从分区节点:启动节点,自动加入主分区
  5. 验证集群状态:确保所有节点状态为 Synced

Q: 如何选择 Galera Cluster 的 SST 方法?

A: SST 方法选择:

  • mariabackup:推荐,支持热备份,速度快,影响小
  • rsync:简单,速度快,但会锁表
  • mysqldump:兼容性好,但速度慢,会锁表
  • xtrabackup:Percona 的热备份工具,与 mariabackup 类似

Q: 如何监控 Galera Cluster 性能?

A: 性能监控建议:

  1. 关键指标
    • wsrep_flow_control_paused:流控暂停时间比例
    • wsrep_local_recv_queue:接收队列长度
    • wsrep_local_send_queue:发送队列长度
    • wsrep_local_cert_failures:认证失败次数
  2. 监控工具
    • Prometheus + Grafana:使用 mariadb_exporter
    • Percona Monitoring and Management (PMM)
    • Zabbix
  3. 告警配置:设置合理的告警阈值,及时发现性能问题

Q: 如何优化 Galera Cluster 写入性能?

A: 写入性能优化:

  1. 增加 wsrep_slave_threads:根据 CPU 核心数调整
  2. 配置 innodb_flush_log_at_trx_commit = 2:平衡性能和安全性
  3. 关闭 innodb_doublewrite:Galera 已提供类似保护
  4. 限制事务大小:配置 wsrep_max_ws_rowswsrep_max_ws_size
  5. 使用 SSD 存储:提高 I/O 性能
  6. 专用网络:为 Galera 通信使用专用网络

Q: 如何处理 Galera Cluster 节点状态为 Donor/Desynced

A: Donor/Desynced 状态处理:

  • Donor:节点正在为其他节点提供 SST 数据,这是正常状态

  • Desynced:节点与集群不同步,可能是因为:

    1. 节点处理速度跟不上集群写入速度
    2. 网络延迟过高
    3. 节点资源不足
  • 处理方法

    1. 检查节点资源使用情况
    2. 优化查询,提高节点处理速度
    3. 检查网络连接,降低网络延迟
    4. 如果问题持续,考虑重启节点

Q: 如何配置 Galera Cluster 跨数据中心部署?

A: 跨数据中心部署建议:

  1. 网络要求:节点之间网络延迟控制在 10ms 以内
  2. 奇数节点:每个数据中心至少 1 个节点,总节点数为奇数
  3. 仲裁节点:在第三个数据中心部署仲裁节点
  4. 配置 pc.weight:为不同数据中心的节点设置不同的权重
  5. 监控网络延迟:使用 pingtraceroute 定期检查网络延迟
  6. 考虑 WAN 优化:使用 WAN 优化技术,降低网络延迟

Q: 如何备份 Galera Cluster?

A: 备份建议:

  1. 使用 mariabackup:支持热备份,不影响集群运行
  2. 在单个节点上执行:备份数据会自动复制到其他节点
  3. 定期执行:每天或每周执行一次全量备份,每小时执行一次增量备份
  4. 验证备份:定期恢复备份,验证备份的可用性
  5. 异地备份:将备份数据存储到异地,防止本地灾难

总结

MariaDB Galera Cluster 是一个强大的高可用数据库集群解决方案,通过遵循本文介绍的最佳实践,可以确保集群的高性能、高可用性和可靠性。

最佳实践包括:

  1. 架构设计:合理规划集群规模、网络架构和存储架构
  2. 部署配置:正确安装和配置 Galera Cluster,确保集群初始化成功
  3. 性能优化:调整并行复制、事务大小、流控和 InnoDB 配置
  4. 监控告警:监控关键指标,配置合理的告警
  5. 故障处理:处理节点故障、脑裂问题、流控问题和认证失败
  6. 备份恢复:定期进行备份,制定恢复策略
  7. 维护管理:节点滚动升级、配置修改和定期检查

Galera Cluster 维护需要持续关注集群状态和性能,及时处理问题,确保集群始终处于最佳运行状态。通过合理的设计和维护,可以构建一个稳定、高效的高可用数据库集群,满足企业级业务需求。