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号