当前位置: 首页 > 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. 配置主主复制

  • 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 次成功才认为 UPfall 2          # 连续 2 次失败才认为 DOWN,避免短暂波动weight -50
}
​
vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 99priority 200           # MASTER 节点优先级advert_int 1virtual_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 次成功才认为 UPfall 2          # 连续 2 次失败才认为 DOWN,避免短暂波动
}
​
vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 99priority 199           # BACKUP 节点优先级advert_int 1virtual_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 ]; thenecho "$(date) MySQL down" >> /tmp/check_mysql.logexit 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 2rise 1fall 2weight -50
}

参数说明

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

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


3️⃣ VRRP 实例配置 vrrp_instance

vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 50priority 200advert_int 1authentication {auth_type PASSauth_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.dtcms.com/a/434418.html

相关文章:

  • 2014 年真题配套词汇单词笔记(考研真相)
  • 构建AI智能体:五十一、深思熟虑智能体:从BDI架构到认知推理的完整流程体系
  • 自由学习记录(104)
  • 【开题答辩全过程】以 ssm蛋糕销售网站的设计与实现为例,包含答辩的问题和答案
  • Photoshop - Photoshop 工具从工具栏消失
  • 专题网站建设策划dw一个完整网页的代码
  • 刷赞网站推广免费链接网站后台怎么添加栏目
  • LLM 笔记 —— 01 大型语言模型修炼史(Self-supervised Learning、Supervised Learning、RLHF)
  • 框架系统在自然语言处理深度语义分析中的作用、挑战与未来展望
  • LLM 笔记 —— 03 大语言模型安全性评定
  • d-分离:图模型中的条件独立性判定准则
  • 【自然语言处理】文本规范化知识点梳理与习题总结
  • 上海商城网站建设公司算命手机网站开发
  • 重塑Excel的智慧边界:ExcelAgentTemplate架构深度解析与LLM集成最佳实践
  • QoS之拥塞避免配置方法
  • vscode搭建C/C++配置开发环境
  • 在鸿蒙NEXT中发起HTTP网络请求:从入门到精通
  • 做网站商家网站公告栏代码
  • 做企业网站联系群晖网站建设
  • Java坐标转换的多元实现路径:在线调用、百度与高德地图API集成及纯Java代码实现——纯Java代码实现与数学模型深度剖析
  • 【socket编程中的常规操作,阻塞/非阻塞模式的差别】
  • 5G NR PDCCH DCI
  • 网站建设海淀区360浏览器打开是2345网址导航
  • 《代码随想录》二叉树专题算法笔记
  • CSS3 用户界面
  • 虚幻引擎UE5专用服务器游戏开发-32 使用Gameplay Tags阻止连招触发
  • 鼠标垫东莞网站建设网站建设公司的公司
  • SOAR技术与高效网络安全运营
  • Node.js 本地服务部署、常驻及调用完整笔记
  • Java 工具类 Hutool、Guava 与 Apache Commons 的区别