外观
MariaDB Galera Cluster 最佳实践
Galera Cluster 是一个基于同步复制的多主集群解决方案,为 MariaDB 提供了高可用性、高可靠性和高扩展性。它支持自动故障检测和恢复,允许在任何节点上进行读写操作,是构建企业级高可用数据库集群的理想选择。
架构设计最佳实践
1. 集群规模
节点数量
- 建议 3-9 个节点:奇数节点可以避免脑裂问题
- 最小 3 个节点:确保集群在单个节点故障时仍能正常运行
- 避免过多节点:超过 9 个节点会增加集群通信开销,影响性能
节点角色
- 所有节点都是主节点:Galera Cluster 是多主架构,所有节点均可读写
- 节点功能:
- 数据节点:存储数据并参与复制
- 仲裁节点(Arbiter):仅参与投票,不存储数据,用于扩展集群规模
2. 网络架构
专用网络
- 为 Galera Cluster 通信使用专用网络
- 避免与业务流量共享网络
- 建议使用 10Gbps 以太网,确保低延迟和高带宽
网络延迟
- 节点之间的网络延迟应控制在 1ms 以内
- 避免跨数据中心部署,除非网络延迟能得到保证
- 跨数据中心部署时,考虑使用 WAN 优化技术
网络分区处理
- 配置
pc.weight参数,设置节点权重 - 配置
evs.suspect_timeout和evs.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 = 02. 安装配置
安装 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:启用 Galerawsrep_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_rows和wsrep_max_ws_size - 建议单事务大小不超过 1GB
- 避免大事务,将大事务拆分为小事务
- 配置
示例:
ini
# /etc/my.cnf.d/galera.cnf
[mysqld]
wsrep_max_ws_rows = 131072 # 限制事务行数
wsrep_max_ws_size = 1073741824 # 限制事务大小为 1GB3. 流控配置
流控(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 = 14. 缓存配置
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:最后提交的事务 IDwsrep_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不是Primarywsrep_cluster_size小于预期- 节点状态不是
Synced
性能告警:
wsrep_flow_control_paused超过 0.5(50%)wsrep_local_recv_queue超过 100wsrep_local_send_queue超过 100
复制告警:
wsrep_local_cert_failures持续增加wsrep_last_committed停止增长
故障处理最佳实践
1. 节点故障
单个节点故障
- 自动恢复:节点故障后,集群会自动调整,其他节点继续正常运行
- 故障节点恢复:
- 修复故障原因
- 启动节点,自动加入集群
- 节点会自动同步数据(IST 或 SST)
多个节点故障
- 2 个节点故障(3 节点集群):集群将不可用,因为无法形成多数派
- 恢复步骤:
- 修复至少 2 个节点
- 选择一个节点作为引导节点,使用
--wsrep-new-cluster启动 - 启动其他修复后的节点,自动加入集群
2. 脑裂问题
原因
- 网络分区导致集群分裂为多个分区
- 每个分区都认为自己是主分区
预防
- 使用奇数节点,确保只有一个分区能形成多数派
- 配置
pc.weight参数,设置节点权重 - 使用仲裁节点(Arbiter),增强集群在网络分区时的稳定性
处理
- 确定主分区:查看各分区的
wsrep_cluster_size和wsrep_incoming_addresses - 关闭从分区节点:使用
systemctl stop mariadb - 修复网络问题:确保所有节点之间网络连通
- 重启从分区节点:启动节点,自动加入主分区
- 验证集群状态:确保所有节点状态为
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_password2. 恢复策略
单节点恢复
- 单节点故障不需要特殊恢复,节点启动后会自动同步数据
全集群恢复
- 停止所有节点
- 选择一个节点作为恢复节点
- 恢复备份数据:bash
# 准备全量备份 mariabackup --prepare --target-dir=/backup/galera_full # 恢复数据 mariabackup --copy-back --target-dir=/backup/galera_full # 修改数据目录权限 chown -R mysql:mysql /var/lib/mysql - 使用
--wsrep-new-cluster启动恢复节点 - 启动其他节点,自动加入集群
维护最佳实践
1. 节点滚动升级
升级步骤
- 备份数据:在升级前进行全量备份
- 停止一个节点:选择负载较低的节点
- 升级节点:安装新版本的 MariaDB 和 Galera
- 启动节点:自动加入集群,同步数据
- 验证节点状态:确保节点状态为
Synced - 重复步骤 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_status为Primary - 检查所有节点状态为
Synced
日志检查
- 定期检查 MariaDB 错误日志和 Galera 日志
- 查看是否有异常信息
- 及时处理发现的问题
性能检查
- 监控集群性能指标
- 分析慢查询日志
- 优化查询和配置
常见问题 (FAQ)
Q: 如何添加新节点到 Galera Cluster?
A: 添加新节点步骤:
- 配置新节点:安装 MariaDB 和 Galera,配置相同的集群参数
- 启动新节点:正常启动,自动加入集群
- 数据同步:新节点会自动从现有节点同步数据(IST 或 SST)
- 验证状态:确保新节点状态为
Synced
Q: 如何处理 Galera Cluster 脑裂问题?
A: 脑裂问题处理:
- 确定主分区:查看各分区的
wsrep_cluster_size和wsrep_incoming_addresses - 关闭从分区节点:使用
systemctl stop mariadb - 修复网络问题:确保所有节点之间网络连通
- 重启从分区节点:启动节点,自动加入主分区
- 验证集群状态:确保所有节点状态为
Synced
Q: 如何选择 Galera Cluster 的 SST 方法?
A: SST 方法选择:
mariabackup:推荐,支持热备份,速度快,影响小rsync:简单,速度快,但会锁表mysqldump:兼容性好,但速度慢,会锁表xtrabackup:Percona 的热备份工具,与mariabackup类似
Q: 如何监控 Galera Cluster 性能?
A: 性能监控建议:
- 关键指标:
wsrep_flow_control_paused:流控暂停时间比例wsrep_local_recv_queue:接收队列长度wsrep_local_send_queue:发送队列长度wsrep_local_cert_failures:认证失败次数
- 监控工具:
- Prometheus + Grafana:使用
mariadb_exporter - Percona Monitoring and Management (PMM)
- Zabbix
- Prometheus + Grafana:使用
- 告警配置:设置合理的告警阈值,及时发现性能问题
Q: 如何优化 Galera Cluster 写入性能?
A: 写入性能优化:
- 增加
wsrep_slave_threads:根据 CPU 核心数调整 - 配置
innodb_flush_log_at_trx_commit = 2:平衡性能和安全性 - 关闭
innodb_doublewrite:Galera 已提供类似保护 - 限制事务大小:配置
wsrep_max_ws_rows和wsrep_max_ws_size - 使用 SSD 存储:提高 I/O 性能
- 专用网络:为 Galera 通信使用专用网络
Q: 如何处理 Galera Cluster 节点状态为 Donor/Desynced?
A: Donor/Desynced 状态处理:
Donor:节点正在为其他节点提供 SST 数据,这是正常状态
Desynced:节点与集群不同步,可能是因为:
- 节点处理速度跟不上集群写入速度
- 网络延迟过高
- 节点资源不足
处理方法:
- 检查节点资源使用情况
- 优化查询,提高节点处理速度
- 检查网络连接,降低网络延迟
- 如果问题持续,考虑重启节点
Q: 如何配置 Galera Cluster 跨数据中心部署?
A: 跨数据中心部署建议:
- 网络要求:节点之间网络延迟控制在 10ms 以内
- 奇数节点:每个数据中心至少 1 个节点,总节点数为奇数
- 仲裁节点:在第三个数据中心部署仲裁节点
- 配置
pc.weight:为不同数据中心的节点设置不同的权重 - 监控网络延迟:使用
ping和traceroute定期检查网络延迟 - 考虑 WAN 优化:使用 WAN 优化技术,降低网络延迟
Q: 如何备份 Galera Cluster?
A: 备份建议:
- 使用
mariabackup:支持热备份,不影响集群运行 - 在单个节点上执行:备份数据会自动复制到其他节点
- 定期执行:每天或每周执行一次全量备份,每小时执行一次增量备份
- 验证备份:定期恢复备份,验证备份的可用性
- 异地备份:将备份数据存储到异地,防止本地灾难
总结
MariaDB Galera Cluster 是一个强大的高可用数据库集群解决方案,通过遵循本文介绍的最佳实践,可以确保集群的高性能、高可用性和可靠性。
最佳实践包括:
- 架构设计:合理规划集群规模、网络架构和存储架构
- 部署配置:正确安装和配置 Galera Cluster,确保集群初始化成功
- 性能优化:调整并行复制、事务大小、流控和 InnoDB 配置
- 监控告警:监控关键指标,配置合理的告警
- 故障处理:处理节点故障、脑裂问题、流控问题和认证失败
- 备份恢复:定期进行备份,制定恢复策略
- 维护管理:节点滚动升级、配置修改和定期检查
Galera Cluster 维护需要持续关注集群状态和性能,及时处理问题,确保集群始终处于最佳运行状态。通过合理的设计和维护,可以构建一个稳定、高效的高可用数据库集群,满足企业级业务需求。
