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控制权。  | 
 所有节点初始状态均为   | 
| 
 故障切换  | 
 当主节点故障,备节点接管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角色  | 
 
  | 
 
  | 
 初始状态  | 
| 
 优先级 (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 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
经多次测试,已经达到预期效果!
                    
                
                
            
        
浙公网安备 33010602011771号