当前位置: 首页 > news >正文

完整教程:MySQL 5.7 主主复制 + Keepalived 高可用配置实例

前言

环境准备

一、MySQL 5.7 主主复制配置

1. 修改 my.cnf 核心配置

2. 创建复制账号

3. 配置主主复制

4. 测试复制状态

二、Keepalived 编译安装与配置

1. 编译安装 Keepalived

2. Keepalived 配置文件示例

3. MySQL 状态检测脚本

4. 启动 Keepalived

三、VIP 漂移测试

四、常见问题

五、Keepalived 配置参数详解

1️⃣ 全局配置 global_defs

2️⃣ VRRP 脚本配置 vrrp_script

3️⃣ VRRP 实例配置 vrrp_instance

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. 配置主主复制

注意:MASTER_LOG_FILE和MASTER_LOG_FILE通过show master status;查看,这里都是写对方的

  • mysql1

CHANGE MASTER TOMASTER_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 TOMASTER_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_idVRRP 实例 ID(0-255),Master 和 Backup 要相同,表示同一组 VIP
priorityVRRP 优先级,Master 节点必须大于 Backup 节点
advert_intVRRP 通告间隔(秒),用于 Master 向 Backup 发送心跳
authenticationVRRP 认证,防止非法节点加入
virtual_ipaddressVIP 地址,可配置多个
track_script绑定健康检查脚本,脚本结果会影响优先级

4️⃣ VIP 漂移逻辑

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

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

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

总结

通过本文步骤:

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

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

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

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

http://www.hskmm.com/?act=detail&tid=24434

相关文章:

  • 题解:P14074 [GESP202509 五级] 有趣的数字和
  • 解码Huffman 编码与 Huffman 树
  • 『回忆录』初三来高中的半学期
  • 10.1 容器云部署准备(一) - 实践
  • 关于缓冲区以及输出方式
  • 漏洞赏金计划的困境:i915漏洞与ChromeOS、Intel赏金项目剖析
  • RippleNet: Propagating User Preferences on the Knowledge Graph for Recommender Systems
  • 特地拎出来的总结
  • 2025异型件厂家推荐:邯郸市烁燊紧固件,广泛应用于建筑、桥梁、机械、电力、交通等诸多领域
  • Allow or block media autoplay in Firefox
  • [WC2018] 即时战略
  • 实用指南:Unity学习之C#的反射机制
  • HDF5文件 ——之三
  • 代码随想录算法训练营|Day 25
  • 深入解析:SAE J3072-2024插电式电动汽车(PEV)中的车载逆变器系统安全标准介绍
  • 冷僻模板整理
  • 实用指南:gitlab-runner 再次实践中理解和学习
  • 2025年7月28日当周关键漏洞汇总分析
  • C# 与 C/C++ 互操作
  • 【自然语言处理】文本规范化知识点梳理与习题总结 - 教程
  • 邮票收集问题正推证明
  • 2025多校冲刺CSP模拟赛2 2025.10.4 模拟炸
  • 算法乱谈
  • 2025 年 9 月习题集
  • C# 代码规范
  • 实用指南:babelfish for postgresql 分析--todo
  • NFC 贴卡自动拨打微信视频电话
  • 10.4
  • 实用指南:d-分离:图模型中的条件独立性判定准则
  • [MCP] 监听资源更新