keepalived高可用

一、高可用介绍

1.什么是高可用

一般是指2台机器启动着完全相同的业务系统,当有一台机器down机了,另外一台服务器就能快速的接管,对于访问的用户是无感知的。

比如公司的网络是通过网关进行上网的,那么如果该路由器故障了,网关无法转发报文了,此时所有人都无法上网了,怎么办?

通常做法是给路由器增加一台备节点,但是问题是,如果我们的主网关master故障了,用户是需要手动指向backup的,如果用户过多修改起来会非常麻烦。

问题一:假设用户将指向都修改为backup路由器,那么master路由器修好了怎么办?
问题二:假设Master网关故障,我们将backup网关配置为master网关的ip是否可以?

其实是不行的,因为PC第一次通过ARP广播寻找到Master网关的MAC地址与IP地址后,会将信息写到ARP的缓存表中,那么PC之后连接都是通过那个缓存表的信息去连接,然后进行数据包的转发,即使我们修改了IP但是Mac地址是唯一的,pc的数据包依然会发送给master。(除非是PC的ARP缓存表过期,再次发起ARP广播的时候才能获取新的backup对应的Mac地址与IP地址)

如何才能做到出现故障自动转移,此时VRRP就出现了,我们的VRRP其实是通过软件或者硬件的形式在Master和Backup外面增加一个虚拟的MAC地址(VMAC)与虚拟IP地址(VIP),那么在这种情况下,PC请求VIP的时候,无论是Master处理还是Backup处理,PC仅会在ARP缓存表中记录VMAC与VIP的信息。

2.常用的工具

1.硬件通常使用 F5
2.软件通常使用 keepalived

3.keepalived是如何实现高可用的?

keepalived软件是基于VRRP协议实现的,VRRP虚拟路由冗余协议,主要用于解决单点故障问题

ARP广播
VRRP协议
vip负责IP漂移
vmac负责通知ARP广播修改mac地址

4.高可用keepalived核心概念

  1. .如何确定谁是主节点谁是备节点(选举投票,优先级)
  2. 如果Master故障,Backup自动接管,那么Master恢复后会夺权吗(抢占试、非抢占式)
  3. 如果两台服务器都认为自己是Master会出现什么问题(脑裂)

二、keepalived搭建

1.环境准备

主机 ip 身份
lb01 172.168.15.5 keepalived master
lb02 172.168.15.6 keepalived backup
web01 172.168.15.7 web端
weib02 172.168.15.8 web端

2.具体操作

先保证lb01和lb02上的nginx配置一模一样,都代理了web01、web02上的超级玛丽

1.部署keepalived

[root@lb01 conf.d]# yum install keepalived -y
[root@lb02 conf.d]# yum install keepalived -y

2.Keepalived配置

# 在lb01里

[root@lb01 ~]# vim /etc/keepalived/keepalived.conf    把之前的全删光
! Configuration File for keepalived

# 全局配置
global_defs {
   # 当前keepalived的唯一标识
   router_id lb01
}
# 配置VRRP协议
vrrp_instance VI_1 {
    # 状态,MASTER和BACKUP
    state MASTER
    # 绑定网卡
    interface eth0
    # 虚拟路由标示,可以理解为分组
    virtual_router_id 50
    # 优先级
    priority 100
    # 监测心跳间隔时间
    advert_int 1
    # 配置认证
    authentication {
        # 认证类型
        auth_type PASS
        # 认证的密码
        auth_pass 1111
    }
    # 设置VIP
    virtual_ipaddress {
        # 虚拟的VIP地址
        192.168.15.3   # 这里的ip要在上面绑定网卡的网段里
    }  
}
# 启动
[root@lb01 ~]# systemctl start keepalived

# 在lb02里

[root@lb02 ~]# vim /etc/keepalived/keepalived.conf    把之前的全删光
! Configuration File for keepalived

global_defs {
   router_id lb02  # 这里需要修改
}

# 配置VRRP协议
vrrp_instance VI_1 {
    # 状态,MASTER和BACKUP
    state BACKUP
    # 绑定网卡
    interface eth0  # 要和lb01里保持一致
    # 虚拟路由标示,可以理解为分组
    virtual_router_id 50
    # 优先级
    priority 90
    # 监测心跳间隔时间
    advert_int 1
    # 配置认证
    authentication {
        # 认证类型
        auth_type PASS
        # 认证的密码
        auth_pass 1111
    }
    # 设置VIP
    virtual_ipaddress {
        # 虚拟的VIP地址
        192.168.15.3
    }
}
# 启动
[root@lb02 ~]# systemctl start keepalived

3.验证

查看keepalive是否配置成功

image

image

image

image

现在192.168.15.3虚拟ip在lb01上, 在window上hosts文件加入192.168.15.3 youxi.com

image

关闭lb01

image

image

三.怎么解决keepalived的脑裂问题

1.什么是keepalived的脑裂

两台高可用服务器在指定时间内,无法互相检查到对方的心跳而各自启动故障转移功能。各自取得资源及服务的所有权,而此时的两台高可用服务器又都还活着。(都认为自己是master)
1.网线松动,网络故障
2.服务器硬件故障
3.服务器之间开启了防火墙

实际案例:

1、如果Nginx宕机怎么办?(不属于脑裂)
想办法告诉keepalived,Nginx的情况。

2、局域网之内,keepalived无法相互广播,怎么办?()
判断VIP是否可以ping的通

2.解决办法

问题1((不属于脑裂)):如果Nginx宕机怎么办?

# lb01是master
# 在lb01里写下面这个脚本

[root@lb01 keepalived]# pwd
/etc/keepalived
[root@lb01 keepalived]# vim checkNG.sh 
#!/bin/bash

# 解决Nginx无法正常启动
ps -ef | grep -q [n]ginx 

if [ $? -ne 0 ];then
	# 代表Nginx未正常启动
	systemctl start nginx &>/dev/null
	sleep 2
	ps -ef | grep -q [n]ginx
	if [ $? -ne 0 ];then
		systemctl stop keepalived 
	fi
fi

# 知识储备 $?  : 上一条命令执行的结果。

# 增加可执行权限
[root@lb01 keepalived]# chmod +x checkNG.sh

# 修改keepalived配置文件
[root@lb01 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

# 全局配置
global_defs {
   # 当前keepalived的唯一标识
   router_id lb01
}

# 检测脚本
vrrp_script check_nginx {
	# 指定脚本路径
    script "/etc/keepalived/checkNG.sh"
    # 执行间隔
    interval 5
}

# 配置VRRP协议
vrrp_instance VI_1 {
    # 状态,MASTER和BACKUP
    state MASTER
    # 绑定网卡
    interface eth0
    # 虚拟路由标示,可以理解为分组
    virtual_router_id 50
    # 优先级
    priority 100
    # 监测心跳间隔时间
    advert_int 1
    # 配置认证
    authentication {
        # 认证类型
        auth_type PASS
        # 认证的密码
        auth_pass 1111
    }
    # 设置VIP
    virtual_ipaddress {
        # 虚拟的VIP地址
        192.168.15.3
    }
    # 调用检查
    track_script {
        check_nginx
    }
}

问题2(脑裂):

局域网之内,keepalived无法相互广播,怎么办?

#如果发生闹裂,则随机kill掉一台即可
#在备上编写检测脚本, 测试如果能ping通主并且备节点还有VIP的话则认为产生了脑裂
[root@lb02 ~]# vim check_split_brain.sh
#!/bin/sh
vip=192.168.15.3
lb01_ip=192.168.15.5
while true;do
    ping -c 2 $lb01_ip &>/dev/null
    if [ $? -eq 0 -a `ip add|grep "$vip"|wc -l` -eq 1 ];then
        echo "ha is split brain.warning."
    else
        echo "ha is ok"
    fi
sleep 5
done
 
[root@lb02 ~]# vim check_keepalive.sh 
#!/bin/sh
vip=10.0.0.3
lb01_ip=172.16.1.4
while true;do
    ssh $lb01_ip 'ip addr | grep 10.0.0.3' &>/dev/null
    if [ $? -eq 0 -a `ip add|grep "$vip"|wc -l` -eq 1 ];then
        echo "ha is split brain.warning."
    else
        echo "ha is ok"
    fi
sleep 3
done

四.keepalived的非抢占式

1.什么加抢占式和非抢占式

当lb01宕机的时候lb02会把虚拟ip抢过去,然后lb01维修好后,又会把vip抢回来(因为lb01的优先级高)这种就叫抢占式.

当lb01宕机的时候lb02会把虚拟ip抢过去,然后lb01维修好后,不会把vip抢回来,这种就叫非抢占式.

为什么要设置非抢占式?
因为lb01在恢复之后会把vip抢回来,在这段过程中服务会不稳定,这样会造成用户的体验比较差,而且本身就没有再切换回去的必要,除非lb02宕机了,那lb01会自动抢回去.

2.非抢占设置

实现非抢占式。
1、状态全部都设置成backup
2、增加 nopreempt
eg:
[root@lb02 ~]# vim /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
   router_id lb02
}

# 检测脚本
vrrp_script check_nginx {
    # 指定脚本路径
    script "/etc/keepalived/checkNG.sh"
    # 执行间隔
    interval 5
}

# 配置VRRP协议
vrrp_instance VI_1 {
    #状态,MASTER和BACKUP
    state BACKUP    # lb01这里要把MASTER改成BACKUP
    # 开启非抢占式
    nopreempt    # lb01这里也添加
    #绑定网卡
    interface eth0
    #虚拟路由标示,可以理解为分组
    virtual_router_id 50
    #优先级
    priority 90
    #监测心跳间隔时间
    advert_int 1
    #配置认证
    authentication {
        #认证类型
        auth_type PASS
        #认证的密码
        auth_pass 1111
    }
    #设置VIP
    virtual_ipaddress {
        #虚拟的VIP地址
        192.168.15.3
    }
    # 调用检查
    track_script {
        check_nginx
    }
}
posted @ 2022-01-10 18:48  zong涵  阅读(138)  评论(0编辑  收藏  举报