MySQL主主复制+Keepalived高可用配置
一、环境准备
两台已安装mysql(版本5.7.17)的服务器:节点IP分别为:
192.168.88.128(mysql-1)、192.168.88.130(mysql-2)
二、mysql主主复制
2.1分别修改mysql-1、mysql-2的配置文件 "/etc/my.cnf"
服务器 A(192.168.88.128)配置:
[mysqld]
# 开启二进制日志(主从复制依赖)
log_bin = /var/log/mysql/mysql-bin.log
# 服务器唯一 ID(必须与另一台不同)
server-id = 1
# 自动增长字段步长(主主复制避免 ID 冲突)
auto_increment_increment = 2
# 自动增长字段起始值(服务器 A 从 1 开始,奇数)
auto_increment_offset = 1
# 需要同步的数据库(可选,不配置则同步所有库)
# binlog_do_db = mydatabase
# 忽略同步的数据库(可选)
# binlog_ignore_db = mysql
# 开启 GTID(可选,推荐,用于更可靠的复制)
gtid_mode = ON
enforce_gtid_consistency = ON
服务器 B(192.168.88.130)配置:
[mysqld]
log_bin = /var/log/mysql/mysql-bin.log
server-id = 2 # 与服务器 A 不同
auto_increment_increment = 2 # 步长相同
auto_increment_offset = 2 # 服务器 B 从 2 开始,偶数
# binlog_do_db = mydatabase(与服务器 A 保持一致)
gtid_mode = ON
enforce_gtid_consistency = ON
auto_increment_increment
和auto_increment_offset
用于避免两台服务器的自增 ID 冲突(A生成 1,3,5...,B生成 2,4,6...)
2.2配置后重启两台服务器的 MySQL 服务:
systemctl restart mysqld
2.3在两台服务器上都创建用于复制的账号(允许对方服务器连接)
在服务器 A 上执行:
-- 创建允许服务器 B 连接的复制账号
CREATE USER 'repl_user'@'192.168.88.130' IDENTIFIED BY 'YourStrongPassword';
-- 授予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'192.168.88.130';
-- 刷新权限
FLUSH PRIVILEGES;
在服务器 B 上执行:
-- 创建允许服务器 A 连接的复制账号
CREATE USER 'repl_user'@'192.168.88.128' IDENTIFIED BY 'YourStrongPassword';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'192.168.88.128';
FLUSH PRIVILEGES;
2.4配置双向复制关系
步骤 1:获取服务器 A 的二进制日志信息
在服务器 A 上执行以下 SQL,记录 File
和 Position
的值(用于服务器 B 作为从库指向 A):
步骤 2:配置服务器 B 作为 A 的从库
在服务器 B 上执行以下 SQL,设置其复制源为服务器 A:
步骤 3:获取服务器 B 的二进制日志信息
在服务器 B 上执行以下 SQL,记录 File
和 Position
的值(用于服务器 A 作为从库指向 B):
步骤 4:配置服务器 A 作为 B 的从库
在服务器 A 上执行以下 SQL,设置其复制源为服务器 B:
2.5验证主主复制是否成功
2.6测试主主复制
在服务器 A 上创建测试数据库和表:
在服务器 B 上查看是否同步:
在服务器 B 上插入数据,验证反向同步:
在服务器 A 上查看是否同步:
三、Keepalived安装与配置
3.1安装Keepalived
yum install keepalived -y
3.2 核心配置:区分「主节点」和「备节点」
Keepalived 配置文件路径为 /etc/keepalived/keepalived.conf
,两台服务器配置不同,核心差异是 state
(角色)、priority
(优先级)和 nopreempt
(非抢占模式)。
(1)节点 1(192.168.88.128):主节点配置
vim /etc/keepalived/keepalived.conf
写入以下内容:
! Configuration File for keepalived
global_defs {router_id LVS_MASTER # 节点唯一标识,主备不同(如MASTER/SLAVE)
}# 健康检查脚本:检测 MySQL 是否存活(关键!故障切换的触发条件)
vrrp_script check_mysql {script "/etc/keepalived/check_mysql.sh" # 健康检查脚本路径interval 3 # 检查间隔(秒)weight -20 # 若MySQL死亡,节点优先级降低20fall 3 # 连续3次检查失败,判定服务死亡rise 2 # 连续2次检查成功,判定服务恢复
}# VRRP 实例配置(VIP相关)
vrrp_instance VI_1 {state MASTER # 角色:MASTER(主)/BACKUP(备)interface ens33 # 绑定VIP的网卡(用ifconfig查看,如ens33)virtual_router_id 51# 虚拟路由ID(主备必须相同,0-255)priority 100 # 优先级(主节点 > 备节点,如主100,备90)advert_int 1 # VRRP心跳间隔(秒)authentication { # 主备认证(避免非法节点加入)auth_type PASSauth_pass 1111 # 密码(主备必须相同)}virtual_ipaddress { # 虚拟IP(VIP),可配置多个192.168.88.100/24 dev ens33 label ens33:0}track_script { # 关联健康检查脚本check_mysql}
}
(2)节点 2(192.168.88.130):备节点配置
vim /etc/keepalived/keepalived.conf
写入以下内容(差异点已标注):
! Configuration File for keepalived
global_defs {router_id LVS_SLAVE # 与主节点不同
}# 健康检查脚本(与主节点相同)
vrrp_script check_mysql {script "/etc/keepalived/check_mysql.sh"interval 3weight -20fall 3rise 2
}vrrp_instance VI_1 {state BACKUP # 角色:BACKUP(备)interface eth0 # 与主节点网卡一致virtual_router_id 51# 与主节点相同priority 90 # 优先级低于主节点(90 < 100)advert_int 1authentication {auth_type PASSauth_pass 1111 # 与主节点相同}virtual_ipaddress {192.168.1.100/24 dev eth0 label eth0:0}track_script {check_mysql}nopreempt # 非抢占模式(可选,避免主节点恢复后抢占VIP导致抖动)
}
3.3 编写 MySQL 健康检查脚本(两台服务器相同)
Keepalived 通过脚本检测 MySQL 是否存活,若 MySQL 死亡,触发故障切换。
# 创建脚本文件
vim /etc/keepalived/check_mysql.sh
写入以下内容:
#!/bin/bash
#检查 MySQL是否监听3306
if ss -lnt | grep -q ":3306"; then
exit 0 #MySQL up##
else
exit 1 # MySQL down
fi
赋权 :
chmod +x /etc/keepalived/check_mysql.sh
3.4故障切换演示(核心环节)
模拟「主节点 MySQL 故障」或「主节点宕机」,观察 VIP 是否自动漂移到备节点,服务是否持续可用。
在 节点 1(主节点) 手动停止 MySQL 服务,触发 Keepalived 健康检查:
# 停止 MySQL(模拟服务故障)
systemctl stop mysqld
在节点 2(备节点)查看 VIP:VIP 已漂移到备节点
ip addr show ens33
输出应包含 inet 192.168.88.100/24
(VIP 绑定到备节点)。