使用mysql主从热备+keepalived服务+ipvsadm工具来实现mysql高可用主备+负载均衡
一、背景与问题
在现代分布式系统中,数据库的高可用性是保障业务连续性的核心要素。传统单点MySQL部署存在以下风险:
- 主库宕机导致服务中断
- 网络波动引发的连接失败
- 硬件故障引发的数据丢失
为解决这些问题,需要构建一个包含以下特性的高可用架构:
- 自动故障转移:在主库故障时自动切换到从库
- 负载均衡:分担读写压力,提高系统吞吐量
- 数据一致性:保证主从数据实时同步
- 可扩展性:支持横向扩展
本方案采用MySQL主从热备+Keepalived虚拟IP+IPVS负载均衡的组合,实现上述目标。以下是完整的实现方案。
二、基本原理
1. MySQL主从复制原理
MySQL主从复制通过binlog实现数据同步:
- 主库将事务记录到binlog文件
- 从库通过I/O线程读取binlog并保存到中继日志
- SQL线程将中继日志应用到从库
关键配置参数:
# 主库配置
server-id=1
log-bin=mysql-bin
binlog-format=row
sync-binlog=1
# 从库配置
server-id=2
relay-log=mysql-relay
relay-log-index=mysql-relay.index2. Keepalived虚拟IP原理
Keepalived通过VRRP协议实现虚拟IP漂移:
- 虚拟IP(VIP)绑定在物理服务器上
- 通过检查MySQL服务状态决定VIP归属
- 在主库故障时自动将VIP转移到从库
3. IPVS负载均衡原理
IPVS基于Linux内核的IP虚拟服务器实现四层负载均衡:
- 通过iptables规则将流量分发到后端服务器
- 支持多种调度算法(NAT、DR、TUN等)
三、环境准备
系统要求
| 组件 | 版本 | 系统 |
|---|---|---|
| MySQL | 8.0.31 | CentOS 7 |
| Keepalived | 2.1.5 | CentOS 7 |
| IPVSadm | 1.29 | CentOS 7 |
网络规划
| 节点类型 | IP地址 | 角色 |
|---|---|---|
| 主库 | 192.168.1.10 | 主库 + 负载均衡 |
| 从库 | 192.168.1.11 | 从库 |
| VIP | 192.168.1.20 | 虚拟IP |
四、核心实现
1. MySQL主从配置
主库配置文件(my.cnf)
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-format=row
sync-binlog=1
innodb_flush_log_at_trx_commit=1从库配置文件(my.cnf)
[mysqld]
server-id=2
relay-log=mysql-relay
relay-log-index=mysql-relay.index创建复制用户
-- 主库执行
CREATE USER 'repl'@'%' IDENTIFIED BY 'ReplPass123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;启动复制
# 从库执行
CHANGE MASTER TO
MASTER_HOST='192.168.1.10',
MASTER_USER='repl',
MASTER_PASSWORD='ReplPass123!',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=4;
START SLAVE;2. Keepalived配置
Keepalived配置文件(keepalived.conf)
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
nopreempt
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.1.20
}
track_script {
check_mysql
}
}
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
nopreempt
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.1.20
}
track_script {
check_mysql
}
}
track_script {
check_mysql {
shell "/etc/keepalived/check_mysql.sh"
fall 2
rise 2
}
}检查脚本(check_mysql.sh)
#!/bin/bash
# 检查主库是否存活
if mysql -h 192.168.1.10 -u repl -pReplPass123 -e "SHOW SLAVE STATUS\G" | grep -q "Slave_IO_Running: Yes"; then
exit 0
else
exit 1
fi3. IPVS负载均衡配置
创建IPVS虚拟服务器
# 创建NAT类型的虚拟服务器
ipvsadm -A -t 192.168.1.20:3306 -s rr
# 添加后端服务器
ipvsadm -a -t 192.168.1.20:3306 -r 192.168.1.10:3306 -g
ipvsadm -a -t 192.168.1.20:3306 -r 192.168.1.11:3306 -g五、完整案例
部署步骤
安装软件包
yum install -y mariadb-server keepalived ipvsadm配置MySQL主从
# 主库配置 cp /etc/my.cnf /etc/my.cnf.bak vim /etc/my.cnf
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-format=row
sync-binlog=1
innodb_flush_log_at_trx_commit=1# 启动MySQL服务
systemctl start mysqld# 从库配置
cp /etc/my.cnf /etc/my.cnf.bak
vim /etc/my.cnf[mysqld]
server-id=2
relay-log=mysql-relay
relay-log-index=mysql-relay.index# 启动MySQL服务
systemctl start mysqld配置Keepalived
vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
nopreempt
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.1.20
}
track_script {
check_mysql
}
}# 创建检查脚本
vim /etc/keepalived/check_mysql.sh#!/bin/bash
# 检查主库是否存活
if mysql -h 192.168.1.10 -u repl -pReplPass123 -e "SHOW SLAVE STATUS\G" | grep -q "Slave_IO_Running: Yes"; then
exit 0
else
exit 1
fi# 设置脚本可执行
chmod +x /etc/keepalived/check_mysql.sh配置IPVS
# 创建虚拟服务器 ipvsadm -A -t 192.168.1.20:3306 -s rr # 添加后端服务器 ipvsadm -a -t 192.168.1.20:3306 -r 192.168.1.10:3306 -g ipvsadm -a -t 192.168.1.20:3306 -r 192.168.1.11:3306 -g启动服务
systemctl start keepalived systemctl enable keepalived
六、源码解析
1. Keepalived虚拟IP切换机制
Keepalived通过VRRP协议实现虚拟IP的动态绑定:
- 优先级(priority)决定VIP归属
- 检查脚本(check_mysql.sh)用于健康检查
- 当主库故障时,从库会接管VIP
2. IPVS负载均衡算法
IPVS支持多种调度算法:
- 轮询(rr):均匀分发请求
- 加权轮询(wrr):按权重分配
- 最少连接(lc):选择当前连接最少的服务器
3. MySQL主从同步状态检查
mysql -h 192.168.1.10 -u repl -pReplPass123 -e "SHOW SLAVE STATUS\G"关键字段:
Slave_IO_Running: I/O线程状态Slave_SQL_Running: SQL线程状态Seconds_Behind_Master: 延迟时间(单位:秒)
七、进阶使用
1. 动态扩缩容
可以动态添加从库节点:
# 添加新从库节点
ipvsadm -a -t 192.168.1.20:3306 -r 192.168.1.12:3306 -g2. 增强监控
通过Prometheus+Grafana实现可视化监控:
# Prometheus配置示例
scrape_configs:
- job_name: 'mysql'
static_configs:
- targets: ['192.168.1.10:9104', '192.168.1.11:9104']3. 安全加固
- 使用SSL加密主从通信
- 配置防火墙规则限制访问
- 定期审计日志
八、性能与工程实践
1. 性能调优
| 优化项 | 建议值 | 说明 |
|---|---|---|
| innodb_buffer_pool_size | 系统内存的70%-80% | 提高缓存命中率 |
| query_cache_type | OFF | 8.0后已弃用,建议关闭 |
| sync_binlog | 1 | 确保事务立即写入磁盘 |
| innodb_flush_log_at_trx_commit | 1 | 保证事务完整性 |
2. 异常处理
- 主库故障时,Keepalived会触发VIP漂移
- IPVS会自动将流量切换到从库
- 建议配置自动切换机制
3. 安全防护
- 使用SSL加密主从通信
- 配置访问控制列表(ACL)
- 定期更新密码策略
九、常见问题与踩坑
1. 主从同步延迟
错误示例:
SHOW SLAVE STATUS\G输出:
Seconds_Behind_Master: 120解决办法:
- 检查网络延迟
- 调整
innodb_flush_log_at_trx_commit参数 - 增加从库硬件性能
2. VIP绑定失败
错误日志:
Keepalived: VRRP_Instance(VI_1) Transition to MASTER state解决办法:
- 检查防火墙规则
- 确保物理网络连通性
- 检查keepalived配置文件语法
3. IPVS配置错误
错误示例:
ipvsadm -L -n输出:
IPVS:
- Prots: TCP
- Scheduler: wrr
- Destinations: 0解决办法:
- 检查ipvsadm配置命令
- 使用
ipvsadm -C清除配置 - 重新添加后端服务器
十、最佳实践
1. 高可用配置建议
- 使用至少3个从库节点
- 配置监控告警系统
- 定期进行故障转移演练
- 保持主从版本一致性
2. 安全建议
- 使用SSL加密主从通信
- 配置访问控制列表
- 定期审计日志
- 使用强密码策略
3. 性能优化建议
- 使用读写分离架构
- 启用连接池
- 调整缓冲池大小
- 使用缓存中间件
十一、总结
通过MySQL主从热备+Keepalived虚拟IP+IPVS负载均衡的组合,可以构建一个高可用、高扩展性的MySQL架构。这种方案特别适用于需要处理大量读写请求的场景,如电商系统、大数据平台等。
但需要注意:
- 该方案不适合对数据一致性要求极高的场景
- 不适合对延迟敏感的应用
- 需要定期维护和监控
在实际项目中,建议结合具体业务需求进行调整。对于需要强一致性场景,可以考虑使用MySQL Cluster或分布式数据库方案。对于需要高可用但不追求负载均衡的场景,可以使用MySQL主从+Keepalived的方案。