Linux MariaDB 高可用方案与落地步骤
一、方案选型与适用场景
- MariaDB Galera Cluster(多主同步复制):同一时刻多节点可写,自动节点加入/故障恢复,适合需要高写入并发与自动故障转移的业务。依赖 wsrep 复制接口与 Galera 提供者。
- 主从复制 + Keepalived/Heartbeat + 虚拟IP:读写分离或主备切换,应用通过 VIP 访问,切换由 Keepalived/Heartbeat 完成,适合读多写少或已有主从架构的平滑升级。
- DRBD + Heartbeat(双主活动-被动共享存储):两节点共享同一块块设备,数据强一致,故障切换时 VIP 漂移到备机,适合写入一致性要求高且能接受双机限制的场景。
二、方案一 MariaDB Galera Cluster 多主同步(推荐)
- 规划与准备
- 至少 3 节点(生产建议奇数),各节点时间同步(如 chrony),主机名可解析,网络低时延稳定。
- 开放端口:3306/TCP(客户端/备份)、4567/TCP+UDP(复制)、4568/TCP(IST)、4444/TCP(SST)。示例(firewalld):
firewall-cmd --permanent --add-port={3306,4567,4568,4444}/tcp
firewall-cmd --permanent --add-port=4567/udp && firewall-cmd --reload
- 安装 Galera 组件(RHEL/CentOS 8 示例)
- 安装模块:yum module install mariadb:10.3/galera(包含 mariadb-server-galera、mariadb-server、galera)
- 配置 /etc/my.cnf.d/galera.cnf(所有节点)
- 建议将通用配置集中到 galera.cnf,示例关键项:
[mysqld]
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_name=“prod_galera”
wsrep_node_name=“node1”
wsrep_node_address=“10.0.0.11”
wsrep_cluster_address=“gcomm://10.0.0.11,10.0.0.12,10.0.0.13”
binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
innodb_flush_log_at_trx_commit=1
wsrep_sst_method=rsync
bind-address=0.0.0.0
- 说明:Galera 仅支持事务引擎(如 InnoDB),不支持 MyISAM;bind-address 不能为 127.0.0.1。
- 引导集群与加入节点
- 在第一个节点执行:galera_new_cluster(或 galera_new_cluster mariadb@node1),确保以“新集群”方式启动。
- 在其他节点执行:systemctl start mariadb,自动连接并同步状态。
- 验证
- 在任一节点执行:
SHOW STATUS LIKE ‘wsrep_ready’;(应为 ON)
SHOW STATUS LIKE ‘wsrep_cluster_size’;(应等于节点数)
SHOW STATUS LIKE ‘wsrep_cluster_status’;(应为 Primary)
CREATE DATABASE IF NOT EXISTS ha_test; 在其他节点 SHOW DATABASES; 验证一致性。
三、方案二 主从复制 + Keepalived 高可用(读写分离/主备)
- 架构要点
- 两节点互为主从(或一主一从),应用通过 VIP 访问数据库;Keepalived 提供 VRRP 与健康检查,主机故障自动切换 VIP。
- 数据库配置(示例)
- /etc/mysql/mariadb.conf.d/50-server.cnf(两台均需修改 server-id):
bind-address=0.0.0.0
server-id=1(主)/ server-id=2(从)
log_bin=/var/log/mysql/mysql-bin.log
expire_logs_days=10
- 主库创建复制用户并导出初始数据:
CREATE USER ‘repl’@‘%’ IDENTIFIED BY ‘ReplPass!’;
GRANT REPLICATION SLAVE ON . TO ‘repl’@‘%’;
FLUSH PRIVILEGES;
mysqldump --single-transaction --master-data=2 --routines --triggers --all-databases > backup.sql
- 从库导入并启动复制:
mysql < backup.sql
CHANGE MASTER TO MASTER_HOST=‘主库IP’, MASTER_USER=‘repl’, MASTER_PASSWORD=‘ReplPass!’, MASTER_LOG_FILE=‘mysql-bin.000001’, MASTER_LOG_POS=xxx;
START SLAVE;
- Keepalived 要点(两台)
- 安装:apt-get install keepalived -y(或 yum install keepalived -y)
- 配置思路:
- 定义 VIP(如 192.168.100.100/24)与网卡(如 eth0)。
- 健康检查脚本检测本机 3306 端口或执行简单 SQL(如 SELECT 1)。
- 优先级(priority)高的为主,state 分别为 MASTER/BACKUP,nopreempt 视切换策略而定。
- 验证:停止主库或关闭 3306,观察 VIP 漂移到备库,应用无感切换。
四、方案三 DRBD + Heartbeat 双主共享存储(强一致)
- 适用与组件
- 两节点共享同一块块设备(如 /dev/sdb1),通过 DRBD 实时镜像;Heartbeat 负责心跳与健康检查并管理 VIP 与 MariaDB 服务切换。
- 实施要点
- 准备:两块未分区磁盘(/dev/sdb),配置 /etc/hosts 或 DNS 解析,双网卡(业务/心跳)。
- DRBD:创建资源(如 r0),在两端分区并初始化,设置主从(或双主谨慎模式),同步完成后挂载到 MariaDB 数据目录。
- MariaDB:配置 datadir 指向 DRBD 挂载点,确保仅在一个节点写入(避免脑裂)。
- Heartbeat:配置 ha.cf、authkeys、haresources(包含 VIP、DRBD 资源、mariadb 服务),启动服务后验证故障切换。
五、通用加固与运维要点
- 安全与网络
- 仅开放必要端口(见上文),限制来源网段;数据库账户最小权限;开启 SSL 加密复制与客户端连接(如 require_secure_transport=ON)。
- 数据与一致性
- Galera 场景建议:innodb_flush_log_at_trx_commit=1、sync_binlog=1、wsrep_sync_wait=1(关键事务强一致);SST 选用 rsync 或 mariabackup,定期校验备份。
- 监控与演练
- 监控项:wsrep_ready、wsrep_cluster_size、复制延迟、连接数、慢查询、VIP 漂移状态;定期故障演练与备份恢复演练。
- 升级与变更
- 遵循滚动升级(先备后主)、变更窗口、回滚预案;Galera 版本一致性与参数一致性检查。