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内核的高性能负载均衡实现

三、环境准备

系统要求

组件服务器配置系统版本
MySQL2核4GCentOS 7.9
Keepalived2核4GCentOS 7.9
LVS2核4GCentOS 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 配置步骤

  1. 配置MySQL双主双从架构
  2. 配置Keepalived实现VIP热备
  3. 配置LVS实现负载均衡
  4. 配置应用层使用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 50

2. 健康检查优化

# 自定义健康检查脚本
#!/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的方案。同时,要结合具体业务场景,进行性能测试和压力测试,确保系统在高并发下的稳定性。

最后修改于:2026年10月05日 19:40

评论已关闭

推荐阅读

AIGC实战——Transformer模型
2024年12月01日
Socket TCP 和 UDP 编程基础(Python)
2024年11月30日
python , tcp , udp
如何使用 ChatGPT 进行学术润色?你需要这些指令
2024年12月01日
AI
最新 Python 调用 OpenAi 详细教程实现问答、图像合成、图像理解、语音合成、语音识别(详细教程)
2024年11月24日
ChatGPT 和 DALL·E 2 配合生成故事绘本
2024年12月01日
omegaconf,一个超强的 Python 库!
2024年11月24日
【视觉AIGC识别】误差特征、人脸伪造检测、其他类型假图检测
2024年12月01日
[超级详细]如何在深度学习训练模型过程中使用 GPU 加速
2024年11月29日
Python 物理引擎pymunk最完整教程
2024年11月27日
MediaPipe 人体姿态与手指关键点检测教程
2024年11月27日
深入了解 Taipy:Python 打造 Web 应用的全面教程
2024年11月26日
基于Transformer的时间序列预测模型
2024年11月25日
Python在金融大数据分析中的AI应用(股价分析、量化交易)实战
2024年11月25日
AIGC Gradio系列学习教程之Components
2024年12月01日
Python3 `asyncio` — 异步 I/O,事件循环和并发工具
2024年11月30日
llama-factory SFT系列教程:大模型在自定义数据集 LoRA 训练与部署
2024年12月01日
Python 多线程和多进程用法
2024年11月24日
Python socket详解,全网最全教程
2024年11月27日
python之plot()和subplot()画图
2024年11月26日
理解 DALL·E 2、Stable Diffusion 和 Midjourney 工作原理
2024年12月01日