1. MariaDB 10.6 Galera Cluster 核心架构解析
Galera Cluster 是一种基于同步多主复制的数据库集群解决方案,它与传统的主从复制架构有着本质区别。在传统架构中,只有主节点可以处理写操作,而从节点只能处理读操作。这种架构存在单点故障风险,并且在主从切换时往往需要人工干预。
Galera Cluster 的创新之处在于:
- 所有节点均可读写,没有主从之分
- 采用同步复制机制确保数据一致性
- 自动处理节点加入和故障恢复
- 对应用程序完全透明
1.1 同步复制机制深度剖析
Galera 的同步复制是通过写集(Write Set)实现的。当一个事务在某个节点提交时,会经历以下关键步骤:
- 本地预处理:节点先在本机执行事务的所有操作,但不提交。此时会生成包含所有修改的写集。
- 全局广播:将写集通过组通信系统(GCS)广播到集群所有其他节点。
- 冲突检测:各节点并行检查写集是否与本地未提交事务冲突。
- 全局排序:通过认证测试(Certification Test)对所有写集进行全局排序。
- 应用提交:所有节点按照相同顺序应用写集,确保数据一致性。
这种机制的关键优势在于:
- 避免了传统异步复制的数据不一致问题
- 所有节点数据实时同步
- 写入操作在所有节点要么全部成功,要么全部失败
1.2 关键组件详解
Galera Cluster 由以下几个核心组件构成:
- wsrep API:作为MariaDB和Galera之间的桥梁,负责将数据库操作转换为写集。
- Galera复制插件:实现认证复制、冲突检测和节点通信的核心逻辑。
- 组通信系统(GCS):基于Paxos协议实现可靠的节点间通信。
- 数据库引擎层:处理实际的SQL执行和存储管理。
这些组件协同工作,形成了一个高度可用的分布式数据库系统。
2. 环境准备与系统配置
2.1 硬件与网络要求
对于生产环境部署,建议满足以下最低配置:
服务器配置:
- CPU:至少8核,推荐16核以上
- 内存:32GB起步,根据数据量适当增加
- 存储:SSD硬盘,RAID 10配置
- 网络:10Gbps网络接口
网络要求:
- 节点间延迟应小于5ms
- 带宽至少1Gbps
- 避免跨机房部署,网络分区会导致性能下降
2.2 操作系统优化
在部署前,需要对操作系统进行针对性优化:
内核参数调整:
bash复制# 增加文件描述符限制
echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf
# 调整内核参数
echo "net.ipv4.tcp_max_syn_backlog = 8192" >> /etc/sysctl.conf
echo "net.core.somaxconn = 8192" >> /etc/sysctl.conf
echo "vm.swappiness = 10" >> /etc/sysctl.conf
sysctl -p
磁盘I/O优化:
- 使用deadline或noop调度器
- 禁用文件系统atime属性
- 为数据目录单独挂载高性能存储
2.3 安全配置
防火墙规则:
bash复制# 开放必要的端口
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --permanent --add-port=4567/tcp
firewall-cmd --permanent --add-port=4567/udp
firewall-cmd --permanent --add-port=4568/tcp
firewall-cmd --permanent --add-port=4444/tcp
firewall-cmd --reload
SELinux配置:
bash复制# 临时禁用
setenforce 0
# 永久禁用
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
3. MariaDB 10.6 编译与安装
3.1 依赖项处理
在编译前需要安装必要的开发工具和库:
bash复制yum groupinstall "Development Tools" -y
yum install -y gnutls-devel ncurses-devel bison-devel boost boost-devel \
flex flex-devel libxml2 libxml2-devel snappy snappy-devel \
curl-devel lz4-devel pcre2 pcre2-devel pcre pcre-devel
对于特定版本的依赖库,如OpenSSL 1.0.2,需要手动编译安装:
bash复制wget https://www.openssl.org/source/openssl-1.0.2u.tar.gz
tar xzf openssl-1.0.2u.tar.gz
cd openssl-1.0.2u
./config --prefix=/opt/openssl --openssldir=/opt/openssl shared zlib
make -j$(nproc)
make install
3.2 编译参数详解
MariaDB的编译配置需要特别关注Galera相关参数:
bash复制cmake . \
-DCMAKE_INSTALL_PREFIX=/opt/mariadb \
-DMYSQL_DATADIR=/opt/mariadb/data \
-DSYSCONFDIR=/opt/mariadb \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DWITH_LIBWRAP=0 \
-DMYSQL_UNIX_ADDR=/opt/mariadb/data/mysql.sock \
-DMYSQL_TCP_PORT=3306 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci \
-DWITH_GALERA=ON \
-DWSREP_PROVIDER=/opt/mysql/mysqlso/libgalera_smm.so \
-DCMAKE_BUILD_TYPE=Release \
-DWITH_WSREP=ON
关键参数说明:
WITH_GALERA=ON:启用Galera支持WSREP_PROVIDER:指定Galera库路径WITH_WSREP=ON:启用wsrep接口
3.3 安装后配置
初始化数据库:
bash复制cd /opt/mariadb
scripts/mysql_install_db --user=mysql --datadir=/opt/mariadb/data
创建systemd服务:
ini复制[Unit]
Description=MariaDB database server
After=syslog.target
After=network.target
[Service]
Type=forking
User=mysql
Group=mysql
ExecStart=/opt/mariadb/bin/mysqld_safe --basedir=/opt/mariadb --datadir=/opt/mariadb/data
TimeoutSec=300
[Install]
WantedBy=multi-user.target
安全加固:
sql复制-- 设置root密码
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('复杂密码');
-- 删除匿名用户
DELETE FROM mysql.user WHERE User='';
-- 移除测试数据库
DROP DATABASE IF EXISTS test;
-- 刷新权限
FLUSH PRIVILEGES;
4. Galera集群配置与优化
4.1 核心参数配置
每个节点的配置文件(/opt/mariadb/my.cnf)需要包含以下Galera特定参数:
ini复制[mysqld]
# Galera基本配置
wsrep_on=ON
wsrep_provider=/opt/mysql/mysqlso/libgalera_smm.so
wsrep_cluster_name="my_galera_cluster"
wsrep_cluster_address="gcomm://node1_ip,node2_ip,node3_ip"
# 节点特定配置
wsrep_node_name="node1" # 每个节点唯一
wsrep_node_address="node1_ip"
wsrep_sst_method=rsync
# 性能优化
wsrep_slave_threads=8
wsrep_causal_reads=OFF
wsrep_certify_nonPK=ON
wsrep_max_ws_rows=131072
wsrep_max_ws_size=1073741824
wsrep_debug=NONE
wsrep_convert_LOCK_to_trx=OFF
wsrep_retry_autocommit=1
wsrep_auto_increment_control=ON
# InnoDB优化
innodb_flush_log_at_trx_commit=2
innodb_autoinc_lock_mode=2
innodb_locks_unsafe_for_binlog=1
innodb_buffer_pool_size=12G # 建议为物理内存的70-80%
4.2 集群启动流程
第一个节点(引导节点):
bash复制/opt/mariadb/bin/mysqld --defaults-file=/opt/mariadb/my.cnf \
--user=mysql \
--wsrep-new-cluster &
关键点:
--wsrep-new-cluster参数仅用于初始化新集群- 必须等待第一个节点完全启动后再启动其他节点
- 可以通过检查wsrep_cluster_size状态确认节点是否就绪
其他节点:
bash复制systemctl start mariadb
4.3 性能优化技巧
-
写集缓存(gcache)优化:
ini复制wsrep_provider_options="gcache.size=4G; gcache.page_size=1G"- gcache.size建议为每个节点预计每小时写入量的2-3倍
- 较大的page_size可以减少磁盘I/O
-
并行复制优化:
ini复制wsrep_slave_threads=16 wsrep_certification_rules=optimized- 线程数建议为CPU核心数的2-4倍
- 对于高并发写入场景特别有效
-
网络优化:
ini复制wsrep_provider_options="gmcast.peer_timeout=PT3S; evs.keepalive_period=PT1S; evs.inactive_check_period=PT0.5S"- 调整超时参数以适应不同的网络环境
- 在不可靠网络中增加检测频率
5. 运维管理与故障处理
5.1 集群状态监控
关键监控指标和查询:
集群整体状态:
sql复制SHOW STATUS LIKE 'wsrep_cluster_size';
SHOW STATUS LIKE 'wsrep_cluster_status';
SHOW STATUS LIKE 'wsrep_connected';
节点健康状态:
sql复制SHOW STATUS LIKE 'wsrep_ready';
SHOW STATUS LIKE 'wsrep_local_state_comment';
性能指标:
sql复制SHOW STATUS LIKE 'wsrep_flow_control_paused';
SHOW STATUS LIKE 'wsrep_cert_deps_distance';
SHOW STATUS LIKE 'wsrep_local_recv_queue';
SHOW STATUS LIKE 'wsrep_local_send_queue';
5.2 常见故障处理
节点无法加入集群:
- 检查防火墙设置,确保所有必要端口开放
- 验证wsrep_cluster_address配置是否正确
- 检查集群状态是否健康
- 查看错误日志获取详细信息
脑裂(Split Brain)处理:
- 确定哪个分区拥有多数节点
- 在少数分区上停止MariaDB服务
- 在少数节点上以
--wsrep-cluster-address=gcomm://启动 - 然后重新加入主集群
SST失败处理:
- 检查donor节点的可用性
- 验证认证信息是否正确
- 确保有足够的磁盘空间
- 考虑使用xtrabackup-v2替代rsync
5.3 备份与恢复策略
物理备份:
bash复制# 使用Percona XtraBackup
xtrabackup --backup --target-dir=/backup/mariadb --user=backup --password=密码
xtrabackup --prepare --target-dir=/backup/mariadb
逻辑备份:
bash复制mysqldump --all-databases --single-transaction --master-data=2 -u root -p > full_backup.sql
恢复流程:
- 停止所有节点服务
- 清空数据目录
- 恢复备份文件
- 启动引导节点
- 启动其他节点
6. 生产环境最佳实践
6.1 容量规划建议
- 内存:确保innodb_buffer_pool_size足够大,通常为总内存的70-80%
- 存储:预留足够的空间用于gcache和二进制日志
- 网络:节点间带宽应能处理峰值写入流量
6.2 高可用架构设计
推荐的三层架构:
- 应用层:实现连接池和故障转移逻辑
- 代理层:使用HAProxy或ProxySQL实现负载均衡
- 数据库层:Galera集群节点
ProxySQL配置示例:
sql复制INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (10,'node1',3306);
INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (10,'node2',3306);
INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (10,'node3',3306);
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
6.3 版本升级策略
- 滚动升级:一次升级一个节点
- 确保集群健康状态
- 测试新版本兼容性
- 准备回滚方案
升级步骤:
- 停止待升级节点
- 安装新版本
- 启动节点并验证
- 重复其他节点
7. 性能调优实战
7.1 写入性能优化
批量操作优化:
sql复制-- 不推荐
INSERT INTO table VALUES (1);
INSERT INTO table VALUES (2);
INSERT INTO table VALUES (3);
-- 推荐
INSERT INTO table VALUES (1),(2),(3);
事务大小控制:
- 将大事务拆分为多个小事务
- 设置合理的autocommit=1
参数调整:
ini复制innodb_flush_log_at_trx_commit=2
sync_binlog=0
wsrep_slave_threads=16
7.2 读取性能优化
读写分离:
- 将读操作路由到特定节点
- 使用ProxySQL实现自动分离
缓存策略:
ini复制query_cache_type=1
query_cache_size=256M
query_cache_limit=1M
索引优化:
- 定期分析慢查询
- 添加适当的复合索引
- 避免过度索引
7.3 网络延迟优化
压缩配置:
ini复制wsrep_provider_options="socket.checksum=1;
socket.ssl_cert=/path/to/cert.pem;
socket.ssl_key=/path/to/key.pem"
超时调整:
ini复制wsrep_provider_options="evs.inactive_check_period=PT0.3S;
evs.suspect_timeout=PT5S;
evs.inactive_timeout=PT15S"
8. 安全加固指南
8.1 认证与加密
SSL配置:
ini复制[mysqld]
ssl-ca=/etc/mysql/ca.pem
ssl-cert=/etc/mysql/server-cert.pem
ssl-key=/etc/mysql/server-key.pem
密码策略:
sql复制INSTALL PLUGIN simple_password_check SONAME 'simple_password_check.so';
SET GLOBAL simple_password_check_minimal_length=12;
SET GLOBAL simple_password_check_other_characters=1;
8.2 访问控制
最小权限原则:
sql复制CREATE USER 'appuser'@'%' IDENTIFIED BY '强密码';
GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'appuser'@'%';
网络隔离:
- 使用防火墙限制数据库端口访问
- 考虑使用VPC或私有网络
8.3 审计与监控
启用审计日志:
ini复制[mysqld]
plugin-load=server_audit=server_audit.so
server_audit_logging=ON
server_audit_events=CONNECT,QUERY,TABLE
server_audit_file_path=/var/log/mysql_audit.log
监控指标:
- 集群状态和节点健康
- 性能指标(CPU,内存,I/O,网络)
- 复制延迟和队列长度
- 错误和警告日志
9. 常见问题解决方案
9.1 性能问题排查
症状:写入速度慢
- 检查wsrep_local_recv_queue和wsrep_local_send_queue
- 增加wsrep_slave_threads
- 优化事务大小
症状:读性能差
- 检查索引使用情况
- 考虑添加从节点专门处理读请求
- 优化查询语句
9.2 稳定性问题处理
节点频繁脱离集群:
- 检查网络稳定性
- 调整超时参数
- 验证硬件健康状况
SST过程失败:
- 确保有足够的磁盘空间
- 验证认证信息
- 考虑使用不同的SST方法
9.3 数据不一致处理
检测不一致:
sql复制CHECKSUM TABLE tablename EXTENDED;
修复不一致:
- 识别不一致的表
- 从健康节点导出数据
- 在问题节点重新导入
- 验证修复结果
10. 扩展与未来规划
10.1 集群扩展策略
水平扩展:
- 添加新节点提高整体容量
- 确保网络带宽足够支持新增节点
垂直扩展:
- 升级现有节点硬件
- 优化配置参数
10.2 多数据中心部署
地理分布式集群:
- 考虑使用WAN优化设备
- 调整超时参数适应更高延迟
- 实现分片减轻跨数据中心流量
10.3 新技术整合
云原生部署:
- 容器化部署方案
- Kubernetes Operator管理
- 自动扩展策略
新存储引擎:
- 评估MyRocks等替代引擎
- 测试与Galera的兼容性
- 性能基准测试