在Linux系统上搭建高可用数据库集群,核心目标是避免单节点故障导致数据库服务中断,常用的方案结合数据库主从复制与高可用组件实现,本文以MySQL数据库、Keepalived组件为例,演示完整的配置过程。

环境准备
本次配置使用两台Linux服务器,系统版本为CentOS 7,节点信息如下:
| 节点角色 | IP地址 | 安装软件 |
|---|---|---|
| 主数据库节点 | 192.168.0.101 | MySQL 8.0、Keepalived |
| 从数据库节点 | 192.168.0.102 | MySQL 8.0、Keepalived |
首先在两个节点上关闭防火墙和SELinux,避免端口拦截影响集群通信:
# 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 临时关闭SELinux setenforce 0 # 永久关闭SELinux,编辑配置文件将SELINUX设置为disabled sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
配置MySQL主从复制
主节点配置
编辑主节点的MySQL配置文件/etc/my.cnf,添加以下配置:
[mysqld] # 服务器唯一ID,主从节点不能重复 server-id=1 # 开启二进制日志,用于主从同步 log-bin=mysql-bin # 二进制日志格式,推荐使用ROW binlog_format=ROW # 需要同步的数据库,可根据需求调整 binlog-do-db=test_db
重启MySQL服务,登录数据库创建用于主从同步的账号并授权:
-- 重启MySQL服务 systemctl restart mysqld -- 登录数据库 mysql -u root -p -- 创建同步账号 CREATE USER 'repl'@'192.168.0.%' IDENTIFIED BY 'Repl@123456'; -- 授予同步权限 GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.0.%'; -- 刷新权限 FLUSH PRIVILEGES; -- 查看主节点二进制日志状态,记录File和Position值 SHOW MASTER STATUS;
从节点配置
编辑从节点的MySQL配置文件/etc/my.cnf,添加以下配置:
[mysqld] # 服务器唯一ID,与主节点不同 server-id=2 # 开启中继日志 relay-log=mysql-relay # 需要同步的数据库,与主节点一致 replicate-do-db=test_db
重启MySQL服务,登录数据库配置主从同步参数并启动同步:
-- 重启MySQL服务 systemctl restart mysqld -- 登录数据库 mysql -u root -p -- 配置主节点信息,替换为实际的主节点IP、同步账号、二进制日志File和Position值 CHANGE MASTER TO MASTER_HOST='192.168.0.101', 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通过VRRP协议实现虚拟IP(VIP)的漂移,当主节点故障时,VIP自动切换到从节点,保证服务访问地址不变。
安装Keepalived
两个节点都执行以下命令安装Keepalived:
yum install -y keepalived
主节点Keepalived配置
编辑主节点的Keepalived配置文件/etc/keepalived/keepalived.conf,内容如下:
global_defs {
# 通知邮件配置,按需调整
notification_email {
admin@ipipp.com
}
notification_email_from keepalived@ipipp.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
# 路由标识,唯一即可
router_id db_ha_1
}
vrrp_instance VI_1 {
# 角色为MASTER
state MASTER
# 绑定的网卡,根据实际网卡名称调整,如eth0
interface eth0
# 虚拟路由ID,主从节点保持一致
virtual_router_id 51
# 优先级,主节点高于从节点
priority 100
# VRRP通告间隔
advert_int 1
# 认证配置
authentication {
auth_type PASS
auth_pass 1111
}
# 虚拟IP地址,可配置多个
virtual_ipaddress {
192.168.0.100/24
}
}
# 健康检查配置,检测MySQL服务状态
virtual_server 192.168.0.100 3306 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 192.168.0.101 3306 {
weight 1
# MySQL服务健康检查脚本
MISC_CHECK {
misc_path "/etc/keepalived/check_mysql.sh"
misc_timeout 5
}
}
}
创建MySQL健康检查脚本/etc/keepalived/check_mysql.sh,内容如下:
#!/bin/bash
# 检查MySQL服务是否正常运行
mysql -u root -p'Root@123456' -e "SELECT 1;" > /dev/null 2>&1
if [ $? -eq 0 ]; then
exit 0
else
exit 1
fi
给脚本添加执行权限:
chmod +x /etc/keepalived/check_mysql.sh
从节点Keepalived配置
编辑从节点的Keepalived配置文件/etc/keepalived/keepalived.conf,内容如下:
global_defs {
notification_email {
admin@ipipp.com
}
notification_email_from keepalived@ipipp.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id db_ha_2
}
vrrp_instance VI_1 {
# 角色为BACKUP
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
}
}
virtual_server 192.168.0.100 3306 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 192.168.0.102 3306 {
weight 1
MISC_CHECK {
misc_path "/etc/keepalived/check_mysql.sh"
misc_timeout 5
}
}
}
从节点的健康检查脚本与主节点一致,创建后添加执行权限即可。
启动Keepalived服务
两个节点都启动Keepalived并设置开机自启:
systemctl start keepalived systemctl enable keepalived
集群验证
首先在主节点查看VIP是否绑定成功:
ip addr show eth0
可以看到192.168.0.100的VIP已经绑定到主节点的网卡上。然后通过VIP连接数据库,创建测试数据:
-- 通过VIP连接数据库 mysql -h 192.168.0.100 -u root -p -- 创建测试数据库和表 CREATE DATABASE test_db; USE test_db; CREATE TABLE user_info (id INT PRIMARY KEY, name VARCHAR(50)); INSERT INTO user_info VALUES (1, 'test_user');
到从节点查看数据是否同步成功:
mysql -u root -p USE test_db; SELECT * FROM user_info;
可以看到数据已经同步到从节点。接下来模拟主节点故障,关闭主节点的MySQL服务:
systemctl stop mysqld
此时查看从节点的网卡信息,会发现VIP已经漂移到从节点,再次通过VIP连接数据库,仍然可以正常访问数据,说明高可用切换成功。当主节点恢复后,重新启动MySQL和Keepalived服务,VIP会根据优先级重新回到主节点,集群恢复正常状态。
Linux数据库集群高可用MySQLKeepalived修改时间:2026-06-13 12:15:28