MySQL 高可用

架构

组件 作用 核心优势
MySQL 主主复制 两台 MySQL 互为主从,双向同步数据 数据冗余、无单点、支持读写分离
HAProxy 数据库负载均衡、健康检查、连接管理 读写分发、自动剔除异常节点
Keepalived 提供 VIP、故障漂移、HAProxy 高可用 秒级切换、对业务透明

整体访问链路

复制代码
客户端 → VIP(Keepalived) → HAProxy → MySQL Master1/Master2

环境

节点 IP 角色
Master1 192.168.1.101 MySQL 主、HAProxy、Keepalived 主
Master2 192.168.1.102 MySQL 主、HAProxy、Keepalived 备
VIP 192.168.1.200 对外统一入口

前置要求

  • 关闭防火墙 / 开放 3306、8080、VRRP 端口
  • 关闭 SELinux 或设为 Permissive
  • 时间同步(NTP)
  • 两台 MySQL 版本一致

MySQL 双主复制

1. Mater1 my.cnf 配置

ini 复制代码
[mysqld]
server-id               = 101
log-bin                 = mysql-bin
binlog-format           = ROW
auto-increment-increment= 2
auto-increment-offset   = 1
relay-log               = mysql-relay-bin
log-slave-updates       = 1
sync-binlog             = 1
innodb_flush_log_at_trx_commit = 1

2. Master2 my.cnf

ini 复制代码
[mysqld]
server-id               = 102
log-bin                 = mysql-bin
binlog-format           = ROW
auto-increment-increment= 2
auto-increment-offset   = 2
relay-log               = mysql-relay-bin
log-slave-updates       = 1
sync-binlog             = 1
innodb_flush_log_at_trx_commit = 1

3. 创建复制账号(两台都执行)

sql 复制代码
CREATE USER 'repl'@'192.168.1.%' IDENTIFIED BY 'Repl@123';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.%';
FLUSH PRIVILEGES;

4. 建立双向复制

  1. 节点 1 执行 show master status; 记录 File & Position

  2. 节点 2 执行:

    sql 复制代码
    change master to
    master_host='192.168.1.101',
    master_user='repl',
    master_password='Repl@123',
    master_log_file='mysql-bin.000001',
    master_log_pos=154;
    
    start slave;
    show master status;
  3. 反向配置节点 1 指向节点 2,完成主主

HAProxy 配置

1. 安装

bash 复制代码
yum -y install haproxy

2. haproxy.cfg

vim /etc/haproxy/haproxy.cfg

ini 复制代码
global
    log 127.0.0.1 local2
    chroot /var/lib/haproxy
    pidfile /var/run/haproxy.pid
    user haproxy
    group haproxy
    daemon
    maxconn 4000

defaults
	# MySQL使用四层代理
    mode tcp
    log global
    option tcplog
    retries 3
    timeout connect 5s
    timeout client 50s
    timeout server 50s

listen mysql-read-write
	# 监听
    bind 0.0.0.0:3306
    mode tcp
    balance roundrobin
    option mysql-check user haproxy_check
    # 配置MySQL服务
    server mysql1 192.168.1.101:3306 check weight 1
    server mysql2 192.168.1.102:3306 check weight 1

listen stats
    bind 0.0.0.0:8080
    mode http
    stats enable
    stats uri /haproxy-stats
    stats auth admin:admin

3. MySQL 健康检查用户

sql 复制代码
CREATE USER 'haproxy_check'@'%' IDENTIFIED BY '';
FLUSH PRIVILEGES;

4. 启动

bash 复制代码
systemctl start haproxy
systemctl enable haproxy

Keepalived 配置

1. 安装

bash 复制代码
yum install -y keepalived

2. MySQL 检测脚本

bash 复制代码
#!/bin/bash
MYSQL_USER="haproxy_check"
MYSQL_HOST="localhost"
MYSQL_PORT="3306"

mysql -u$MYSQL_USER -h$MYSQL_HOST -P$MYSQL_PORT -e "SELECT 1" >/dev/null 2>&1
if [ $? -ne 0 ]; then
    systemctl stop haproxy
    exit 1
fi
exit 0
bash 复制代码
chmod +x /usr/local/bin/check_mysql.sh

3. Mater1 keepalived.conf

ini 复制代码
global_defs {
    router_id mysql_ha_master
}

vrrp_script check_mysql {
    script "/usr/local/bin/check_mysql.sh"
    interval 2
    weight -20
    fall 3
    rise 2
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.200/24
    }
    track_script {
        check_mysql
    }
}

4. Master2 keepalived.conf

ini 复制代码
global_defs {
    router_id mysql_ha_backup
}

vrrp_script check_mysql {
    script "/usr/local/bin/check_mysql.sh"
    interval 2
    weight -20
    fall 3
    rise 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.200/24
    }
    track_script {
        check_mysql
    }
}

5. 启动

bash 复制代码
systemctl start keepalived
systemctl enable keepalived
相关推荐
CoLiuRs10 分钟前
电商价格是怎样算出来的
数据库·redis·缓存
小蒜学长14 分钟前
基于Python的动物救助站管理系统的设计与实现(代码+数据库+LW)
数据库·后端·python·django·动物救助
JAVA面经实录91720 分钟前
Java高级后端 · 全套面试通关手册(MySQL)
java·mysql·面试
weixin_404551241 小时前
自动化数据库理解:用 AI 与 LLM 自动推断表的用途与关系
数据库·人工智能·自动化
java1234_小锋1 小时前
【技术专题】Mysql8 数据库 - Mysql8 简介 & 安装以及配置
数据库·mysql
oradh1 小时前
Oracle固定执行计划的方法----SQL Profie(三)
数据库·sql·oracle
斯内普吖2 小时前
(开源)水果蔬菜商城实战指南 基于 Java + SSM + Vue + MySQL
java·vue.js·mysql·开源
测试学习test2 小时前
SPI读取W25Q64硬件驱动(HAL库)
数据库·stm32·嵌入式硬件·算法
做运维的阿瑞2 小时前
mysql数据库分组查询:GROUP BY 与 HAVING 的执行逻辑
数据库·sql·mysql
LaughingZhu3 小时前
Product Hunt 每日热榜 | 2026-10-01
数据库·人工智能·深度学习·神经网络·搜索引擎