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. 定期备份数据,保障极端场景下的数据可恢复性。
相关推荐
PD我是你的真爱粉5 小时前
MySQL 事务与并发控制:从日志底层到 MVCC 哲学
android·mysql·adb
PD我是你的真爱粉5 小时前
MySQL 高性能实战与底层原理
数据库·mysql·adb
PD我是你的真爱粉9 小时前
MySQL 索引进阶:从失效排查到架构哲学
mysql·adb·架构
wuyikeer9 小时前
docker 安装 mysql
mysql·adb·docker
大龄烤红薯9 小时前
docker-【容器数据存储位置分析】以Mysql容器为例
mysql·adb·docker
流星白龙1 天前
【MySQL】19.MySQL用户管理
android·mysql·adb
xiaokangzhe1 天前
MySQL主从复制读写分离笔记
笔记·mysql·adb
ego.iblacat1 天前
MySQL 主从复制与读写分离
android·mysql·adb
炸炸鱼.1 天前
MySQL 主从复制与读写分离
adb