MySQL双主Keepalived主备抢占配置手册
MySQL双主Keepalived主备抢占配置手册
以下是为服务器(192.168.43.218 和 192.168.43.219)配置Keepalived高可用的完整手册,虚拟IP(VIP)为 192.168.43.222,并已按要求将虚拟路由器ID设置为 222。此配置能确保当一台MySQL服务器故障时,VIP自动漂移到另一台,实现高可用。
配置规划
|
组件 |
服务器 1 (Master-1) |
服务器 2 (Master-2) |
说明 |
|
真实IP |
192.168.43.218 |
192.168.43.219 |
服务器的固定IP |
|
虚拟IP (VIP) |
192.168.43.222 (主) |
192.168.43.222 (备) |
对应用层提供服务的浮动IP |
|
Keepalived角色 |
|
|
初始状态 |
|
优先级 (priority) |
150 |
100 |
MASTER优先级需高于BACKUP |
|
虚拟路由器ID |
222 |
222 |
关键修改点,确保全网唯一 |
|
网卡接口 |
需根据实际修改(如ens160、eth0) |
需根据实际修改(如ens160、eth0) |
使用 |
安装Keepalived
在两台服务器上执行
# 安装Keepalived yum install -y keepalived #yum -y install keepalived ipvsadm mailx systemctl enable keepalived # 设置开机自启(暂不启动) #systemctl enable keepalived #groupadd -r keepalived_script #useradd -r -g keepalived_script -s /sbin/nologin keepalived_script
配置Keepalived
主节点配置 (192.168.43.218)
编辑配置文件 /etc/keepalived/keepalived.conf,内容如下:
cat > /etc/keepalived/keepalived.conf << 'EOF'
# ================================================================
# db218 节点 keepalived 配置文件
# 角色:MASTER(初始写入节点)
# 虚拟 IP:192.168.43.222
# ================================================================
global_defs {
# 本机唯一标识,日志中便于定位
router_id mysql_218
# 启用性能优化选项
max_auto_priority
# 以 root 身份运行脚本,并启用脚本安全检查
script_user root
enable_script_security
# 跳过对通告地址的校验,加速切换
vrrp_skip_check_adv_addr
}
# ------------------------------------------------------------
# MySQL 健康检查脚本定义
# ------------------------------------------------------------
vrrp_script chk_mysql {
# 检查脚本路径
script "/etc/keepalived/check_mysql.sh"
interval 10 # 脚本执行间隔:给足MySQL启停时间
timeout 7 # 脚本超时时间:小于interval,预留3秒缓冲
weight -60 # 故障时降低60优先级,确保node2优先级更高
fall 2 # 连续2次失败判定为故障(减少误判)
rise 3 # 连续3次成功判定为恢复(确保稳定)
}
# 实例名字(自定义),同一对主备须同名,否则互相认不到。
vrrp_instance VI_1 {
state MASTER # 初始状态:BACKUP
interface ens160 # 绑定网卡,需与 ip a 看到的名称一致
virtual_router_id 222 # 主备必须相同,范围 1-255
priority 150 # 优先级,高于 BACKUP(100)
advert_int 2 # 心跳间隔 2 秒
#nopreempt # 非抢占式
# 优化ARP发送策略
garp_master_delay 5 # 成为主节点后延迟5秒发送ARP
garp_master_repeat 3 # 成为主节点后发送3次ARP
# 认证方式:简单密码(主备必须一致)
authentication {
auth_type PASS
auth_pass 8888
}
# 虚拟 IP/掩码及标签(label 方便 ip addr 查看)
virtual_ipaddress {
192.168.43.222/24 dev ens160 label ens160:1
}
# 使用单播代替组播,防止交换机禁组播,指向对端
unicast_src_ip 192.168.43.218 # 本地IP
unicast_peer {
192.168.43.219 # 对端IP
}
# 关联健康检查脚本
track_script {
chk_mysql weight 0 # weight 0:仅触发状态判定,不叠加权重
}
}
EOF
备节点配置 (192.168.43.219)
配置文件路径相同,内容如下(注意修改router_id和优先级):
cat > /etc/keepalived/keepalived.conf << 'EOF'
# ================================================================
# db219 节点 keepalived 配置文件
# 角色:BACKUP(初始只读节点)
# 虚拟 IP:192.168.43.222(故障时漂移到本机)
# ================================================================
global_defs {
# 本机唯一标识,日志中便于定位
router_id mysql_219
# 启用性能优化选项
max_auto_priority
# 以 root 身份运行脚本,并启用脚本安全检查
script_user root
enable_script_security
# 跳过对通告地址的校验,加速切换
vrrp_skip_check_adv_addr
}
# ------------------------------------------------------------
# MySQL 健康检查脚本定义
# ------------------------------------------------------------
vrrp_script chk_mysql {
# 检查脚本路径
script "/etc/keepalived/check_mysql.sh"
interval 10 # 脚本执行间隔:给足MySQL启停时间
timeout 7 # 脚本超时时间:小于interval,预留3秒缓冲
weight -60 # 故障时降低60优先级,确保node2优先级更高
fall 2 # 连续2次失败判定为故障(减少误判)
rise 3 # 连续3次成功判定为恢复(确保稳定)
}
# 实例名字(自定义),同一对主备须同名,否则互相认不到。
vrrp_instance VI_1 {
state BACKUP # 初始状态:BACKUP
interface ens160 # 绑定网卡,需与 ip a 看到的名称一致
virtual_router_id 222 # 主备必须相同,范围 1-255
priority 100 # 优先级低于 MASTER (150)
advert_int 2 # 心跳间隔 2 秒
#nopreempt # 非抢占式
# 优化ARP发送策略
garp_master_delay 5 # 成为主节点后延迟5秒发送ARP
garp_master_repeat 3 # 成为主节点后发送3次ARP
# 认证方式:简单密码(主备必须一致)
authentication {
auth_type PASS
auth_pass 8888
}
# 虚拟 IP/掩码及标签(label 方便 ip addr 查看)
virtual_ipaddress {
192.168.43.222/24 dev ens160 label ens160:1
}
# 使用单播代替组播,防止交换机禁组播,指向对端
unicast_src_ip 192.168.43.219 # 本地IP
unicast_peer {
192.168.43.218 # 对端IP
}
# 关联健康检查脚本
track_script {
chk_mysql weight 0 # weight 0:仅触发状态判定,不叠加权重
}
}
EOF
配置MySQL健康检查脚本(关键步骤)
为确保VIP仅在MySQL服务正常时切换,需创建健康检查脚本。在两台服务器上创建 /etc/keepalived/check_mysql.sh
# 创建专用账号 CREATE USER 'checkuser'@'localhost' IDENTIFIED BY 'xrvLovfnp$4%svbS'; GRANT USAGE ON *.* TO 'checkuser'@'localhost'; # 测试是否可以成功执行 mysql -hlocalhost -ucheckuser -p'xrvLovfnp$4%svbS' -e "select 1"
cat >/etc/keepalived/check_mysql.sh << 'EOF' #!/bin/bash # MySQL健康检查脚本:测试MySQL连接是否正常 MYSQL_CMD=$(which mysql) MYSQL_HOST="localhost" MYSQL_PORT="3306" MYSQL_USER="checkuser" CHECK_SQL="SELECT 1;" if $MYSQL_CMD -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p'xrvLovfnp$4%svbS' -e "$CHECK_SQL" > /dev/null 2>&1; then exit 0 # MySQL正常,脚本返回0 else exit 1 # MySQL异常,脚本返回非0,触发优先级降低 fi EOF chmod 755 /etc/keepalived/check_mysql.sh
启动服务与验证
验证keepalived服务
# 主节点(218)启动 systemctl start keepalived # 在备节点(219)启动 systemctl start keepalived
验证VIP绑定
# 在主节点执行,应看到VIP绑定在网卡上 ip addr|grep 192 # 在备节点执行,不应看到VIP ip addr|grep 192
检查服务状态
systemctl status keepalived # 查看服务是否活跃 tail -f /var/log/messages # 监控Keepalived日志,确认无错误
故障转移测试
模拟主节点故障-keepalived关闭
# 在主节点停止Keepalived: systemctl stop keepalived #观察备节点日志:应看到VIP漂移到备节点. tail -f /var/log/messages, 在备节点执行,确认VIP已绑定。 ip addr|grep 192
恢复测试-keepalived开启
# 重启主节点的Keepalived: systemctl start keepalived # 由于主节点优先级更高,VIP应自动漂回(抢占模式)。 ip addr|grep 192
模拟主节点故障-mysqld关闭
# 在主节点查看 systemctl stop mysqld systemctl status mysqld ip addr|grep 192 tail -f /var/log/messages # 在备节点查看 ip addr|grep 192 tail -f /var/log/messages
恢复测试-mysqld开启
# 在主节点查看 systemctl start mysqld systemctl status mysqld ip addr|grep 192 tail -f /var/log/messages # 在备节点查看 ip addr|grep 192 tail -f /var/log/messages
# 快捷命令 systemctl status mysqld systemctl status keepalived.service systemctl start mysqld systemctl start keepalived.service systemctl stop mysqld systemctl stop keepalived.service systemctl restart mysqld systemctl restart keepalived.service ip addr|grep 192
经多次测试,已经达到预期效果!

浙公网安备 33010602011771号