MYSQL双主双从,使用Keepalived双机热备+LVS高可用群集
'# MYSQL双主双从,使用Keepalived双机热备+LVS高可用群集
一、背景与问题
在分布式系统中,数据库的高可用性是保障业务连续性的核心要素。传统单点MySQL架构存在单点故障风险,一旦主库宕机,业务将完全中断。而双主双从架构通过主从复制和热备机制,结合LVS负载均衡,可以构建一个具备自动故障转移、负载均衡和数据冗余的高可用数据库集群。
本方案适用于对数据一致性要求高、业务吞吐量大的核心系统,例如电商平台的订单系统、金融系统的交易引擎等。但该方案不适合对实时性要求极高的场景(如实时交易系统),也不适合数据量极小的轻量级应用。
二、基本原理
1. MySQL双主双从架构
MySQL双主双从架构包含两个主库(Master)和两个从库(Slave),形成环形拓扑结构:
Master1 ←→ Slave1
↑ ↓
Master2 ←→ Slave2- 主主复制(Master-Master Replication):两个主库相互复制对方的数据变更,实现双向同步
- 主从复制(Master-Slave Replication):每个主库同时作为另一个主库的从库,形成冗余
2. Keepalived双机热备
Keepalived通过VRRP协议实现虚拟IP(VIP)的自动切换,核心机制包括:
- VRRP协议:通过多播协议实现主备节点状态同步
- 健康检查:定期检测后端MySQL服务的可用性
- VIP切换:当主节点故障时,VIP自动漂移到备节点
3. LVS负载均衡
LVS(Linux Virtual Server)通过三种调度算法(NAT、TUN、IPVS)实现请求分发:
- NAT模式:将请求封装后发送到后端服务器,适用于内网环境
- TUN模式:通过IP隧道技术实现跨网络负载均衡
- IPVS:基于Linux内核的高性能负载均衡实现
三、环境准备
系统要求
| 组件 | 服务器配置 | 系统版本 |
|---|---|---|
| MySQL | 2核4G | CentOS 7.9 |
| Keepalived | 2核4G | CentOS 7.9 |
| LVS | 2核4G | CentOS 7.9 |
| 网络 | 10.0.0.0/24 |
软件依赖
# 安装必要软件
sudo yum install -y mariadb-server keepalived lvsadm ipvsadm四、核心实现
1. MySQL双主双从配置
1.1 主库配置(Master1)
# 修改MySQL配置文件
sudo vi /etc/my.cnf.d/master.cnf
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-format=ROW
sync-binlog=1
innodb_flush_log_at_trx_commit=1# 创建复制用户
mysql -u root -p
CREATE USER 'repl'@'%' IDENTIFIED BY 'repl_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;1.2 从库配置(Slave1)
# 修改MySQL配置文件
sudo vi /etc/my.cnf.d/slave.cnf
[mysqld]
server-id=2
relay-log=mysql-relay
relay-log-index=mysql-relay.index# 配置主库信息
CHANGE MASTER TO
MASTER_HOST='10.0.0.101',
MASTER_USER='repl',
MASTER_PASSWORD='repl_password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=4;
START SLAVE;1.3 主库间复制配置(Master1→Master2)
# 在Master1上创建复制用户
CREATE USER 'repl'@'10.0.0.102' IDENTIFIED BY 'repl_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.0.0.102';
FLUSH PRIVILEGES;# 在Master2上配置主库信息
CHANGE MASTER TO
MASTER_HOST='10.0.0.101',
MASTER_USER='repl',
MASTER_PASSWORD='repl_password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=4;
START SLAVE;2. Keepalived配置
# 主节点配置(VIP: 10.0.0.100)
sudo vi /etc/keepalived/keepalived.conf
global_defs {
router_id LVS-1
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
10.0.0.100
}
}
virtual_server {
delay_loop 2
lb_algo rr
lb_kind NAT
persistence_timeout 0
protocol TCP
real_server 10.0.0.101 3306 {
weight 100
TCP_NODELAY yes
delay_loop 2
notify_up "/etc/keepalived/check_mysql.sh up"
notify_down "/etc/keepalived/check_mysql.sh down"
}
real_server 10.0.0.102 3306 {
weight 100
TCP_NODELAY yes
delay_loop 2
notify_up "/etc/keepalived/check_mysql.sh up"
notify_down "/etc/keepalived/check_mysql.sh down"
}
}# 备节点配置(VIP: 10.0.0.100)
sudo vi /etc/keepalived/keepalived.conf
global_defs {
router_id LVS-2
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
10.0.0.100
}
}3. LVS配置
# 配置IPVS
sudo vi /etc/sysconfig/ipvsadm
# 设置IPVS配置
IPVSADM_OPTS="-f -u -p -t 10.0.0.100:3306 -w 100"# 配置IPVS规则
sudo ipvsadm -f -u -p -t 10.0.0.100:3306 -w 100
sudo ipvsadm -a -t 10.0.0.100:3306 -r 10.0.0.101:3306 -g -w 100
sudo ipvsadm -a -t 10.0.0.100:3306 -r 10.0.0.102:3306 -g -w 100五、完整案例
1. 案例场景
构建一个支持高可用的MySQL集群,用于电商系统的订单处理。系统要求:
- 数据库必须支持自动故障转移
- 负载均衡必须支持会话保持
- 系统必须支持读写分离
2. 案例部署
2.1 网络规划
VIP: 10.0.0.100 (LVS虚拟IP)
Master1: 10.0.0.101 (MySQL主库)
Master2: 10.0.0.102 (MySQL主库)
Slave1: 10.0.0.103 (MySQL从库)
Slave2: 10.0.0.104 (MySQL从库)2.2 配置步骤
- 配置MySQL双主双从架构
- 配置Keepalived实现VIP热备
- 配置LVS实现负载均衡
- 配置应用层使用VIP进行数据库连接
2.3 验证测试
# 模拟主库故障
sudo systemctl stop mysql
# 验证VIP是否漂移到备节点
ping 10.0.0.100六、源码解析
1. Keepalived配置关键代码
# 虚拟服务器配置
virtual_server {
delay_loop 2
lb_algo rr
lb_kind NAT
persistence_timeout 0
protocol TCP
real_server 10.0.0.101 3306 {
weight 100
TCP_NODELAY yes
delay_loop 2
notify_up "/etc/keepalived/check_mysql.sh up"
notify_down "/etc/keepalived/check_mysql.sh down"
}
real_server 10.0.0.102 3306 {
weight 100
TCP_NODELAY yes
delay_loop 2
notify_up "/etc/keepalived/check_mysql.sh up"
notify_down "/etc/keepalived/check_mysql.sh down"
}
}关键点说明:
lb_algo rr表示使用轮询算法persistence_timeout 0表示不保持会话notify_up和notify_down用于通知状态变化
2. LVS配置关键代码
# 配置IPVS规则
sudo ipvsadm -f -u -p -t 10.0.0.100:3306 -w 100
sudo ipvsadm -a -t 10.0.0.100:3306 -r 10.0.0.101:3306 -g -w 100
sudo ipvsadm -a -t 10.0.0.100:3306 -r 10.0.0.102:3306 -g -w 100关键点说明:
-g表示使用网关模式(GSLB)-w表示权重delay_loop控制健康检查间隔
七、进阶使用
1. 动态权重调整
# 动态调整从库权重
sudo ipvsadm -E -t 10.0.0.100:3306 -r 10.0.0.103:3306 -w 502. 健康检查优化
# 自定义健康检查脚本
#!/bin/bash
# check_mysql.sh
if [ "$1" == "up" ]; then
mysql -h 10.0.0.101 -u root -p'password' -e "SHOW SLAVE STATUS\G" | grep "Seconds_Behind_Master" | awk '{print $2}'
if [ $? -eq 0 ]; then
echo "MySQL is up"
else
echo "MySQL is down"
fi
elif [ "$1" == "down" ]; then
mysql -h 10.0.0.101 -u root -p'password' -e "SHOW SLAVE STATUS\G" | grep "Seconds_Behind_Master" | awk '{print $2}'
if [ $? -eq 0 ]; then
echo "MySQL is down"
else
echo "MySQL is up"
fi
fi八、性能与工程实践
1. 性能优化
- 调整MySQL配置:增加
innodb_buffer_pool_size提升缓存命中率 - 优化LVS调度算法:使用
least-connection算法处理高并发 - Keepalived健康检查:设置更短的
delay_loop间隔(建议1秒)
2. 安全风险
- 防火墙设置:确保只开放必要的端口
- SSL加密:配置MySQL的SSL连接
- 访问控制:使用防火墙规则限制IP访问
3. 灾难恢复
- 定期备份:使用
mysqldump进行全量备份 - 异地容灾:将备份数据同步到异地机房
- 监控报警:集成Prometheus+Alertmanager进行实时监控
九、常见问题与踩坑
1. VIP绑定失败
错误日志:
Jul 5 10:00:00 node1 keepalived[1234]: VRRP_Instance(VI_1) Transition to MASTER state
Jul 5 10:00:01 node1 keepalived[1234]: VRRP_Instance(VI_1) Sending gratuitous ARP on eth0解决办法:
- 确认网络接口状态:
ip a show eth0 - 检查路由表:
ip route show - 防火墙规则:
iptables -L -n
2. 主从同步延迟
错误日志:
Last_SQL_Error: Error 'Duplicate entry '123' for key 'PRIMARY'' on query解决办法:
- 检查主库binlog格式是否一致
- 调整
sync_binlog=1和innodb_flush_log_at_trx_commit=1 - 增加从库
slave_parallel_workers
3. LVS连接超时
错误日志:
Jul 5 10:00:00 node1 ipvsadm[1234]: IPVS: connection timeout 10.0.0.101:3306解决办法:
- 调整
net.ipv4.tcp_keepalive_time参数 - 使用
keepalive参数保持连接 - 检查网络延迟:
ping -c 5 10.0.0.101
十、最佳实践
1. 配置建议
- Keepalived:使用
priority参数区分主备节点 - LVS:使用
least-connection算法处理高并发 - MySQL:配置
binlog_format=ROW保证复制一致性
2. 监控建议
- Prometheus:监控MySQL的连接数、慢查询等指标
- Zabbix:设置报警规则,当主库离线时触发告警
- ELK:集中日志分析,便于故障排查
3. 安全建议
- SSL加密:配置MySQL的SSL连接
- 访问控制:使用
iptables限制IP访问 - 定期审计:检查日志中的异常行为
十一、总结
本文深入探讨了MySQL双主双从架构结合Keepalived和LVS实现高可用的完整解决方案。通过分析核心组件的工作原理,提供了完整的配置示例和实现方案,涵盖了从环境准备到故障处理的各个方面。
该方案适用于需要高可用性的核心业务系统,但需要注意其复杂性和维护成本。在实施过程中,需要重点关注主从同步延迟、VIP切换的稳定性以及LVS的负载均衡策略。通过合理的配置和监控,可以构建一个稳定、高效的数据库高可用集群。
在实际项目中,建议根据业务需求选择合适的架构方案。对于中小规模系统,可以采用单主双从架构;对于大规模系统,可以采用双主双从+LVS的方案。同时,要结合具体业务场景,进行性能测试和压力测试,确保系统在高并发下的稳定性。
评论已关闭