mysql 解决脑裂_解决keepalived脑裂问题

解决keepalived脑裂问题

一.介绍

脑裂(split-brain):指在一个高可用(HA)系统中,当联系着的两个节点断开联系时,本来为一个整体的系统,分裂为两个独立节点,这时两个节点开始争抢共享资源,例如都去用同一个ip提供网页服务,结果会导致系统混乱,数据损坏。

对于无状态服务的HA,无所谓脑裂不脑裂;但对有状态服务(比如MySQL)的HA,必须要严格防止脑裂。

二.产生的原因

高可用服务器对之间心跳线链路发生故障,导致无法正常通信。

因心跳线坏了(包括断了,老化)。

因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)。

因心跳线间连接的设备故障(网卡及交换机)。

因仲裁的机器出问题(采用仲裁的方案)。

高可用服务器上开启了 iptables防火墙阻挡了心跳消息传输。

高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败。

其他服务配置不当等原因,如心跳方式不同,心跳广插冲突、软件Bug等。

提示: Keepalived配置里同一 VRRP实例如果 virtual_router_id两端参数配置不一致也会导致裂脑问题发生。

三.解决方案

检测网关

由于keepalived体系中主备两台机器所处的状态与对方有关。如果主备机器之间的通信出了网题,那就ping网关,如果失败则证明网络有问题,将当前节点关闭,如果成功再开启。

问题是,当内部mysql所在机器出现网络问题,但是他是给内网提供服务的,这会导致2台mysql都关闭虚拟ip。

所以可以改改,将两台机器互相ping,防止网络问题。

vim check_keepalived.sh

#!/bin/bash

#检测keepalived脑裂脚本

#ping网关失败2次则关闭keepalived服务,成功2次则启动

#[使用设置]

#网关地址或者对方keepalived节点地址,互ping

getway_ip=192.168.1.1

#[自带变量]

check_ok=0

check_no=0

while [ 1 ]

do

ping -c 1 $getway_ip

if [[ $? -eq 0 ]];then

let check_ok++

else

let check_ok++

fi

if [[ $check_ok -eq 2 ]];then

systemctl start keepalived

check_ok=0

elif [[ $check_no -eq 2 ]];then

systemctl stop keepalived

check_no=0

fi

sleep 1

done

更改为单播

将方式改为单播,这样检测更加完善

vrrp_instance VI_1 {

state MASTER

interface enp0s8

virtual_router_id 51

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

#增加部分

unicast_src_ip 192.168.2.41 #本机ip

unicast_peer {

192.168.2.150 #其他机器ip,可多个

}

virtual_ipaddress {

192.168.2.99

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值