简介

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

说明:heartbeat是一个专业的、功能完善的高可用软件,它提供了HA 软件所需的基本功能:心跳检测、资源接管,检测集群中的服务,在集群节点转移共享IP地址的所有者等等。而keepalived有着相似的功能,通过虚拟路由冗余来实现高可用功能。

Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点。
后来Keepalived又加入了VRRP的功能,出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行,因此Keepalvied 一方面具有服务器状态检测和故障隔离功能,另外一方面也有HA cluster功能,下面介绍一下VRRP协议实现的过程。

VRRP协议与工作原理

VRRP可以将两台或者多台物理路由器设备虚拟成一个虚拟路由,这个虚拟路由器通过虚拟IP(一个或者多个)对外提供服务,而在虚拟路由器内部十多个物理路由器协同工作,同一时间只有一台物理路由器对外提供服务,这台物理路由设备被成为:主路由器(Master角色),一般情况下Master是由选举算法产生,它拥有对外服务的虚拟IP,提供各种网络功能,如:ARP请求,ICMP 数据转发等,而且其它的物理路由器不拥有对外的虚拟IP,也不提供对外网络功能,仅仅接收MASTER的VRRP状态通告信息,这些路由器被统称为“BACKUP的角色”,当主路由器失败时,处于BACKUP角色的备份路由器将重新进行选举,产生一个新的主路由器进入MASTER角色,继续提供对外服务,整个切换对用户来说是完全透明的。
每个虚拟路由器都有一个唯一的标识号,称为VRID,一个VRID与一组IP地址构成一个虚拟路由器,在VRRP协议中,所有的报文都是通过IP多播方式发送的,而在一个虚拟路由器中,只有处于Master角色的路由器会一直发送VRRP数据包,处于BACKUP角色的路由器只会接受Master角色发送过来的报文信息,用来监控Master运行状态,一般不会发生BACKUP抢占的情况,除非它的优先级更高,而当MASTER不可用时,BACKUP也就无法收到Master发过来的信息,于是就认定Master出现故障,接着多台BAKCUP就会进行选举,优先级最高的BACKUP将称为新的MASTER,这种选举角色切换非常之快,因而保证了服务的持续可用性。

配置文件详解
! Configuration File for keepalived
# 发生故障 进行消息传输 
# 容器识别
global_defs {
   notification_email {
# 填写接收者邮箱 例如 123@qq.com
     acassen@firewall.loc
   }
# 发送者邮箱
   notification_email_from Alexandre.Cassen@firewall.loc
# 邮箱发送地址
   smtp_server 192.168.200.1
# 链接 smtp服务器超时 时间
   smtp_connect_timeout 30
# 标识本节点字符串 一般是hostname这种 发送通知邮箱时会用到
   router_id LVS_DEVEL
# 检查vrrp报文中的所有地址比较耗时,设置此标志的意思是如果接收的到报文和上一个报文来至同一个路由器则不执行检查。默认是跳过检查   
   vrrp_skip_check_adv_addr
# 严格遵守vrrp协议,下面这些功能将会禁止: 1.   0 VIP   2. unicast(单播) peers    3. vrrp 版本2的ipv6功能
   vrrp_strict
# 小数类型,单位秒,在一个网卡上每组gratuitous arp消息之间的延迟时间,默认为0,一个发送的消息=n组 
   vrrp_garp_interval 0
# 小数类型,单位秒, 在一个网卡上每组na消息之间的延迟时间,默认为0
   vrrp_gna_interval 0
}
# 定义对外提供服务的VIP区域及相关属性
vrrp_instance VI_1 {
# 状态只有MASTER和BACKUP两种,并且要大写,MASTER为工作状态,BACKUP是备用状态。
    state MASTER
# interface:可以绑定当前虚拟路由器所使用的物理接口,比如eth0,bond0,br0,可以和VIP不在一个网卡上
    interface eth0
# 虚拟路由标识,同一个vrrp_instance的MASTER和BACKUP的vitrual_router_id 是一致的。
    virtual_router_id 51
# 优先级,同一个vrrp_instance的MASTER优先级必须比BACKUP高。  
    priority 100
# MASTER 与BACKUP 负载均衡器之间同步检查的时间间隔,单位为秒。
    advert_int 1
    authentication {
# 设置认证类型,有两种选择一个是AH类型,另一种是PASS类型,AH为IPSC互联网安全认证,而PASS是简单的密码认证,这里推荐使用PASS认证,默认是使用的PASS认证。
        auth_type PASS
# auth_pass 1111   验证密码为明文,同一vrrp 实例MASTER 与BACKUP 使用相同的密码才能通信                     
        auth_pass 1111
    }
# 虚拟ip地址,可以有多个地址,每个地址占一行 
    virtual_ipaddress {
        10.77.0.100
    }
}
# virtual_server模块是用于配置虚拟服务器,将虚拟路由器中添加的VIP与后端real server对应起来
virtual_server 192.168.200.100 443 {
# 设置检查后端服务器的时间间隔
    delay_loop 6
# 指定调度算法
    lb_algo rr
# 指定集群的类型
    lb_kind NAT
# 指定持久连接的时长
    persistence_timeout 50
# 指定服务的协议
    protocol TCP
# 设置VIP所对应的后端服务器IP和端口,也包括以下的配置部分
    real_server 192.168.201.100 443 {
# 设置后端服务器的权重
        weight 1
# SSL_GET、HTTP_GET、TCP_CHECK、SMTP_CHECK和MISC_CHECK等可以定义当前后端主机的健康状况检查方法
        SSL_GET {
            url {
              path /
              digest ff20ad2481f97b1754ef3e12ecd3a9cc
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
# 设置客户端的连接超时的时长
            connect_timeout 3
# 重试的次数
            nb_get_retry 3
# 初始之前的延迟时长
            delay_before_retry 3
        }
    }
}

除了我们安装时候默认的这些配置还有其他的模块配置
#应用层热备需要添加的内容

vrrp_script chk_nginx{
        #执行脚本的路径
        script "/etc/nginx/check_nginx.sh"
        #调用脚本两次之间的间隔,默认为1秒
        interval 1
        #第二次调用脚本后多长时间没有回应的超时时间
        timeout 10
        weight 10 #weight可以参考:keepalived之vrrp_script总结
}

vrrp_sync_group VG_1{ #监控多个网段的实例
group {
    VI_1 #实例名
    VI_2
    ......
}
notify_master /path/xx.sh     #指定当切换到master时,执行的脚本
netify_backup /path/xx.sh     #指定当切换到backup时,执行的脚本
notify_fault "path/xx.sh VG_1"   #故障时执行的脚本
notify /path/xx.sh 
smtp_alert   #使用global_defs中提供的邮件地址和smtp服务器发送邮件通知
}
基础命令
# 安装
yum install -y keepalived

# 启动 
systemctl start keepalived && systemctl enable keepalived

# 全部命令
Usage: keepalived [OPTION...]
  -f, --use-file=FILE          Use the specified configuration file
  -P, --vrrp                   Only run with VRRP subsystem
  -C, --check                  Only run with Health-checker subsystem
  -l, --log-console            Log messages to local console
  -D, --log-detail             Detailed log messages
  -S, --log-facility=[0-7]     Set syslog facility to LOG_LOCAL[0-7]
  -X, --release-vips           Drop VIP on transition from signal.
  -V, --dont-release-vrrp      Don't remove VRRP VIPs and VROUTEs on daemon stop
  -I, --dont-release-ipvs      Don't remove IPVS topology on daemon stop
  -R, --dont-respawn           Don't respawn child processes
  -n, --dont-fork              Don't fork the daemon process
  -d, --dump-conf              Dump the configuration data
  -p, --pid=FILE               Use specified pidfile for parent process
  -r, --vrrp_pid=FILE          Use specified pidfile for VRRP child process
  -c, --checkers_pid=FILE      Use specified pidfile for checkers child process
  -a, --address-monitoring     Report all address additions/deletions notified via netlink
  -x, --snmp                   Enable SNMP subsystem
  -A, --snmp-agent-socket=FILE Use the specified socket for master agent
  -s, --namespace=NAME         Run in network namespace NAME (overrides config)
  -m, --core-dump              Produce core dump if terminate abnormally
  -M, --core-dump-pattern=PATN Also set /proc/sys/kernel/core_pattern to PATN (default 'core')
  -i, --config_id id           Skip any configuration lines beginning '@' that don't match id
  -v, --version                Display the version number
  -h, --help                   Display this help message