来源:互联网
The main goal of the keepalived project is to add a strong & robust keepalive facility to the Linux Virtual Server project(LVS).Keepalived implements a framework based on three family checks : Layer3, Layer4 & Layer5/7. This framework gives the daemon the ability of checking a LVS server pool states. When one of the server of the LVS server pool is down, keepalived informs the linux kernel via a setsockopt call to remove this server entrie from the LVS topology.
Keepalived 是基于LVS的一个扩展。实现失效备援和健康状态检测。
其中失效备援是基于VRRP
将抗状态见车是基于healthcheck
Keepalived默认启动会启动两个进程,一个是vrrp的,另一个就是healthcheck
VRRP(Virtual Router Redundancy Protocol)虚拟路由冗余协议
工作原理:在VRRP中有两组重要的概念。VRRP路由器和虚拟路由器,主控路由器和备份路由器。VRRP路由器是指运行VRRP的路由器,是物理实体,虚拟路由器是指VRRP协议创建的,是逻辑概念。一组VRRP路由器协同工作,共同构成一台虚拟路由器。 Vrrp中存在着一种选举机制,用以选出提供服务的路由即主控路由,其他的则成了备份路由。当主控路由失效后,备份路由中会重新选举出一个主控路由,来继续工作,来保障不间断服务。
其中主控的选举是依靠优先级的设定(0-255)可设定范围1-254.
VRRP协议使用多播数据来传输VRRP数据,VRRP数据使用特殊的虚拟源MAC地址发送数据而不是自身网卡的MAC地址,VRRP运行时只有MASTER路由器定时发送VRRP通告信息,表示MASTER工作正常以及虚拟路由器IP(组),BACKUP只接收VRRP数据,不发送数据,如果一定时间内没有接收到MASTER的通告信息,各BACKUP将宣告自己成为MASTER,发送通告信息,重新进行MASTER选举状态。
配置VRRP协议时需要配置每个路由器的虚拟路由器ID(VRID)和优先权值,使用VRID将路由器进行分组,具有相同VRID值的路由器为同一个组,VRID是一个0~255的正整数;同一组中的路由器通过使用优先权值来选举MASTER,优先权大者为MASTER,优先权也是一个0~255的正整数。
Vrrp路由器有三种状态Initialize Master Backup .
Inittialize即初始化状态,是在选举开始之前的状态
Backup即备份机状态,监控主控机状态,并准备随时接替,无缝链接
1) 不对目标地址为VIP的arp包回应
2) 丢弃目标MAC为虚拟路由器MAC的包
3) 丢弃目标IP是VIP的包
4) 如果规定时间内没有接收到master的vrrp通告,将会发出通告,重新选举
选举时,会考虑到优先级,IP地址打下,还有一个特殊选项即nopreempt(下面有讲解)
Master即主控机状态,是真实转发目标IP为VIP的包的路由
1) 必须对目标IP为VIP的ARP请求处理
2) 必须对目标MAC为虚拟路由器的MAC处理
3) 必须接受和VIP有关的数据包
4) 当出现故障的时候,会先取消adver_timer,发出一个宣称自己的优先级降为0的通告,进入初始化状态。
具体内容看RFC文档。
Keepalived的安装
安装过程很简单confiugre && make && make install 具体选项可以./configure –help 。configure正常完成以后会有一个类似下面的图
Keepalived的配置
在网上看到一些通过service命令进行控制的文章,不过我没成功。所以用的是命令启动的即/usr/local/keepalived/sbin/keepalived 启动的,具体启动选项可以看手册
-D 产生日志 默认到/vag/log/message
-f 指定配置文件
Keepalived安装完成以后
在etc/keepalived/samples会有一堆配置文件的范本,可供参考。启动文件就在sbin下。
一些详细信息,可以通过man keepalived.conf获得。主配文件中常用的有三部分global setting、vrrpd setting、lvs setting(如果没有lvs可不写)。
配置文件都是用{}进行分割的,如:
global_defs {
router_id ***
}
学习过程中global中的router_id 与 vrrpd设置中的virtual_router_id搞混淆了,解释一下:router_id是全局定义,定义的是该设备的一个名称,而virtual_router_id是用来分组的,RFC文档中有下面这段话,即一个分组一个id号,并且一个接口可以同时属于多个分组,即多个实例名对应多个id号,分清楚。范围(1-255)
Virtual Rtr ID (VRID)
The Virtual Router Identifier (VRID) field identifies the virtual
router this packet is reporting status for. Configurable item in the
range 1-255 (decimal). There is no default.
其实keepalived配置文件中很大一部分都是围绕vrrp协议进行制定的,所以有很多配置选项都可以在vrrp的RFC文档中找到相关的解释。
1. 一个简单的配置文件
global_defs {
router_id LB1
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.2.100/24 dev eth0 scope global label eth0:1
}
}
主控上可以这样写,备份上修改一下router_id(主要是为了思路清晰,其实可以不更改),state 和 priority就可以。
这样能实现的效果是,当主控机down掉以后,备份机能够迅速的启动。不过这样设置还是有问题的,就是不能监控服务状态,比如说两个web做ha,主控的web故障down掉,但是keepalived依然可以对外发送vrrp报文,告诉备份机“我还活着”,这样就出现故障了。这个下面再写,这里主要分析下选项。
State只是定义了一个初始状态,并不是说它一定就是主控。如过没有nopreempt项,并且另外一台机器的优先级高于这一台的150,那么,另外一台机器就会将主控权夺走。但是如果优先级更高的机器配置了nopreempt,那么这一台优先级150尽管低,但是还是master
Advert_int 就是检查间隔,就是发送报文的间隔。RFC中有如下的定义
6.2. Timers
Master_Down_Timer Timer that fires when ADVERTISEMENT has not
been heard for Master_Down_Interval.
Adver_Timer Timer that fires to trigger sending of
ADVERTISEMENT based on
Advertisement_Interval.
然后就是认证,vrrp本身有三种认证类型(RFC2338 5.3.6) Auth Type
The authentication methods currently defined are:
0 - No Authentication
1 - Simple Text Password
2 - IP Authentication Header
Keepalived支持两种认证类型即PASS与AH
Virtual_ipaddress是定义vip的,有两种格式,一种就是看见的那种,另一种就是只写一个ip就可以,不过两者相比,前一种可以在ifconfig命令中查看到,而后者是在ip add中看到的。
Nopreempt项:在实际生产环境中,当master故障停止以后,由backup接替工作,如果此时原先的master正常了,正常情况下,又会重新选举,来切换主控权,这是不能容忍的,所以有了这个选项。这个选项对应的是vrrp RFC文档中的preempt_mod,又来决定是否让高优先级的备份机来重新选举夺得低优先级的master的主控权。有两个值,一个是FALSE即不抢夺,一个是TRUE即抢夺,默认是TRUE,所以就有了 nopreempt。
2.keepalived的双机HA
这里就是对上一个例子的一个补充,来解决如果网络没有问题但是服务down掉而主控没有切换的情况。网上找资料,很少…。还是看范例etc/keepalived/samples/下面有一个文件******.localcheck。这里有很多文件,可以在这里寻求帮助
这个主要是通过vrrp_script实现的,看范例:
vrrp_script chk_httpd { ##chk_httpd 定义一个名字
script "killall -0 httpd" ##
interval 2 ##检查间隔时间
weight -200 ##优先级降级多少
}
然后再在vrrp_instance里面加上:
track_script {
chk_httpd
}
个人理解,不太严密,script后面执行一个命令或者一个脚本,如果返回值非0,则对这个实例的优先级进行更改,算法就是 weight后面的值,本例中也就是 -200
然后将这个vrrp_script引用到实例中(先定义,后引用)下面贴出一段日志:
这是主控机上,关闭HTTP服务以后,触发了script降级处理,这个时候向外发布了一个通告,告诉别人“我的优先级为0,我死了”
这是备份机上,由于主控机的降级,那么备份机重新选举。完成主控权的接替。
3.Lvs+keepalived(略过lvs配置,DR模式)
网上有资料说,规则什么的直接在keepalived中配置就可以,不过最好还是按照顺序,先把lvs搭建起来以后,再做keepalived,出于故障的易于排除考虑。
具体配置参考官网的user guidance。
参考文档 user guidance RFC2388(VRRP)