在 Ubuntu 上实现 MariaDB 高可用的三种主流方案
方案一 主从复制配合 Keepalived VIP 切换
- 适用场景:读多写少、可接受异步复制的主从架构,通过 Keepalived 提供 VIP 自动漂移,应用侧无需改造连接地址。
- 核心思路:两台 MariaDB 配置为互为主从(双主),Keepalived 监控本机 3306 并在主机故障时将 VIP 漂移到备机。
- 关键配置与步骤(两台均执行基础安装与加固):
- 安装 MariaDB:sudo apt-get install mariadb-server -y
- 修改配置(/etc/mysql/mariadb.conf.d/50-server.cnf):
- bind-address = 0.0.0.0
- server-id = 1/2(两台不同)
- log_bin = /var/log/mysql/mysql-bin.log
- expire_logs_days = 10
- 创建复制用户并授权(主从互建):
- CREATE USER ‘replicator’@‘%’ IDENTIFIED BY ‘YourPass’;
- GRANT REPLICATION SLAVE ON . TO ‘replicator’@‘%’; FLUSH PRIVILEGES;
- 初始化复制(在从库执行,使用 SHOW MASTER STATUS 的 File/Position):
- CHANGE MASTER TO MASTER_HOST=‘对端IP’, MASTER_USER=‘replicator’, MASTER_PASSWORD=‘YourPass’, MASTER_LOG_FILE=‘…’, MASTER_LOG_POS=…;
- START SLAVE;
- 验证:SHOW SLAVE STATUS\G 中 Slave_IO_Running/Slave_SQL_Running 均为 Yes。
- 安装与配置 Keepalived(两台):
- 监控脚本示例(/usr/local/bin/check_mysql.sh):
#!/usr/bin/env bash
mysqladmin --connect-timeout=3 ping &>/dev/null || exit 1
- keepalived.conf 关键片段:
vrrp_script chk_mysql { script “/usr/local/bin/check_mysql.sh” interval 2 fall 2 rise 2 }
vrrp_instance VI_1 {
state MASTER/BACKUP; interface eth0; virtual_router_id 51; priority 100/90;
advert_int 1; unicast_src_ip 本机IP; unicast_peer { 对端IP }
virtual_ipaddress { 192.168.1.100/24 }
track_script { chk_mysql }
}
- 测试:停止主库或关闭 3306,观察 VIP 漂移与业务恢复。
- 优点:部署简单、成本低;缺点:异步复制存在数据延迟/丢失风险,需应用容忍或配合半同步。
方案二 MariaDB Galera Cluster 多主同步
- 适用场景:需要多主写入、强一致(最终一致)、自动节点故障切换的 3+ 节点集群。
- 核心思路:基于 Galera 的同步多主复制,任意节点可读写,节点加入/退出自动同步。
- 关键配置与步骤(所有节点):
- 安装 MariaDB(建议 10.1+):sudo apt-get install mariadb-server mariadb-client -y
- 编辑 /etc/mysql/mariadb.conf.d/50-server.cnf([mysqld] 段):
- bind-address = 0.0.0.0
- server-id = 唯一ID
- wsrep_on = ON
- wsrep_provider = /usr/lib/galera/libgalera_smm.so
- wsrep_cluster_address = gcomm://IP1,IP2,IP3
- wsrep_node_address = 本机IP;wsrep_node_name = 本机名
- wsrep_sst_method = xtrabackup-v2(需提前创建 SST 账号)
- binlog_format = ROW;default_storage_engine = InnoDB
- innodb_autoinc_lock_mode = 2
- 创建 SST 用户(任一节点执行一次即可):
- CREATE USER ‘sst_user’@‘%’ IDENTIFIED BY ‘SSTPass’;
- GRANT ALL PRIVILEGES ON . TO ‘sst_user’@‘%’; FLUSH PRIVILEGES;
- 初始化集群:在第一个节点执行(仅首次)
- sudo mysql -u root -p -e “SET GLOBAL wsrep_cluster_address=‘gcomm://’;”
- sudo systemctl start mariadb
- 加入其他节点:
- 确保 wsrep_cluster_address 指向完整节点列表;
- sudo systemctl start mariadb
- 验证:
- SHOW STATUS LIKE ‘wsrep_ready’;(应为 ON)
- SHOW STATUS LIKE ‘wsrep_cluster_size’;(应等于节点数)
- 在任一节点建库/表,其他节点立即可见。
- 端口要求:开放 3306(MySQL)、4567(Galera 通信)、4568(IST)、4444(SST)。
- 优点:多主、强一致、自动故障切换;缺点:写放大、对网络质量敏感、需奇数节点或仲裁。
方案三 Heartbeat + DRBD 共享存储主备
- 适用场景:已有或可接受共享块存储的 主备 架构,追求接近零数据丢失的切换。
- 核心思路:DRBD 将块设备实时镜像到备机,Heartbeat 管理 VIP 与 MariaDB 资源的启停与切换。
- 关键配置与步骤(两台):
- 准备:两块服务器各新增一块磁盘(如 /dev/sdb),配置 /etc/hosts 主机名解析。
- 安装组件:sudo apt-get install drbd8-utils heartbeat -y
- 配置 DRBD(/etc/drbd.d/r0.res):
- resource r0 { protocol C; device /dev/drbd0; disk /dev/sdb1;
on node1 { address IP1:7789; meta-disk internal; }
on node2 { address IP2:7789; meta-disk internal; }
syncer { rate 100M; } net { cram-hmac-alg sha1; shared-secret “YourSecret”; } }
- 初始化并提升主节点:
- drbdadm create-md r0;systemctl restart drbd
- 在主机:drbdadm primary r0;mkfs.ext4 /dev/drbd0;mkdir -p /var/lib/mysql
- 配置 Heartbeat(/etc/ha.d/ha.cf、/etc/ha.d/haresources、/etc/ha.d/authkeys):
- haresources 示例:
node1 192.168.1.100/24 drbddisk::r0 Filesystem::/dev/drbd0::/var/lib/mysql::ext4::noatime mysql
- authkeys 设置共享密钥;ha.cf 配置心跳接口与节点。
- 验证:
- cat /proc/drbd 应见 Primary/Secondary 与同步进度;
- ip addr 应仅在主机看到 VIP;
- 停止主机 heartbeat,备机应自动接管 VIP 并挂载 DRBD、启动 MariaDB。
- 优点:数据一致性高、切换可控;缺点:架构复杂、对共享存储依赖强、扩容不便。
方案对比与选型建议
| 方案 |
写入模式 |
故障切换 |
一致性 |
最少节点 |
端口/依赖 |
典型场景 |
| 主从 + Keepalived |
主写从读(可双主) |
VIP 漂移 |
最终一致 |
2 |
3306 + Keepalived |
读多写少、成本敏感 |
| Galera Cluster |
多主 |
自动 |
强一致(最终一致) |
3(建议奇数) |
3306/4567/4568/4444 |
高并发、多主写入 |
| Heartbeat + DRBD |
主写备读 |
自动 |
接近零丢失 |
2 |
DRBD 7789 + Heartbeat |
强一致、传统主备 |
- 选型要点:
- 追求多主写入与自动容错,选 Galera。
- 以成本与易用为先,且能接受异步,选 主从 + Keepalived。
- 已有SAN/DRBD 等共享存储,且要求最小数据丢失,选 Heartbeat + DRBD。
通用部署与运维要点
- 基础加固:
- 仅开放必要端口(如 3306/4567/4568/4444);
- 使用强口令与最小权限账户;执行 mysql_secure_installation;
- 开启错误日志与慢查询日志,配置合理的备份策略(物理/逻辑)。
- 复制/集群健康检查:
- 主从:SHOW SLAVE STATUS\G 检查 Slave_IO_Running/Slave_SQL_Running=Yes;
- Galera:SHOW STATUS LIKE ‘wsrep_ready’; 与 wsrep_cluster_size;
- Keepalived:定期自检脚本与 VRRP 状态;
- DRBD:cat /proc/drbd 与同步进度。
- 切换演练:定期在测试环境模拟主库宕机、网络分区、磁盘故障,验证 VIP 漂移、数据一致性与恢复时间。
- 监控告警:对复制延迟、连接数、线程、磁盘 IO、VIP 绑定状态等关键指标设置阈值告警。