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. 定期备份数据,保障极端场景下的数据可恢复性。
相关推荐
NiKick15 小时前
MySql中的事务、MySql事务详解、MySql隔离级别
数据库·mysql·adb
ATCH IERV17 小时前
MySQL数据库误删恢复_mysql 数据 误删
数据库·mysql·adb
m0_7375393720 小时前
MYSQL源码安装和备份
数据库·mysql·adb
xxjj998a21 小时前
MySQL无法连接到本地localhost的解决办法2024.11.8
数据库·mysql·adb
历程里程碑1 天前
MySQL视图:虚拟表的实战技巧
java·开发语言·数据库·c++·sql·mysql·adb
Caspian Wren1 天前
通过Canal、Canal adapter将MySQL数据同步到ES
mysql·elasticsearch·adb
iNgs IMAC1 天前
MySQL无法连接到本地localhost的解决办法2024.11.8
数据库·mysql·adb
geBR OTTE1 天前
mysql重置root密码(适用于5.7和8.0)
数据库·mysql·adb
a34funny1 天前
Python高级之操作Mysql
python·mysql·adb
赛恩斯2 天前
adb 的源代码分析,以及如何改造为外网远程连接的方式
数据库·adb