MySQL 5.7 主主复制 + Keepalived 高可用配置实例

前言

环境准备

[一、MySQL 5.7 主主复制配置](#一、MySQL 5.7 主主复制配置)

[1. 修改 my.cnf 核心配置](#1. 修改 my.cnf 核心配置)

[2. 创建复制账号](#2. 创建复制账号)

[3. 配置主主复制](#3. 配置主主复制)

[4. 测试复制状态](#4. 测试复制状态)

[二、Keepalived 编译安装与配置](#二、Keepalived 编译安装与配置)

[1. 编译安装 Keepalived](#1. 编译安装 Keepalived)

[2. Keepalived 配置文件示例](#2. Keepalived 配置文件示例)

[3. MySQL 状态检测脚本](#3. MySQL 状态检测脚本)

[4. 启动 Keepalived](#4. 启动 Keepalived)

[三、VIP 漂移测试](#三、VIP 漂移测试)

四、常见问题

[五、Keepalived 配置参数详解](#五、Keepalived 配置参数详解)

[1️⃣ 全局配置 global_defs](#1️⃣ 全局配置 global_defs)

[2️⃣ VRRP 脚本配置 vrrp_script](#2️⃣ VRRP 脚本配置 vrrp_script)

[3️⃣ VRRP 实例配置 vrrp_instance](#3️⃣ VRRP 实例配置 vrrp_instance)

[4️⃣ VIP 漂移逻辑](#4️⃣ VIP 漂移逻辑)

总结

前言

在高可用数据库架构中,主主复制(Master-Master Replication) 可以实现数据双向同步,而 Keepalived 则提供 VIP 漂移机制,保证在主节点故障时,客户端仍能通过虚拟 IP 访问数据库,从而实现业务连续性。

本文整理了一个 MySQL 5.7 主主复制 + VIP 漂移高可用环境 的完整配置流程,包括配置参数详解、Keepalived 编译安装、健康检查脚本等,帮助运维快速搭建可靠的高可用 MySQL 环境。


环境准备

  • 两台 MySQL 节点:mysql1mysql2

  • mysql1:172.16.0.110 | mysql2:172.16.0.115

  • Keepalived 用于 VIP 漂移

  • 操作系统:CentOS 7

  • MySQL 已通过 RPM 安装好

注:RPM安装mysql请阅读 https://blog.csdn.net/kirito0000/article/details/152375295?spm=1001.2014.3001.5501

一、MySQL 5.7 主主复制配置

1. 修改 my.cnf 核心配置

路径:/etc/my.cnf

复制代码
#mysql1
[mysqld]
datadir=/var/lib/mysql              
socket=/var/lib/mysql/mysql.sock
port=3306
bind-address=0.0.0.0               
default-storage-engine=INNODB       
character-set-server=utf8
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
​
# 二进制日志配置(主主复制必须)
log-bin=mysql-bin                   
binlog_format=MIXED                 
sync_binlog=1                        
expire_logs_days=7                   
​
# 主从复制核心参数
master_info_repository=TABLE         
relay_log_info_repository=TABLE      
relay_log_recovery=ON                
​
# 自增冲突控制(主主复制)
auto_increment_increment=2           
auto_increment_offset=1              
​
server-id=1
​
#mysql2
[mysqld]
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
port = 3306
bind-address = 0.0.0.0
default-storage-engine=INNODB
character-set-server=utf8
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
validate_password_policy=LOW   
validate_password_length=6       
​
log-bin=mysql-bin 
binlog_format=MIXED 
sync_binlog=1
expire_logs_days=7
​
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=ON
​
auto_increment_increment = 2   
auto_increment_offset = 2      
​
server-id=2

参数详解:

参数 含义
log-bin 开启二进制日志,用于复制
binlog_format 设置二进制日志格式(STATEMENT/ROW/MIXED)
sync_binlog 日志同步策略,保证主主一致性
expire_logs_days 自动清理旧日志
server-id 每台主机唯一标识,主主复制必须不同
auto_increment_increment/offset 防止自增主键冲突,主主必配
master_info_repository/relay_log_info_repository 复制信息存储位置,建议表存储更可靠
relay_log_recovery 保证中继日志异常恢复时不会丢数据

2. 创建复制账号

复制代码
#两个mysql都要创建
CREATE USER 'repl'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;

3. 配置主主复制

  • mysql1
复制代码
CHANGE MASTER TO
  MASTER_HOST='172.16.0.115',
  MASTER_USER='repl',
  MASTER_PASSWORD='123456',
  MASTER_LOG_FILE='mysql-bin.000004',
  MASTER_LOG_POS=313;
START SLAVE;
  • mysql2
复制代码
CHANGE MASTER TO
  MASTER_HOST='172.16.0.110',
  MASTER_USER='repl',
  MASTER_PASSWORD='123456',
  MASTER_LOG_FILE='mysql-bin.000004',
  MASTER_LOG_POS=313;
START SLAVE;

4. 测试复制状态

复制代码
SHOW SLAVE STATUS\G

确认 Slave_IO_RunningSlave_SQL_Running 均为 Yes


二、Keepalived 编译安装与配置

1. 编译安装 Keepalived

复制代码
# 安装依赖
yum install -y gcc gcc-c++ make openssl-devel pcre-devel libnl3-devel
​
# 下载并解压
cd /opt
wget https://www.keepalived.org/software/keepalived-2.2.5.tar.gz
tar zxvf keepalived-2.2.5.tar.gz
cd keepalived-2.2.5
​
# 编译安装
./configure --prefix=/usr/local/keepalived
make && make install
​
# 创建配置目录
mkdir -p /usr/local/etc/keepalived
mkdir -p /etc/keepalived     # 存放检测脚本

2. Keepalived 配置文件示例

路径:/usr/local/etc/keepalived/keepalived.conf

复制代码
vim /usr/local/etc/keepalived/keepalived.conf
#MASTER
global_defs {
   router_id LVS_MASTER  #名称标记为master,名字随便取
   vrrp_gna_interval 0
}
vrrp_script check_mysql {
    script "/etc/keepalived/check_mysql.sh"
    interval 2      # 每 2 秒检测一次
    rise 1          # 连续 1 次成功才认为 UP
    fall 2          # 连续 2 次失败才认为 DOWN,避免短暂波动
    weight -50
}
​
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 99
    priority 200           # MASTER 节点优先级
    advert_int 1
    virtual_ipaddress {
        172.16.0.250
    }
    track_script {
        check_mysql
    }
} 
​
#BACKUP
global_defs {
   router_id LVS_SLAVE  #名称标记为slave,名字随便取
   vrrp_gna_interval 0
}
vrrp_script check_mysql {
    script "/etc/keepalived/check_mysql.sh"
    interval 2      # 每 2 秒检测一次
    rise 1          # 连续 1 次成功才认为 UP
    fall 2          # 连续 2 次失败才认为 DOWN,避免短暂波动
}
​
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 99
    priority 199           # BACKUP 节点优先级
    advert_int 1
    virtual_ipaddress {
        172.16.0.250
    }
    track_script {
        check_mysql
    }
} 

3. MySQL 状态检测脚本

路径:/etc/keepalived/check_mysql.sh

复制代码
vim /etc/keepalived/check_mysql.sh
#!/bin/bash
#以下给出两种可选检测方案,自行选择
-------------------------------------------------------------------------
#检测方案1
# 检查 MySQL 是否监听 3306
#if ss -lnt | grep -q ":3306"; then
#    exit 0  # MySQL up
#else
#    exit 1  # MySQL down
#fi
-------------------------------------------------------------------------
#检测方案2
echo "$(date) running script" >> /tmp/check_mysql.log
#mysqladmin ping -h 127.0.0.1 -uroot -p123456 --ssl-mode=DISABLED > /dev/null 2>&1 (如果报错ssl尝试这条)
mysqladmin ping -h 127.0.0.1 -uroot -p123456 > /dev/null 2>&1
if [ $? -ne 0 ]; then
    echo "$(date) MySQL down" >> /tmp/check_mysql.log
    exit 1
fi
echo "$(date) MySQL up" >> /tmp/check_mysql.log
exit 0

4. 启动 Keepalived

复制代码
systemctl start keepalived

三、VIP 漂移测试

  1. 停掉 master 节点 MySQL:
复制代码
systemctl stop mysqld
  1. 检查备节点 VIP 是否漂移:
复制代码
ip a
  1. 恢复 MySQL:
复制代码
systemctl start mysqld

VIP 会重新回到原 master(如果 priority 较高)。


四、常见问题

  1. MySQL SSL 报错

解决方法:脚本加 --ssl-mode=DISABLED

  1. Keepalived "script is already running"

原因:VRRP 同步多次执行脚本,建议脚本内加互斥或使用 systemctl 管理 Keepalived

  1. VIP 不漂移
  • 检查 track_script 是否正确引用

  • 确保 MySQL 检测脚本能准确返回状态

  • 检查 Keepalived 权限和 SELinux 状态(建议 Permissive)


五、Keepalived 配置参数详解

1️⃣ 全局配置 global_defs

复制代码
global_defs {
    router_id LVS_MASTER    # 当前节点标识(唯一名称),用于日志和 VRRP 标识
    vrrp_gna_interval 0    # VRRP通告组播间隔(通常保持0即可)
}

参数说明

参数 含义
router_id 节点标识,随便取,但要唯一。VRRP 日志中会显示该 ID。
vrrp_gna_interval 保留字段,可配置 VRRP Gratuitous ARP 的间隔,一般默认 0 即可。

2️⃣ VRRP 脚本配置 vrrp_script

复制代码
vrrp_script check_mysql {
    script "/etc/keepalived/check_mysql.sh"
    interval 2
    rise 1
    fall 2
    weight -50
}

参数说明

参数 含义
script 指定要执行的脚本路径,用于健康检查(如 MySQL 是否可用)
interval 脚本执行间隔,单位秒
rise 连续执行成功达到次数后认为服务恢复
fall 连续执行失败达到次数后认为服务不可用
weight 成功或失败时对节点优先级的增减值(负值表示失败降低优先级)

示例 :如果 priority=150weight=-50,脚本失败后优先级变成 100,VIP 会漂移到 Backup 节点。


3️⃣ VRRP 实例配置 vrrp_instance

复制代码
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 50
    priority 200
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1234
    }
    virtual_ipaddress {
        172.16.0.250
    }
    track_script {
        check_mysql
    }
}

参数说明

参数 含义
state 当前节点状态:MASTERBACKUP
interface 绑定虚拟 IP 的网卡名称
virtual_router_id VRRP 实例 ID(0-255),Master 和 Backup 要相同,表示同一组 VIP
priority VRRP 优先级,Master 节点必须大于 Backup 节点
advert_int VRRP 通告间隔(秒),用于 Master 向 Backup 发送心跳
authentication VRRP 认证,防止非法节点加入
virtual_ipaddress VIP 地址,可配置多个
track_script 绑定健康检查脚本,脚本结果会影响优先级

4️⃣ VIP 漂移逻辑

  • Master 节点启动时,优先级最高,持有 VIP。

  • 如果 track_script 脚本失败且优先级低于 Backup 节点,VIP 漂移。

  • 当 Master 脚本恢复,优先级重新计算,VIP 可漂回。

总结

通过本文步骤:

  • 配置了 MySQL 5.7 主主复制,解决自增主键冲突

  • 配置 Keepalived 实现 VIP 漂移,提高数据库高可用性

  • 使用脚本自动监控 MySQL 服务状态,自动停止/启动 Keepalived

  • 解决 MySQL 5.7 SSL 报错问题,保证检测脚本可靠运行

相关推荐
迎風吹頭髮2 小时前
UNIX下C语言编程与实践20-UNIX 文件类型判断:stat 结构 st_mode 与文件类型宏的使用实战
linux·c语言·unix
凤凰战士芭比Q3 小时前
部署Nginx(Kylinv10sp3、Ubuntu2204、Rocky9.3)
linux·运维·nginx
讓丄帝愛伱3 小时前
Vim核心操作
linux·编辑器·vim
天上飞的粉红小猪3 小时前
进程的概念(下)
linux
NiKo_W3 小时前
Linux 自定义shell命令解释器
linux·bash·shell
七七七七073 小时前
【Linux 系统】命令行参数和环境变量
linux
jz_ddk3 小时前
[嵌入式] U-Boot 环境变量深度解析:从 QSPI 到 eMMC 的 Linux 启动完整指南
linux·运维·服务器·嵌入式·环境变量·u-boot·内核加载
戴誉杰3 小时前
cloudfared 内网穿透通过docker方式遇到的问题
运维·docker·容器·cloudfared
btyzadt3 小时前
计算机域与工作组详解
运维·windows·计算机