Keepalived学习笔记

来源:互联网

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

wps_clip_image-2777[3][1]

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正常完成以后会有一个类似下面的图

wps_clip_image-23664[3][1]

Keepalived的配置

在网上看到一些通过service命令进行控制的文章,不过我没成功。所以用的是命令启动的即/usr/local/keepalived/sbin/keepalived 启动的,具体启动选项可以看手册

-D 产生日志 默认到/vag/log/message

-f 指定配置文件

Keepalived安装完成以后

wps_clip_image-28020[3][1]在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。这里有很多文件,可以在这里寻求帮助

wps_clip_image-26750[3][1]

这个主要是通过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引用到实例中(先定义,后引用)下面贴出一段日志:

wps_clip_image-28368[3][1]

这是主控机上,关闭HTTP服务以后,触发了script降级处理,这个时候向外发布了一个通告,告诉别人“我的优先级为0,我死了”

wps_clip_image-12406[3][1]

这是备份机上,由于主控机的降级,那么备份机重新选举。完成主控权的接替。

3.Lvs+keepalived(略过lvs配置,DR模式)

网上有资料说,规则什么的直接在keepalived中配置就可以,不过最好还是按照顺序,先把lvs搭建起来以后,再做keepalived,出于故障的易于排除考虑。

具体配置参考官网的user guidance。

参考文档 user guidance   RFC2388(VRRP)

发表评论