为什么使用keepalived呢?

在服务器集群情况下,会用到lvs或者nginx做调度,如果调度器是单台设备就会出现单点故障的问题。

也就是说,当单台调度器故障,无法完成调度,造成站点无法提供服务。

所以为了避免这样的情况,一般调度器会使用多台做高可用。而keepalived就是在这方面的典型代表。


keepalived的底层功能是vrrp协议

vrrp叫做虚拟路由冗余协议,在路由器、三层交换机上使用广泛,如思科、华为的路由器产品一般都会支持vrrp协议。

当然思科有自己的类似vrrp协议叫做hsrp,其功能都是一样的。


vrrp由以下几个部分组成

真实路由器:即物理设备;

虚拟路由器:由两台或者多台物理机器组成,具有相同的VRID的物理机器即认为在同一个虚拟路由器组中;

VIP:虚拟路由器的ip地址,也是多个物理主机公用的ip地址;

VMAC:虚拟mac地址,默认是00-00-5e-00-01-VRID;

MASTER:多台物理机器组成逻辑上的一台虚拟路由器,其中只有一台机器是能够转发数据的这台机器就是MASTER。我们称为主设备;

BACKUP:其他机器就是BACKUP起备份作用,我们称为备设备;

priority:区分master和backup的决定参数就是优先级,默认优先级是100,而且值越大越优先;


通告:

主设备与备设备是通过协商优先级来决定的,而且是周期性检查优先级,这样可以保证在超时时间内收不到master的通告消息,backup就认为其down掉,

从而自己充当主设备来转发数据;

工作方式:

抢占模式和非抢占模式,抢占模式即当主设备从故障中恢复后由于优先级高会抢回属于自己的主设备地位,非抢占模式则不会这样;

系统默认开启抢占模式;

安全工作:

物理机器加入虚拟路由器组,除了VRID要一致,如果设置了认证策略那还得通过认证才行。认证分为三种方式即不认证、简单字符认证和md5认证;

工作模式:

vrrp的工作模式有主/备和主/主两种,主备模式即同一时间只有一台主机提供调度服务,而另一台设备则是备份;

双主模式则是两台主机同时提供调度服务,不过所谓的双主模式其实也可以认为是两个主备模式的叠加。如A主机作为服务1的主调度器,B主机作为服务1的

备调度器,同时A主机作为服务2的备调度器,而B主机作为服务2的主调度器。这就是所谓的双主模式;


总的来说vrrp能够提供以下功能:

vrrp协议完成地址流动
为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)
为ipvs集群的各RS做健康状态检测(RS即真实主机)
基于脚本调用接口通过执行脚本完成脚本中定义的功能,进而影响集群事务,以此支持nginx、haproxy等服务


使用rpm包管理器安装keepalived:

主配置文件:/etc/keepalived/keepalived.conf

主程序文件:/usr/sbin/keepalived

keepalived的主配置文件主要分为三部分:

1、global全局默认配置,主要定义邮件通知信息、vrrp的组播地址定义

global_defs {
   notification_email {
        root@localhost
   }
   notification_email_from node1@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id node1
   vrrp_mcast_group4 224.0.100.100  #vrrp通知消息使用组播地址,可以自定义
}

2、vrrp的示例配置信息,主要有在vrrp虚拟路由器组中的状态、监听通告消息的接口、VRID、优先级、验证信息、VIP

vrrp_instance VI_1 {  #vrrp实例
    state MASTER  #主设备,即在同一实例中的所有机器,只有master转发数据
    interface eth0  #接收和发送通知消息的接口
    virtual_router_id 1 #VRID,相同ID的机器才能提供高可用服务
    priority 100     #优先级,默认100
    advert_int 2    #发送通知消息的时间间隔,2s
    authentication {
        auth_type PASS
        auth_pass abcd  #简单字符认证
    }
    virtual_ipaddress {
        192.168.1.254/24  #虚拟出来的设备的ip地址,即虚拟ip地址
    }
        track_interface {
                eth0       #跟踪的接口,此接口故障,会导致主备设备切换
        }
}

#以上是在一台机器上作为master的配置,同时还得在另一台设备上做backup的配置,参数与此处类似,不再赘述

3、虚拟服务器的配置部分,主要包含对外提供的虚拟ip、端口,以及内部真实服务器的ip、端口。此处以lvs为例说明

virtual_server 192.168.1.254 80 {   #对外提供服务的虚拟ip地址和端口
    delay_loop 3   #检查后端服务器的时间间隔,3s
    lb_algo wrr      #采用加权轮询调度算法
    lb_kind DR      #lvs的直接路由模式
    protocol TCP   #目前只支持TCP协议

    real_server 192.168.1.103 80 {    #后端真实服务器的ip和port
        weight 1   #权重
        HTTP_GET {     #对http协议的get请求做响应
            url {
              path /
                          status_code 200
            }
          
            connect_timeout 3  #连接超时时间3s
            nb_get_retry 3         #重试次数
            delay_before_retry 3 #重试之前的超时时间
        }
    }
           real_server 192.168.1.104 80 {
        weight 1
        HTTP_GET {
            url {
              path /
                          status_code 200
            }
          
                    connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
                        }
        }
    }