MySQL双主Keepalived备备非抢占配置手册

MySQL双主Keepalived备备非抢占配置手册

  以下是为服务器(192.168.43.218 和 192.168.43.219)配置Keepalived高可用的完整手册,虚拟IP(VIP)为 192.168.43.222,并已按要求将虚拟路由器ID设置为 222。此配置能确保当一台MySQL服务器故障时,VIP自动漂移到另一台,实现高可用。

特性

传统抢占模式 (MASTER/BACKUP)

非抢占模式 (BACKUP/BACKUP)

工作原理

优先级高的节点(MASTER)在恢复后会立即夺回VIP控制权。

所有节点初始状态均为 BACKUP。当前持有VIP的节点即使优先级较低,只要它健康,就会继续持有VIP。

故障切换

当主节点故障,备节点接管VIP。

当活动节点故障,备用节点接管VIP。

故障恢复

原主节点恢复后,会重新抢占VIP,导致VIP再次漂移。

原活动节点恢复后,不会触发VIP切换,仅作为新的备用节点。

优点

逻辑简单,始终由高性能节点提供服务。

避免频繁VIP漂移,服务会话更稳定,有效防止脑裂风险。

缺点

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角色

BACKUP

BACKUP

初始状态

优先级 (priority)

150

100

MASTER优先级需高于BACKUP

虚拟路由器ID

222

222

关键修改点,确保全网唯一

网卡接口

需根据实际修改(如ens160、eth0)

需根据实际修改(如ens160、eth0)

使用ip a命令查看本机网卡名

安装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 BACKUP              # 初始状态: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

# 非抢占式,不会发生漂移
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

经多次测试,已经达到预期效果!

posted @ 2025-10-31 15:11  davie2020  阅读(6)  评论(0)    收藏  举报