keepalived高可用

内容概述

1.什么是高可用?
2.高可用常用的工具
3.keeplived是怎样实现高可用的?
-3.1 名词解释
-3.2 举例说明
4.高可用keepalived核心概念
5.keepalived搭建
6.keepalived的抢占式和非抢占式
7.keepalived常见问题以及解决方式
-7.1 什么是keepalived脑裂?
-7.2 脑裂的解决办法
8.nginx与高可用keepalived
-8.1 nginx故障切换脚本
-8.2 使用keepalived配置文件调用nginx切换脚本

内容详细

1.什么是高可用?

高可用一般指两台部署并运行着完全一样服务的服务器,如果其中一台发生故障宕机,另外一台将快速接管业务。这个过程对于用户来说是感知不到的。

2.高可用常用的工具

硬件上我们使用 F5
软件我们通常使用 keepalived	# 一些云服务器不支持keepalived,这些服务器一般本身就是高可用负载均衡。

3.keeplived是怎样实现高可用的?

3.1 名词解释

首先,keepalived软件基于VRRP协议实现,VRRP协议又叫虚拟路由冗余协议,一般用来解决单点故障。
它的工作方式是在局域网中不间断的广播,不间断探测,当探测到对方发生故障时,则立即使VIP漂移到指定的节点。
keepalived 的优点是实现了IP的漂移
缺点:
	1.云主机不支持
	2.容易脑裂(即多个节点上同时产生了相同的VIP)
	3.一般只在公司内部使用

3.2 举例说明

比如公司的网络是通过网关进行上网的,那么如果该路由器故障了,网关无法转发报文了,此时所有人都无法上网了,怎么办?
 
	通常做法是给路由器增加一台备节点,但是问题是,如果我们的主网关master故障了,用户是需要手动指向backup的,如果用户过多修改起来会非常麻烦。
 
问题 1:假设用户将指向都修改为backup路由器,那么master路由器修好了怎么办?
问题 2:假设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的信息。

4.高可用keepalived核心概念

1.该怎样确定谁是主节点,,谁是备用节点?(涉及到优先级的问题)
2.如果Master出现故障,Backup自动接管,那么Master恢复后会将业务接管回来吗?(抢占式和非抢占式)
3.如果两台服务器都认为自己是Master会出现什么问题?(脑裂)

5.keepalived搭建

环境:准备两台完全一样的七层负载均衡服务器(lb01和lb02)
	 VIP:192.168.174.110
1.安装高可用软件
两台机器都装:yum install keepalived -y
2.修改配置文件

配置主节点的配置文件(lb01)
vim /etc/keepalived/keepalived.conf
# 全局配置
global_defs {
	# 身份识别	(router_id在集群中不能重复)
    router_id lb01
}
# 配置VRRP协议
vrrp_instance VI_1 {
	# 状态/身份 MASTER和BACKUP	指定是否是MASTER节点
	# 即使指定了MASTER,也不能够将其设置为MASTER节点
    state BACKUP
    # 绑定网卡(指定代理的网卡)
     nopreempt
     # 开启非抢占式
    interface eth0
    # 虚拟路由标识,可以理解为分组
    virtual_router_id 50
    # 权重,权重越高,VIP分配的权重就越高(0 ~ 100) 优先级
    priority 100
    # 检测心跳的间隔时间
    advert_int 1
    # 为集群设置认证
    authentication {
    	# 认证的类型
        auth_type PASS
        # 认证的密码
        auth_pass 123456
    }
    # 配置VIP
    virtual_ipaddress {
    	# 虚拟的IP地址
        192.168.174.110
    }
}

配置备用节点的配置文件(lb02)
global_defs {
    router_id lb02
}
 
vrrp_instance VI_1 {
    state BACKUP
     nopreempt
    interface eth0
    virtual_router_id 50
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.174.110
    }
}
两台服务器都启动keepalived
systemctl start keepalived.service

# keepalived 开启日志
# 配置keepalived
vim /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -d -S 0"
# 配置rsyslog抓取日志
 vim /etc/rsyslog.conf
 local0.*        /var/log/keepalived.log
 # 重启服务即可
 systemctl restart keepalived rsyslog

6.keepalived的抢占式和非抢占式

	默认情况下,keepalived是抢占式的,抢占式会导致访问故障,所以一般情况下我们用非抢占式。
1.两个节点都启动的情况
# 因为节点一优先级比节点二高,所以只有节点一上有VIP
ip addr | grep 192.168.174.110
inet 192.168.174.110/32 scope global eth0

2.停止主节点后,由于节点一keepalived挂掉,节点一会自动接管节点二的工作,即VIP。
这时lb02:ip addr | grep 192.168.174.110
inet 192.168.174.110/32 scope global eth0

3.重新启动主节点,因为节点一优先级高于节点二,所以当节点一恢复时,会把VIP抢占回来。
ip addr | grep 192.168.174.110
inet 192.168.174.110/32 scope global eth0

4.我们需要配置非抢占式
# 主节点配置
vim /etc/keepalived/keepalived.conf
... ...
vrrp_instance VI_1 {
    state BACKUP
    #开启非抢占式
    nopreempt
    priority 100
... ...
}
重启keepalived
systemctl restart keepalived。service

# 备用节点配置
vim /etc/keepalived/keepalived.conf
... ...
vrrp_instance VI_1 {
    state BACKUP
    #开启非抢占式
    nopreempt
    priority 90
... ...
}
重启keepalived
systemctl restart keepalived.service
# 总结
1.两个节点的state都必须配置为BACKUP
2.两个节点都必须加上配置 nopreempt
3.其中一个节点的优先级必须要高于另外一个节点的优先级
4.两台服务器都角色状态启用nopreempt后,必须修改角色状态统一为BACKUP,它们唯一的区分就是优先级不同

7.keepalived常见问题以及解决方式

7.1 什么是keepalived脑裂?

因为某些原因,导致两台keepalived高可用服务器在指定的时间内,无法检测到对方的"心跳",各自取得了资源以及服务的所有权,原来被一个节点访问的资源就会出现被多个节点同时访问的情况,,这种情况就是脑裂。

可能导致脑裂的情况:
1.网线松动,网络故障
2.服务器硬件出现问题
3.服务器之间开启了防火墙

7.2 脑裂的解决办法

我们从原理来解决问题,如果发生脑裂,那么则随机kill掉一台即可。
# 我么可以尝试编写测试脚本,测试如果能ping通主节点,并且备用节点还有VIP的话,我们就认为产生了脑裂。
编写检测脚本:
lb01:
#!/bin/sh
vip=192.168.174.110
lb01_ip=192.168.174.5
while true ;
do
    ping -c 2 $lb01_ip &>/dev/null
    if [ $? -eq 0 -a `ip a | grep "$vip"|wc -l` -eq 1 ] ; then
        echo "脑裂发生......"
    else
        echo "一切正常"
    fi
sleep 5
done

lb02:
#!/bin/bash
vip=192.168.174.110
lb01_ip=172.16.1.5
while true ;
do
   ssh $lb01_ip 'ip a | grep 192.168.174.5' & > /dev/null
    if [ $? -eq 0 -a `ip a | grep "$vip"|wc -l` -eq 1 ] ; then
        echo "脑裂发生......"
    else
        echo "一切正常"
    fi
sleep 5
done

8.nginx与高可用keepalived

8.1 nginx故障切换脚本

nginx默认监听在所有的ip地址上,VIP会随机漂移到一台节点上,相当于那台nginx主机多了VIP这块网卡,所以我么可以通过该ip访问到这台nginx主机。
问题是,如果nginx主机宕机了,用户访问失败,而keepalived没有挂掉不会就不会切换。
所以我们需要一个脚本来检测nginx存活状态,如果不存活我们就kiil掉keepalived。
#!/bin/sh
# 判断Nginx是否存活,如果不存活则尝试启动Nginx
netstat -nutlp | grep -E '\<80\>'
if [ $? -ne 0 ];then
	systemctl restart nginx
# 等待3秒后再次获取一次Nginx状态
    sleep 3
# 再次进行判断, 如Nginx还不存活,则停止Keepalived,让地址进行漂移,并退出脚本  
    netstat -nutlp | grep -E '\<80\>'
    if [ $nginxpid -eq 0 ];then
        systemctl stop keepalived
    fi
fi
 
# 给脚本增加执行权限
chmod +x /root chick_nginx.sh

8.2 使用keepalived配置文件调用nginx切换脚本

1.配置抢占式
# 只需要在备用节点配置
vim /etc/keepalived/keepalived.conf 
global_defs {
    router_id lb02
}
# 每5秒执行一次脚本,脚本执行内容不能超过5秒,否则会中断再次重新执行脚本
vrrp_script check_nginx {
    script "/root/check_nginx.sh"
    interval 5
}
...
# 调用计划的脚本
track_script {
        check_nginx
    }
}
2.配置非抢占式
# 配置非抢占式时,两边都要配置脚本
3.进行测试
	1)将VIP所在的机器nginx的配置文件修改错误
	2)停止nginx
	3)查看VIP是否切换
posted @ 2021-08-23 16:29  堇雪月寒风  阅读(107)  评论(0编辑  收藏  举报
Live2D