使用mysql主从热备+keepalived服务+ipvsadm工具来实现mysql高可用主备+负载均衡

使用mysql主从热备+keepalived服务+ipvsadm工具来实现mysql高可用主备+负载均衡

一、背景与问题

在现代分布式系统中,数据库的高可用性是保障业务连续性的核心要素。传统单点MySQL部署存在以下风险:

  • 主库宕机导致服务中断
  • 网络波动引发的连接失败
  • 硬件故障引发的数据丢失

为解决这些问题,需要构建一个包含以下特性的高可用架构:

  1. 自动故障转移:在主库故障时自动切换到从库
  2. 负载均衡:分担读写压力,提高系统吞吐量
  3. 数据一致性:保证主从数据实时同步
  4. 可扩展性:支持横向扩展

本方案采用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.index

2. Keepalived虚拟IP原理

Keepalived通过VRRP协议实现虚拟IP漂移:

  • 虚拟IP(VIP)绑定在物理服务器上
  • 通过检查MySQL服务状态决定VIP归属
  • 在主库故障时自动将VIP转移到从库

3. IPVS负载均衡原理

IPVS基于Linux内核的IP虚拟服务器实现四层负载均衡:

  • 通过iptables规则将流量分发到后端服务器
  • 支持多种调度算法(NAT、DR、TUN等)

三、环境准备

系统要求

组件版本系统
MySQL8.0.31CentOS 7
Keepalived2.1.5CentOS 7
IPVSadm1.29CentOS 7

网络规划

节点类型IP地址角色
主库192.168.1.10主库 + 负载均衡
从库192.168.1.11从库
VIP192.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
fi

3. 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

五、完整案例

部署步骤

  1. 安装软件包

    yum install -y mariadb-server keepalived ipvsadm
  2. 配置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
  1. 配置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
  1. 配置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
  2. 启动服务

    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 -g

2. 增强监控

通过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_typeOFF8.0后已弃用,建议关闭
sync_binlog1确保事务立即写入磁盘
innodb_flush_log_at_trx_commit1保证事务完整性

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的方案。

最后修改于:2026年09月18日 15:31

评论已关闭

推荐阅读

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日