在Linux系统上配置高可用数据库集群,核心目标是消除单数据库节点的单点故障风险,当主节点出现故障时,集群可以自动切换到备用节点,保证业务对数据库的访问不中断。常见的高可用方案有基于Keepalived+MySQL的主从切换方案,也有基于Pacemaker+Corosync的复杂集群方案,本文以更常用的Keepalived+双主MySQL方案为例展开说明。
前置准备
本次配置需要两台Linux服务器,系统版本建议为CentOS 7及以上,提前关闭防火墙和SELinux,保证两台服务器之间网络互通。需要准备的软件版本如下:
- MySQL 8.0及以上版本
- Keepalived 2.0及以上版本
两台服务器的IP规划如下:
| 节点角色 | 服务器IP | 虚拟IP(VIP) |
|---|---|---|
| 主节点 | 192.168.0.10 | 192.168.0.100 |
| 备节点 | 192.168.0.11 |
MySQL双主配置
首先在两台服务器上安装MySQL,安装完成后修改MySQL配置文件my.cnf,开启二进制日志和自增ID偏移,避免双主写入时的主键冲突。
主节点配置
编辑/etc/my.cnf文件,添加以下配置:
[mysqld] # 服务器唯一ID,两台节点不能相同 server-id=1 # 开启二进制日志 log-bin=mysql-bin # 自增ID起始值 auto_increment_increment=2 auto_increment_offset=1 # 需要同步的数据库,按需修改 binlog-do-db=test_db # 忽略同步的数据库 binlog-ignore-db=mysql binlog-ignore-db=information_schema binlog-ignore-db=performance_schema
重启MySQL服务后,登录MySQL执行以下命令,创建用于主从同步的用户:
-- 创建同步用户,允许备节点IP访问 CREATE USER 'repl'@'192.168.0.11' IDENTIFIED BY 'Repl@123456'; -- 授予同步权限 GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.0.11'; -- 刷新权限 FLUSH PRIVILEGES; -- 查看主节点状态,记录File和Position值 SHOW MASTER STATUS;
备节点配置
备节点的my.cnf配置和主节点类似,仅修改server-id和auto_increment_offset:
[mysqld] server-id=2 log-bin=mysql-bin auto_increment_increment=2 auto_increment_offset=2 binlog-do-db=test_db binlog-ignore-db=mysql binlog-ignore-db=information_schema binlog-ignore-db=performance_schema
重启备节点MySQL服务后,登录MySQL执行同步命令,其中master_log_file和master_log_pos填写主节点SHOW MASTER STATUS输出的对应值:
-- 配置主节点信息 CHANGE MASTER TO MASTER_HOST='192.168.0.10', MASTER_USER='repl', MASTER_PASSWORD='Repl@123456', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=156; -- 启动同步 START SLAVE; -- 查看同步状态,确保Slave_IO_Running和Slave_SQL_Running都是Yes SHOW SLAVE STATUSG;
同步配置完成后,再在备节点上执行主节点创建同步用户的操作,主节点也配置同步备节点的二进制日志,实现双主互相同步。
Keepalived配置
Keepalived的作用是管理虚拟IP,监控MySQL服务状态,当主节点MySQL故障时自动将VIP漂移到备节点。
主节点Keepalived配置
安装Keepalived后,编辑/etc/keepalived/keepalived.conf文件:
global_defs {
router_id mysql_ha_1
}
vrrp_script chk_mysql {
# 检查MySQL服务存活的脚本路径
script "/etc/keepalived/chk_mysql.sh"
# 每2秒检查一次
interval 2
# 检查失败权重减50
weight -50
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.100/24
}
track_script {
chk_mysql
}
}
创建MySQL服务检查脚本/etc/keepalived/chk_mysql.sh:
#!/bin/bash
# 检查MySQL进程是否存在
count=$(ps -ef | grep mysql | grep -v grep | wc -l)
if [ $count -eq 0 ]; then
# 进程不存在则停止Keepalived,触发VIP漂移
systemctl stop keepalived
fi
给脚本添加执行权限:
chmod +x /etc/keepalived/chk_mysql.sh
备节点Keepalived配置
备节点的Keepalived配置和主节点类似,修改router_id、state和priority即可:
global_defs {
router_id mysql_ha_2
}
vrrp_script chk_mysql {
script "/etc/keepalived/chk_mysql.sh"
interval 2
weight -50
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.100/24
}
track_script {
chk_mysql
}
}
备节点同样创建chk_mysql.sh脚本并添加执行权限,之后启动两台节点的Keepalived服务。
集群验证
验证集群是否正常工作可以按照以下步骤操作:
- 在主节点执行
ip addr show eth0,可以看到VIP 192.168.0.100已经绑定到主节点网卡上 - 使用客户端连接VIP的MySQL服务,执行写入操作,数据会同步到两个节点
- 手动停止主节点的MySQL服务,等待2秒后查看备节点的网卡,VIP已经漂移到备节点,客户端连接VIP仍然可以正常访问数据库
- 恢复主节点的MySQL和Keepalived服务后,VIP会回到主节点,集群恢复正常状态
常见问题排查
如果集群切换失败,可以先检查以下几点:
- 两台服务器的防火墙是否关闭,或者是否放通了VRRP协议(协议号112)的流量
- MySQL同步状态是否正常,是否存在同步延迟或中断的情况
- Keepalived的检查脚本是否有执行权限,脚本逻辑是否正确
- 两台节点的
virtual_router_id和认证密码是否一致
注意:生产环境中建议结合数据备份策略使用,同时可以根据业务需求选择Pacemaker+Corosync等更复杂的集群方案,实现更精细的资源管理。
Linux高可用数据库集群MySQLKeepalivedPacemaker修改时间:2026-07-20 20:45:45