一 、keepalived简介


   

keepalived:它的诞生最初是为ipvs(一些服务,内核中的一些规则)提供高可用性的,最初最主要目的是能够自主调用ipvsadm来生成规则,并且能够自动实现将用户访问的地址转移到其他节点上进行实现的。
keepalived:核心包含两个ckechers和VRRP协议。

   

   

ckeckers
#检查服务检查reserved的健康状况的,基于脚本也可以服务本身的健康状况。这里是实现ipvs后端健康状况的检测的。
VRRP
# Virtual Router Redundancy Protocol 虚拟路由器冗余协议  -----keepalived依赖的最重要的核心技术

   


二、VRRP协议详解


   (一)VRRP技术优点

     

VRRP是一种容错协议,它保证当主机的下一跳路由器出现故障时,由另一台路由器来代替出现故障的路由器进行工作,从而保持网络通信的连续性和可靠性, VRRP中每个节点之间都有优先级的一般为0-255 (0,255有特殊用法)数字越大优先级越高。
1、简化网络管理。
#在具有多播或广播能力的局域网(如以太网)中,借助VRRP 能在某台设备出现故障时仍然提供高可靠的缺省链路,有效避免单一链路发生故障后网络中断的问题,而无需修改动态路由协议、路由发现协议等配置信息,也无需修改主机的默认网关配置。
                                                                                                                                                                                                                                                                                                                                                                                                                                                   
2、适应性强。
#VRRP 报文封装在IP 报文中,支持各种上层协议。
                                                                                                                                                                                                                                                                                                                                                                                                                                                 
3、网络开销小。
#VRRP 只定义了一种报文——VRRP 通告报文,并且只有处于
Master 状态的路由器可以发送VRRP 报文。


   (二)VRRP协议中的相关术语


     

1 虚拟路由器
#由一个 Master 路由器和多个Backup 路由器组成。主机将虚拟
路由器当作默认网关。 
2 VRID
#虚拟路由器的标识。有相同VRID 的一组路由器构成一个虚拟路由器。
3 Master 路由器
#虚拟路由器中承担报文转发任务的路由器。
4 Backup 路由器
#Master 路由器出现故障时,能够代替Master 路由器工作的路由器。
5 虚拟 IP 地址
#虚拟路由器的IP 地址。一个虚拟路由器可以拥有一个或多个IP 地址。
6 IP 地址拥有者
#接口IP 地址与虚拟IP 地址相同的路由器被称为IP 地址拥有者。
7 虚拟 MAC 地址
#一个虚拟路由器拥有一个虚拟MAC 地址。虚拟MAC 地址的格式为00-00-5E-00-01-{VRID}。通常情况下,虚拟路由器回应ARP 请求使用的是虚拟MAC 地址,只有虚拟路由器做特殊配置的时候,才回应接口的真实MAC 地址。
8 优先级
# VRRP 根据优先级来确定虚拟路由器中每台路由器的地位。
9 非抢占方式
#如果 Backup 路由器工作在非抢占方式下,则只要Master 路由器没有出现故障,Backup 路由器即使随后被配置了更高的优先级也不会成为Master 路由器。
10 抢占方式
#如果Backup 路由器工作在抢占方式下,当它收到VRRP 报文后,会将自己的优先级与通告报文中的优先级进行比较。如果自己的优先级比当前的Master 路由器的优先级高,就会主动抢占成为Master 路由器;否则,将保持Backup 状态。



   (三)VRRP的工作过程

       

1   Master 路由器的选举;
2   Master 路由器状态的通告;
3   同时,为了提高安全性,VRRP 还提供了认证功能;


   (四) VRRP主备备份

     

主备备份方式表示业务仅由Master路由器承担。当Master路由器出现故障时,才会
由选举出来的Backup路由器接替它工作,如图


    轻量级高可用实现工具--keepalived详解_第1张图片

     

#初始情况下,Device A是Master路由器并承担转发任务,Device B和Device C是Backup路由器且都处于就绪监听状态。如果Device A发生故障,则虚拟路由器内处于Backup状态的Device B和Device C路由器将根据优先级选出一个新的Master路由器,这个新Master路由器继续为网络内的主机转发数据。


   

     (五)VRRP负载分担


   

在路由器的一个接口上可以创建多个虚拟路由器,使得该路由器可以在一个虚拟路
由器中作为Master路由器,同时在其他的虚拟路由器中作为Backup路由器。
负载分担方式是指多台路由器同时承担业务,因此负载分担方式需要两个或者两个
以上的虚拟路由器,每个虚拟路由器都包括一个Master路由器和若干个Backup路
由器,各虚拟路由器的Master路由器可以各不相同,


    轻量级高可用实现工具--keepalived详解_第2张图片



三、keepalived 原理详解


 

     
#keepalived也是模块化设计,不同模块负责不同的功能,下面是keepalived的组件
   core  check   vrrp   libipfwc  libipvs-2.4  libipvs-2.6
           
core
#是keepalived的核心,负责主进程的启动和维护,全局配置文件的加载解析
check
#负责healthchecker(健康检查),包括各种健康检查方式,以及对应的配置的解析包括LVS的配置解析
vrrp 
#VRRPD子进程,VRRPD子进程就是来实现VRRP协议的
libipfwc
#iptables(ipchains)库,配置LVS会用到
libipvs* 
#配置LVS会用到

   

            keepalived模块化结构

   轻量级高可用实现工具--keepalived详解_第3张图片

       

keepalived 启动后会启动三个进程 如下所示:
                                                                                                                                                                                                                                                                                                                      
     PID
     111  Keepalived    <--Parent process monitoring children  父进程
     112  \_Keepalived  <--VRRP child   VRRP子进程
     113  \_Keepalived <--Healthchecking child healthchecker子进程
                                                                                                                                                                                                                                                                                                             

   

如上图所示:
#两个子进程都被系统WatchDog看管,两个子进程各自复杂自己的事healthchecker子进程复杂检查各自服务器的健康程度,例如HTTP,LVS等等,如果healthchecker子进程检查到MASTER上服务不可用了,就会通知本机上的兄弟VRRP子进程,让他删除通告,并且去掉虚拟IP,转换为BACKUP状态。

 

 

   

四 、keepalived 配置文件介绍


   

keepalived 安装
#yum -y install  keepalived   
keepalived 只有一个配置文件,该配置文件中有多个配置区域 /etc/keepalived/keepalived.conf
#分别为:global_defs (全局配置区域)、vrrp_script (脚本区域)、vrrp_instance(实例区域)、virtual_server(虚拟服务器区域)

 

   各个区域配置详解

 

   

1 global_defs区域 :主要配置故障发生时的通知对象以及机器标识
 global_defs {
 notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
 }          

         

上述参数解析
# notifacation_email   故障发生时给谁发邮件通知
# notifacation_email_from 通知邮件从哪个地址发出
# smpt_server             通知邮件的smtp地址
# smtp_cnnect_timeout     连接smtp服务器的超时时间
# router_id         标识本节点的字条串,通常为hostname,但不一定非得是hostname。故障发生时,邮件通知会用到



   

2  vrrp_script 脚本区域
                                                                                                                                                             
  vrrp_script chk_haproxy {
    script "killall -0 haproxy"
    interval 1
    weight 2
  }

   

上述参数解析
#vrrp_script   定义vrrp_script 区域名称
#script        所要执行的脚本
#interval      脚本执行的间隔时间
#weight        脚本执行结果导致的优先级变更

   

   

3 vrrp_instance 实例区域:用来定义对外提供服务的VIP区域及相关属性
  vrrp_instance VI_1 {
    interface eth0
    state MASTER 
    priority 101
    virtual_router_id 51
    garp_master_delay 1
                                                                                                                                                
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_interface {
       eth0  
    }
    virtual_ipaddress {
        172.16.100.1/16 dev eth0 label eth0:0
    }
    track_script {
        chk_haproxy
                                                                                                                                                     
    }
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
}


    :

上述参数解析
#vrrp_instance : 定义实例名称
#state         :可以是MASTER或BACKUP,不过当其他节点keepalived启动时,会依据prioroty进行比较来选举MASTER
#interface     : 节点固有IP的网卡,用来发送VRRP包
#virtual_router_id  : 取值在0-255之间,用来区分多个instence之间的VRRP组播
#priority        : 用来选举master
#advert_int      : master向外通告VRRP信息的间隔 ,默认为1s
#garp_master_delay  :转换为master时,对延迟设定的定时器
#authentication     :设置认证信息
#auth_type PASS     :认证方式,可以是PASS或AH两种认证方式
#auth_pass          :设置认证密码
#track_interface    :追踪的端口
#virtual_ipaddress  :设置浮动ip---VIP
#track_script       :对vrrp_script脚本区域中定义的脚本进行追踪
#chk_haproxy        :对这个区域进行追踪
                                                                                                                                                    
#notify_master /path/to/to_master.sh :切换到MASTER状态要发的通知
#notify_backup/path/to/to_backup.sh  :切换到BACKUP状态要发的通知
#notify_fault "/path/fault.sh VG_1"  :故障时要执行的通知
                                                                                                                                                
注:以上三个参数指定的脚本需要自己定义



   

4 virtual_server 区域:定义与lvs相关的集群服务和集群服务中的realserver
  virtual_server 172.16.7.1 80 {
    delay_loop 6
    lb_algo wlc
    lb_kind DR
    persistence_timeout 0   
    protocol TCP
    sorry_server 127.0.0.1 80
    real_server 172.16.7.200 80 {  
        weight 3
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 172.16.7.201 80 {  
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

 

   

上述参数解析
virtual_server 172.16.7.1 80
#对外通过ip地址172.16.7.1 提供80端口的服务
delay_loop
#延迟轮询时间(s)
lb_algo 
#后端指定的调度算法
lb_kind  
#调度模式
nat_mask 
#网络地址
persistence_timeout 
#会话保持时间(s),用户在50s内被分配到同一个后端realserver
protocol  TCP
#健康检查使用的TCP协议
sorry_server
#当所有机器都出现故障时使用的服务器
real_server   
#后端真实节点主机的权重等设置,(主要),后端有几台这里就要设置几个
weight
#每一台realserver 的权重
TCP_CHECK
#健康状态检测方式
connect_port
#连接的端口
connect_timeout
#超时时长
nb_get_retry 
#重试次数
delay_before_retry
#下次重试的时间延迟
在realserver也可以自定义服务器状态发生变化后执行的脚本
      notify_up  | 
      检查服务器正常(up)后,要执行的脚本
       notify_down  | 
      检查服务器失败(down)后,要执行的脚本





   PS:水平有限,关于更多的参数详解及概念请参阅官网www.keepalived.org及 man keepalived.conf 获得。