一、Keepalived介绍


1、什么是keepalived

keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。

keepalived采用VRRP(virtual router redundancy protocol),虚拟路由冗余协议,以软件的形式实现服务器热备功能。

通常情况下是将两台linux服务器组成一个热备组(master-backup),同一时间热备组内只有一台主服务器(master)提供服务,同时master会虚拟出一个共用IP地址(VIP),这个VIP只存在master上并对外提供服务。

如果keepalived检测到master宕机或服务故障,备服务器(backup)会自动接管VIP成为master,keepalived并将master从热备组移除,当master恢复后,会自动加入到热备组,默认再抢占成为master,起到故障转移功能。

 



二、Keepalived安装

目前最新的版本是1.2.23,通过源码安装。

# wget http://www.keepalived.org/software/keepalived-1.2.23.tar.gz
# tar -zxvf keepalived-1.2.23.tar.gz
# cd keepalived-1.2.23
#  ./configure --prefix=/usr/ --sysconfdir=/etc/
# make
# make install

 



三、Keepalived配置

keepalived安装完成之后,会生成一个默认的keeplived.conf文件,keepalived启动时会读取该文件,解析对应的参数。主要包括以下几个配置区域,分别是global_defs、vrrp_script、vrrp_instance、vrrp_sync_group和virtual_server。


1、global_defs

    全局配置,主要是配置故障发生时的通知对象以及机器标识

global_defs {
   notification_email {                 # 发生故障时,发送报警的邮件地址
     acassen@firewall.loc               # 可以设置多个,每个一行
     failover@firewall.loc              # 使用邮件报警,要求开启本机的sendmail服务
     sysadmin@firewall.loc              # yum -y install mailx sendmail
   }  
   notification_email_from Alexandre.Cassen@firewall.loc        # 邮件的发送地址
   smtp_server 192.168.200.1                                    # SMTP服务器
   smtp_connect_timeout 30                                      # SMTP服务器连接的超时时间
   router_id LVS_DEVEL                                          # 表示运行keepalived服务器标识,发邮件时显示在邮件主题中的信息
}



2、vrrp_script

keepalived只能做到对网络故障和keepalived本身的监控,即当出现网络故障或者keepalived本身出现问题时,进行切换。当需要根据业务进程的运行状态决定是否需要进行主备切换时,可以通过编写脚本对业务进程进行检测监控。

#查看haproxy服务是否存活的简单检查脚本
# cat check_haproxy.sh
#!/bin/bash
count = `ps aux | grep -v grep | grep haproxy | wc -l`
if [ $count > 0 ]; then
    exit 0
else
    exit 1
fi
 
#keepalived中vrrp_script区域
vrrp_script check_haproxy
{
    script "/tmp/check_haproxy.sh"          # 设置执行的脚本,可以是脚本,也可以是命令
    interval 3                              # script执行周期,每个interval执行一次健康检查
    weight -20                              # 健康检查返回0 & weight大于0,优先级增加相应权值;健康检查非0 & weight小于0,优先级减小相应值;
                                            # 不管提高优先级还是降低优先级,最终优先级的范围是在[1,254],不会出现优先级小于等于0或者优先级大于等于255的情况
}
  
vrrp_instance test
{
    ...
    track_script
    {
        check_haproxy
    }
    ...
}



3、vrrp_instance

vrrp实例是由多个vip组成的逻辑集合,每个网卡至少绑定一个vrrp实例,可以有多个vrrp实例

vrrp_instance VI_1 {                # VRRP 配置标识 VI_1是实例名称
    state MASTER                    # 指定Keepalvied角色 MASTER表示此主机为主服务器 BACKUP则是表示为备用服务器
                                    # 当master出现异常后,backup自动切换为master。当backup成为master后,master恢复正常后会再次抢占成为master,导致不必要的主备切换。
                                    # 实际应用中,可以将两台keepalived初始状态均配置为backup,设置不同的优先级,优先级高的设置nopreempt(非抢占)解决异常恢复后再次抢占的问题。
 
    interface eth0                  # 节点固有IP(非VIP)的网卡,用来发VRRP包。
    virtual_router_id 51            # 虚拟路由标识(0-255),同一个VRRP实例使用唯一的标识,DB中的规范是使用节点IP的最后一位。如10.10.16.51的51
    priority 100                    # 节点优先级,数字越大表示节点的优先级越高。keepalived启动时会通过选举将优先级最高的节点选举为master。如果某个节点初始state是master,但是优先级低,该节点会变成backup
 
    nopeermt                        # 非抢占
 
    advert_int 1                    # 发送通告的时间间隔,
                                    # 按照vrrp的官方文档,backup会接收master的advert_int的值,然后计算出skew time和master down interval,认为master宕机触发的选举时间应该是(3 * Master_Adver_Interval) + Skew_time
 
    authentication {                # 设定节点间通信验证类型和密码,验证类型主要有PASS和AH(IPSEC)两种,网上说AH使用有问题,不知道是什么问题
        auth_type PASS              # 同一 vrrp 实例MASTER 与 BACKUP 使用相同的密码才能正常通信。
        auth_pass 1111
    }   
 
    track_script                    # 该实例需要执行的健康执行脚本,每个一行
    {
        check_haproxy
    }
 
    notify_master /etc/keepalived/master_script     # 状态切换为master/backup/fault时执行对应的脚本
    notify_backup /etc/keepalived/backup_script    
    notify_fault /etc/keepalived/fault_script
    notify  /etc/keepalived/script                  #状态变化时执行的脚本
     
    virtual_ipaddress {             # 设置虚拟IP地址 (VIP),又叫做漂移IP地址
        192.168.200.16              # 可以有多个,每个一行
        192.168.200.17
        192.168.200.18
    }  
 
    #其他配置
    # mcast_src_ip 10.10.16.51      # 发送VRRP报文的源IP地址,不设置的话默认是绑定的网卡IP
    # garp_master_delay 10          # 好像是切换到master的时候进行arp刷新的延迟时间(gratuitous arp) 
    # dont_track_primary            # 忽略vrrp的网卡错误,不会进入fault状态
    # preempt delay 5               # 抢占延迟时间
 
}



4、vrrp_sync_group

 定义vrrp_intance组,使得这个组内成员动作一致。当两个vrrp_instance同属于一个vrrp_rsync_group,那么其中一个vrrp_instance发生故障切换时,另一个vrrp_instance也会跟着切换(即使这个instance没有发生故障)。


5、virtual_server

当使用LVS + Keepalived时配置这个区域,用keepalived的配置文件来代替ipvsadm来配置LVS。

virtual_server 10.10.10.3 1358 {                # 设置虚拟服务器,需要指定虚拟IP地址和服务器端口,我觉得这里的IP应该跟实例里面的VIP是一样的,但是Keepalived的default配置文件中并不一样
    delay_loop 3                                # service polling的delay时间,即服务轮询的时间间隔
    lb_algo rr                                  # LVS的调度算法
    lb_kind NAT                                 # LVS的集群模式
    nat_mask 255.255.255.0                      # 使用NAT时的子网掩码
    persistence_timeout 50                      # 会话保持时间,一个请求需要在该时间内被分配给一个realserver
    protocol TCP                                # 转发协议的类型,这个不确定
    real_server 192.168.200.4 1358 {            # LVS中的realserver,有几个realserver就配置几个
        weight 1
        HTTP_GET {
            url {
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}



四、LVS

keepalived中内置了负载均衡的功能,关于lvs的介绍,推荐以下几篇文章:

LVS八种调度算法:http://www.linuxvirtualserver.org/zh/lvs4.html

LVS三种负载均衡的方式(VS/NAT、VS/TUN、VS/DR):http://www.linuxvirtualserver.org/zh/lvs3.html

其中对于VS/DR和VS/TUN两种方式中,需要进行某些配置(绑定VIP到lo、配置arp等),具体参考:

http://zh.linuxvirtualserver.org/node/2585