mysql高可用

一、方案概述

在数字化业务场景中,数据库是核心基础设施,单点故障会直接导致业务中断。本文基于MySQL 双主复制 + haproxy 负载均衡 + Keepalived 高可用架构,实现 MySQL 服务的故障自动切换、读写负载分流,保障业务连续性,满足企业级高可用需求。

架构核心组件

表格

组件 作用
MySQL 双主 两台 MySQL 节点互为主从,双向同步数据,支持读写操作,保障数据冗余
haproxy 负载均衡器,分发读写请求,支持健康检查,实现故障节点自动剔除
Keepalived 提供 VIP 漂移,实现 haproxy 节点的高可用,保障负载均衡层无单点

二、环境准备

1. 服务器规划

表格

主机 操作系统 IP 地址 应用
Master1 openEuler 24.03 192.168.10.01 MySQL
Master2 openEuler 24.03 192.168.10.02 MySQL
Keepalived1 openEuler 24.03 192.168.10.03 Keepalived、haproxy
Keepalived2 openEuler 24.03 192.168.10.04 Keepalived、haproxy

2. 前置准备

所有节点执行基础环境配置:

bash

运行

复制代码
# 关闭SELinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0
# 关闭防火墙
systemctl disable firewalld
systemctl stop firewalld

三、MySQL 双主复制部署

1. 二进制安装 MySQL

bash

运行

复制代码
# 解压安装包
tar -zxvf mysql-8.0.36-linux-glibc2.28-x86_64.tar.xz -C /usr/local/
ln -s /usr/local/mysql-8.0.36-linux-glibc2.28-x86_64 /usr/local/mysql
# 创建数据目录
mkdir -p /data/mysql/data
# 创建用户
useradd -s /sbin/nologin mysql
chown -R mysql:mysql /usr/local/mysql /data/mysql
# 初始化
/usr/local/mysql/bin/mysqld --initialize --user=mysql --datadir=/data/mysql/data
# 配置环境变量
echo 'export PATH=/usr/local/mysql/bin:$PATH' >> /etc/profile
source /etc/profile

2. 配置双主同步

Master1 配置(/etc/my.cnf)

ini

复制代码
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-format=MIXED
auto-increment-increment=2
auto-increment-offset=1
Master2 配置(/etc/my.cnf)

ini

复制代码
[mysqld]
server-id=2
log-bin=mysql-bin
binlog-format=MIXED
auto-increment-increment=2
auto-increment-offset=2
配置主从同步

Master1 执行:

sql

复制代码
CREATE USER 'repl'@'192.168.10.02' IDENTIFIED BY 'Repl@123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.10.02';
FLUSH PRIVILEGES;
SHOW MASTER STATUS; -- 记录File和Position

Master2 执行:

sql

复制代码
CREATE USER 'repl'@'192.168.10.01' IDENTIFIED BY 'Repl@123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.10.01';
FLUSH PRIVILEGES;
-- 配置主从(以Master1为源)
CHANGE MASTER TO
MASTER_HOST='192.168.10.01',
MASTER_USER='repl',
MASTER_PASSWORD='Repl@123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=157;
START SLAVE;
SHOW SLAVE STATUS\G -- 确认Slave_IO_Running、Slave_SQL_Running为Yes

-- 配置反向主从(以Master2为源,Master1执行)
CHANGE MASTER TO
MASTER_HOST='192.168.10.02',
MASTER_USER='repl',
MASTER_PASSWORD='Repl@123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=157;
START SLAVE;
SHOW SLAVE STATUS\G

四、haproxy 负载均衡部署

1. 安装 haproxy

bash

运行

复制代码
yum install -y haproxy

2. 配置 haproxy(/etc/haproxy/haproxy.cfg)

ini

复制代码
global
    log /dev/log local0
    log /dev/log local1 notice
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
    stats timeout 30s
    user haproxy
    group haproxy
    daemon

defaults
    log global
    mode tcp
    option tcplog
    option dontlognull
    timeout connect 5000ms
    timeout client  50000ms
    timeout server  50000ms

frontend mysql_front
    bind *:3306
    default_backend mysql_back

backend mysql_back
    balance roundrobin
    server master1 192.168.10.01:3306 check port 3306 inter 2000 rise 2 fall 3
    server master2 192.168.10.02:3306 check port 3306 inter 2000 rise 2 fall 3

listen stats
    bind *:8080
    stats enable
    stats uri /stats
    stats auth admin:Admin@123

3. 启动服务

bash

运行

复制代码
haproxy -f /etc/haproxy/haproxy.cfg
systemctl enable --now haproxy

五、Keepalived 高可用部署

1. 安装 Keepalived

bash

运行

复制代码
yum install -y keepalived

2. 主节点配置(Keepalived1,/etc/keepalived/keepalived.conf)

ini

复制代码
global_defs {
    router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.100
    }
    track_script {
        check_haproxy
    }
}

vrrp_script check_haproxy {
    script "/etc/keepalived/check_haproxy.sh"
    interval 2
    weight -20
}

3. 备节点配置(Keepalived2,/etc/keepalived/keepalived.conf)

ini

复制代码
global_defs {
    router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.100
    }
    track_script {
        check_haproxy
    }
}

vrrp_script check_haproxy {
    script "/etc/keepalived/check_haproxy.sh"
    interval 2
    weight -20
}

4. 健康检查脚本(/etc/keepalived/check_haproxy.sh)

bash

运行

复制代码
#!/bin/bash
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
    systemctl stop keepalived
fi

bash

运行

复制代码
chmod +x /etc/keepalived/check_haproxy.sh
systemctl enable --now keepalived

六、高可用验证

1. 故障切换验证

  • 手动停止 Master1 的 MySQL 服务,haproxy 会自动剔除该节点,业务流量仅流向 Master2,无感知切换。
  • 手动停止 Keepalived1 的 haproxy 服务,Keepalived 会自动将 VIP 漂移至 Keepalived2,负载均衡服务持续可用。

2. 负载均衡验证

通过 VIP(192.168.10.100)连接 MySQL,多次执行查询,可观察到请求在 Master1、Master2 之间轮询分发。


七、方案优势

  1. 高可用性:双主复制 + VIP 漂移,实现数据库层、负载均衡层双重高可用,故障秒级切换。
  2. 可扩展性:haproxy 支持水平扩展,可灵活新增 MySQL 节点,适配业务增长。
  3. 运维友好:开源组件、社区支持完善,无厂商绑定,适合自建数据库集群。
  4. 性能优化:支持读写分离、负载均衡,提升数据库并发处理能力。

八、注意事项

  1. MySQL 双主架构需避免数据冲突,建议业务层控制写入逻辑,或使用自增步长分离。
  2. haproxy 需配置合理的健康检查参数,避免误判节点故障。
  3. Keepalived 主备节点需配置相同的认证信息,避免脑裂问题。
  4. 定期备份数据,保障极端场景下的数据可恢复性。
相关推荐
黄俊懿3 天前
复合索引设计指南:最左前缀 & 字段排座次
数据库·sql·mysql·adb·性能优化·dba·db
aaa最北边3 天前
MySQL-锁
数据库·mysql·adb
fTiN CAPA4 天前
Linux系统离线部署MySQL详细教程(带每步骤图文教程)
linux·mysql·adb
hjc_0420434 天前
xtrabackup来备份恢复数据
运维·adb
小江的记录本4 天前
【MySQL】《MySQL基础架构 面试核心考点问答清单》
前端·数据库·后端·sql·mysql·adb·面试
秋94 天前
java中对操作mysql8.0.46与MySQL9.7.0有什么区别,并举例说明
android·java·adb
街灯L5 天前
【ADB】使用ADB工具箱卸载安卓系统软件
android·adb
人道领域6 天前
【黑马点评日记】RedisGEO实战:黑马点评附近商铺功能
java·数据库·redis·adb
木井巳7 天前
【MySQL数据库】数据库操作及数据类型
数据库·mysql·adb
字节高级特工7 天前
MySQL数据库基础与实战指南
数据库·c++·人工智能·后端·mysql·adb