Keepalived高可用--------别有相思处,啼鸟杂夜风
Keepalived
一、keepalive介绍
1.1、keepalived简介
keepalived是Linux下一个轻量级别的'高可用'解决方案,高可用(High Avalilablity )有两种不同的含义:广义来讲,是指整个系统的高可用,狭义的来讲就是主机的冗余和接管。
它与HeartBea RoseHA 实现相同类似的功能,都可以实现服务或者网络的高可用,但是又有差别,HeartBeat是一个专业的、功能完善的高可用软件,它提供了HA软件所需的基本功能,比如:'心跳检测'、'资源接管','检测集群中的服务',在集群节点'转移共享IP地址'的所有者等等。HeartBeat功能强大,但是部署和使用相对比较麻烦。
与HeartBeat相比,keepalived主要是通过虚拟路由冗余来实现高可用功能,虽然它没有HeartBeat功能强大,但是kepalived'部署和使用非常的简单',所有配置只需要一个配置文件就可以完成
1.2、Keepalived是什么?
Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三、第四层、第五层交换机'检测每个服务节点的状态'。如果某个服务节点出现一场,或者工作出现故障,keepalived将检测到,并将出现的故障的服务节点从集群系统中剔除,这些工作是自动完成的,不需要人工干涉,需要人工完成的知识修复出现故障的服务节点。
后来keepalived又加入了'VRRP的功能',VRRP(Vritrual Router Redundancy Protocol,虚拟路由冗余协议)出现的目的是'解决静态路由'出现的'单点故障'问题,通过VRRP可以实现网络'不间断稳定运行',因为keepalived一方面具有服务器'状态检测和故障隔离'功能,另一方面也有HA cluster功能。
总结:
1.监控每个服务节点的状态
2.发现故障自动剔除,然后切换
3.VRRP解决静态路由单点故障问题
1.3、VRRP协议与工作原理
在显示的网络环境中。主机之间的通信都是通过配置静态路由或者(默认网关)来完成的,而主机之间的路由器一旦发生故障,通信就会失效,因此这种通信模式当中,路由器就成了一个单点瓶颈,为了解决这个问题,就引入了'VRRP协议'。
VRRP是一种'主备模式'的协议,通过VRRP可以在网络发生故障时透明的进行设备切换而不影响主机之间的数据通信,这其中设计两个概念:'物理路由器'和'虚拟路由器'
VRRP可以将'两台或者多台物理路由器'设备虚拟称一个'虚拟路由',这个虚拟路由器通过'IP(一个或者多个)对外'提供服务,而在虚拟路由器内部十多个物理路由器协同工作,这台物理路由设备称为:'主路由器(Master角色)'一般情况下Master是由选举算法产生,它拥有对外服务的虚拟IP,提供各种网络功能,如:ARP请求,ICMP数据转发等。而且'其他的物理路由器'不拥有'对外'的虚拟IP,也不提供对外网络功能,'仅仅接收MASTART的VRRP状态通告信息',这些路由器被统称为'BACKUP',当'主路由器失败时'',处于BACKUP角色的备份路由器将重新进行选举。产生一个新的主路由器'进入MASTART角色,继续提供对外服务,整个切换对用户来说是完全透明的。
每个虚拟路由器都有一个'唯一的标识号',称为'VRID',一个'VRID'与'一组IP'地址构成一个虚拟路由器,在VRRP协议中,所有的报文都是通过IP广播方式发送的,而在一个虚拟路由器中,只有处于'Mastart'角色的路由器会'一直发送VRRP数据包',处于'BACKUP'角色的路由器指挥'接收'Master角色发过来的报文信息,用来监控Master运行状态,一般不会发生BACKUP抢占的情况,除非它的优先级更高,而当MATAER不可用时,BACKUP也就'无法接收到MASTER'发过来的信息,于是就认定master出现故障,接着多台BACKUP就会进行选举,'优先级最高的BACKUP'将成为新的'master',这种选举角色切换非常快,保证了服务的'持续可用性'。
1.4、Keepalived的工作原理
1.Keepalived工作在TCP/IP参考模型的三层、四层、五层也就是分别为:'网络层'、'传输层'、和'应用层',根据TCP/IP参考模型各层所能实现的功能,keepalived运行机制如下:
#网络层:
互联网IP协议、互联网可控制报文协议ICMP、地址转换协议ARP、反向地址转换协议RARP,在网络层kepalived在网络层采用最常见的工作方式是通过'ICMP协议'向服务器集群中的'每一个节点'发送一个'ICMP数据包(有点类似ping的功能)',如果某个节点'没有返回'响应数据包,那么认为该节点发生了'故障',keepalived将报告这个节点失效,并从服务器集群中'剔除'故障节点。
#传输层:
提供了两个主要的协议:传输控制协议TCP和用户数据协议UDP。传输控制协议'TCP'可以提供'可靠的数据输出服务、IP地址和端口',代表TCP的一个连接端,要获得TCP服务,需要在发送机的一个端口和接收机的一个端口上建立连接,而keepalived在传输层里利用'TCP协议的端口连接'和扫描技术来'判断'集群节点的'端口'是否正常,比如对于常见的web服务器80端口。或者SSH服务22端口,keepalived一旦在传输层探测到这些端口没有数据响应和数据返回,就认为这些端口发生异常,然后强制将这些端口所对应的节点服务从服务器集群种剔除掉。
#应用层:
可以运行FTP、TELNET、SMTP、DNS等各种不同类型的高层协议,keepalived的运行方式也更加全面化和复杂化,用户可以通过自定义keepalived工作方式,例如通过'编写程序或者脚本'来运行keepalived,而keepalived将根据用户的设定参数检测各种程序或者服务是否允许正常,如果keepalive的检测结果和用户设定的不一致时,keepalived会把对应的服务器从服务器集群中剔除。
二、Keppalived高可用
2.1、什么是高可用
一般是指2台机器启动这完全相同的业务系统,当有一台机器down机了,另外一台服务器就能快速的接管,对于访问的用户是无感知的。
2.2、常用的工具
1.硬件通常使用F5
2.软件通常使用 keepalived
硬件F5
F5是网络设备,它以一定的频率探测一组服务器的某个port端口服务是否正常,对外提供一个统一的虚拟IP,应用访问这个虚拟IP之后,F5将这个请求转发到服务器群组里面的可以提供服务的服务器上
然后返回信息也经过F5到请求端,所以F5还可以做负载均衡的工作,同时也提供了高可用的功能。
通常提供web服务的比较多一些,尤其是无连接状态的。数据库也可以使用F5,不过有些应用服务器在F5自身发生设备切换的时候重连容易出问题
软件 keepalived
2.3、keepalived如何实现高可用
1)涉及名词
keepalived软件是基于VRRP协议实现的,VRRP虚拟路由冗余协议,主要用于解决单点故障问题
ARP广播
VRRP协议
vip负责IP漂移
vmac负责通知ARP广播修改mac地址
2)例子
比如公司的网络是通过网关进行上网的,那么如果该路由器故障了,网关无法转发报文了,此时所有人都无法上网了,怎么办嘛?
通常做法就是给路由器增加一台备节点,但是问题是:如果我们的主网关master故障了,用户是需要手动指向backup的,如果用户过多修改起来会非常麻烦。
问题一:假设用户将指向都修改称backup路由器,那么master修好了怎么办?
问题二:假设master网关故障,我们将backup网关配置为master网关的IP是否可以?
其实是不行的,因为pc第一次通过ARP广播寻找到master网关的MAC地址个IP地址后,会将信息写道ARP缓存表中,那么PC之后连接都是通过那个缓存表的信息去连接,然后进行数据包的转发,即使我们修改了IP但是MAC地址是唯一的,PC的数据包依然会发送给master(除非缓存表过期,再次发起ARP广播的时候才能获取新的bakcip对应的MAC地址与IP地址)
如何才能做到出现故障自动转义,从事VRRP就出现了,我们的VRRP其实是通过软件或者硬件的形式再master和backup外面增加一个虚拟的MAC地址(VMAC)与虚拟IP地址(VIP),那么再这种情况下,pc请求VIP的时候无论是master处理还是backu+p处理,pc金辉在ARP缓存表中记录VMAC与VIP的信息。
3)高可用keepalived核心概念
1.如何确定谁是主节点,谁是备节点(选举投票:优先级)
2.如果master故障,backup自动接管,那么master恢复后会夺权嘛(抢占式、非抢占式)
3.如果两台服务器都认为自己是master会出现什么问题(脑裂)
主备节点:不是按照state:MASTER/BACKUP确定,按照优先级 priorify 100值大小来确定
抢占式和非抢占式
抢占式为:谁的优先级高,谁就是主节点,当优先级高的主节点故障停机,备节点成为主节点开始服务。当时优先级高的节点恢复服务,优先级会恢复成为新的主节点,被称为抢占式
非抢占式:当主节点故障停机,备节点成为主节点提供服务,当优先级高的节点恢复服务,不会切换节点服务器,该服务器继续提供服务,知道该节点服务器发生故障后才切换。需要设置:nopreempt ,优先级的参数不需要改变。
三、keepalive搭建
3.1、环境准备
| 主机 | IP | 身份 |
|---|---|---|
| lb01 | 172.16.1.4 | keepalived master |
| lb02 | 172.16.1.5 | keepalived backup |
| web01 | 172.16.1.7 | web端 |
| web02 | 172.16.1.8 | web端 |
| db01 | 172.16.1.51 | 数据库 |
| 172.16.1.3 | VIP |
3.2、保证所有七层负载均衡完全一致
同步数据
scp www.papacnb.com.conf lb02:/etc/nginx/conf.d/
scp -r /etc/nginx/ssl_key lb02:/etc/nginx/
下载 keepalived
yum install -y keepalived
3.3、配置keepalived
vim /etc/keepalived/keepalived.conf
#全局配置
global_defs {
#身份识别
route_id lb01
}
#配置 VRRP协议
vrrp_instance VI_1 {
#状态,MASTERT或者BACKUP
state MASTER
#绑定网卡
interface eth0
#虚拟路由标识,可以理解为分组
virtual_route_id 50
# 优先级
priority 100
#检测心跳间隔
advert_int 1
#配置认证
authentication {
# 认证类型
auth_type PASS
# 认证的密码
auth_pass 1111
}
# 设置VIP
virtual_ipaddress {
#虚拟的VIP地址
192.168.207.3
}
}
3.4、开启日志后启动服务
1. vim /etc/rsyslog.conf
# 新增log日志的生成地址
local0.* /var/log/keepalived.log
2. vim /etc/log/keepalived.log
# 更改日志格式内容,设置日志级别
KEEPALIVED_OPTIONS="-D -d -S 0"
启动keepalived
systemctl start keepalived
四、keepalived抢占式与非抢占式
抢占式就是投票选举,优先级高的先上。
非抢占式就是,检测到另外的机器down机了,另外一台才顶上。
抢占式
1.两个节点都启动,节点1优先级高于节点2,所有只有节点1上有VIP
2.如果节点2有VIP,节点2开启后,因为节点1比节点2优先级高,所以VIP会自动漂移到节点1上。
3.需要在'priority' 后面设定优先级,数字越大,优先级越高,当发现优先级在自己之下的有VIP,会抢占过来。
非抢占式
1.谁先启动,谁有VIP。
2.只有当有VIP主机down机后才会发生VIP漂移
3.两个节点,需要设置'nopreempt'参数在配置文件中,将'state'参数 全部改为'BACKUP',优先级数字不需要改变,可以用于区分。
非抢占式例子:
vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state BACKUP # 两台主机都要改为BACKUP
nopreempt # 两台主机都要增加该参数
proority 100 #另外一台要改变下,进行区分。
......
}
五、Keepalived脑裂
由于某些原因,导致两台keepalived高可用服务器在指定时间内,无法检测到对方心跳,各自'取得资源及服务的所有权',此时两台高可用服务器都在工作,负载均衡不受影响,但是'两台负载均衡同时'往web服务器'发送请求',web服务器会收到两遍请求,'增加'了web服务器的'压力'。
5.1、脑裂的故障
1.网线松动,网络故障
2.服务器硬件故障
3.服务器之间开启了防火墙
5.2、使用脚本解决脑裂
脑裂是什么状况?
两台搭载keepalived的负载均衡主机同时为主备节点,同时工作,一起工作倒没什么错误,
但是服务器要处理两次请求,压力会增加。
为什么会出现这种情况,可能是防火墙等等因素,备节点keepalived不能监测到主节点心跳,为了保证
业务正常开展,备节点扶持自己上位了。
#如何解决
1.建立远程连接,首先判断VIP是否在本主机
2.如果在本主机,建立远程连接,判断是否在备节点上。
3.如果两台同时存在VIP,则随机kill掉一台
!/bin/bash
VIP=192.168.207.3
LB01_IP=172.16.1.4
while :
do
ip a | grep $vip
if [ $? -eq 0 ];then
ssh $LB01_IP
ip a | grep $VIP
if [ $? -eq 0 ];then
exit
echo "keepalived脑裂,请及时处理"
fi
sleep 3
fi
done
六、高可用Keepalived与Nginx
Nginx默认监听在所有的IP地址上,VIP会漂到那台节点上,相当于那台Nginx多了VIP这么一个网卡,所以可以访问到Nginx所在机器
但是'Nginx宕机',会导致用户'请求失败',但是keepalived没有挂掉不会进行切换,所以需要编写一个'脚本检测'Nginx存活状态,如果'Nginx不存活',就'kill掉keepalived'。
6.1、Nginx故障切换脚本
nginx故障如何解决
keepalived存活,nginx 产生故障,相当于无法发送客户端请求到web服务器,这就有问题了
如何解决:
1.脚本检测nginx端口或者进程是否存在
2.如果不存在,重新启动nginx
3.比如3秒后检测还未启动,直接kill掉keepalived
4.这个脚本多台keepalived都需要有
5.脚本写完可以直接在keepalived配置文件中调用
!/bin/bash
while :
do
netstat -putln | grep '<80>'
if [ $? -ne 0 ];then
systemctl start nginx
sleep 3
netstat -putln | grep '<80>'
if [ $? -ne 0 ];then
systemctl stop keepalived
echo "Nginx故障" | mail -s "Nginx发生故障,已关闭keepalived,请处理" 411946773@qq.com
sleep 200
fi
fi
sleep 3
clear
done
6.2、keepalived配置自动执行脚本
vim /etc/keepalived/keepalived.conf
global_defs {
route_id lb01
}
#先定义脚本参数
vrrp_script check {
script "/etc/keepalived/chech.sh"
interval 5
}
调用脚本执行,调用在模块里面。
vrrp_instance VI_1 {
state MASTART
nopreempt
.....
track_script {
check
}
}

浙公网安备 33010602011771号