Keepalived工作原理和配置详解

230229fe9ecf71f3de46357e214b547c.png

一、keepalived介绍

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

     keepalived是以VRRP协议为实现基础的,Keepalive类似于ylayer3, 4 & 5交换机制的软件,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。

      keepalived主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。

cc39f24a838b6d9f68325b19d59403b4.png

       Keepalived的体系结构从整体上分为两层,分别是用户空间层(User Space)和内核空间层(Kernel Space)。

内核空间层处于最底层,它包括IPVS和NETLINK两个模块,IPVS模块是Keepalived引入的一个第三方模块,通过IPVS可以实现基于IP的负载均衡集群。IPVS默认包含在LVS集群软件中,在LVS集群中,IPVS安装在一个叫做Director Server的服务器上,同时在Director Server上虚拟出一个IP地址来对外提供服务,而用户必须通过这个虚拟IP地址才能访问服务。这个虚拟IP一般称为LVS的VIP,即Virtual IP。访问的请求首先经过VIP到达Director Server,然后由Director Server从服务器集群节点中选取一个服务节点响应用户的请求。  Keepalived最初就是为LVS提供服务的,由于Keepalived可以实现对集群节点的状态检测,而IPVS可以实现负载均衡功能,因此,Keepalived借助于第三方模块IPVS就可以很方便地搭建一套负载均衡系统。

       在Keepalived中,IPVS模块是可配置的,如果需要负载均衡功能,可以在编译Keepalived时打开负载均衡功能,反正,也可以通过配置编译参数关闭。

        NETLINK模块主要用于实现一些高级路由框架和一些相关的网络功能,完成用户空间层Netlink Reflector模块发来的各种网络请求。

       用户空间层位于内核空间层之上,Keepalived的所有具体功能都在这里实现,在用户空间层,Keepalived又分为四个部分,分别是Scheduler I/O Multiplexer、Memory Management、Control Plane和Core components。其中,Scheduler I/O Multiplexer是一个I/O复用分发调度器,它负责安排Keepalived所有内部的任务请求。Memory Management是一个内存管理机制,这个框架提供了访问内存的一些通用方法。Control Plane是Keepalived的控制面板,可以实现对配置文件进行编译和解析,Keepalived的配置文件解析比较特殊,它并不是一次解析所有模块的配置,而是只有在用到某模块时才解析相应的配置。最后详细说一下Core components,这个部分是Keepalived的核心组件,包含了一些列功能模块,主要有WatchDog、Checkers、VRRP Stack、IPVS wrapper和Netlink Reflector,下面介绍每个模块所实现的功能如下。

(1)WatchDog

        WatchDog是计算机可靠性领域中一个极为简单又非常有效的检测工具,它的工作原理是针对被监视的目标设置一个计数器和一个阈值,WatchDog会自己增加此计数值,然后等待被监视的目标周期性地重置该计数值。一旦被监控目标发生错误,就无法重置此计数值,WatchDog就会检测到,于是就采取对应的恢复措施,例如重启或关闭。

    在Linux中很早就引入了WatchDog功能,而Keepalived正是通过WatchDog的运行机制来监控Checkers和VRRP进程的。

(2)Checkers

        Checkers是Keepalived最基础的功能,也是最主要的功能,可实现对服务器运行状态检测和故障隔离。

(3)VRRP Stack

        VRRP Stack是Keepalived后来引入的VRRP功能,可以实现HA集群中失败切换(Failover)功能。Keepalived通过VRRP功能再结合LVS负载均衡软件即可部署一套高性能的负载均衡集群系统。

(4)IPVS wrapper

       IPVS wrapper是IPVS功能的一个实现。IPVS wrapper模块可以将设置好的IPVS规则发送到内核空间并提交给IPVS模块,最终实现IPVS模块的负载均衡功能。

(5)Netlink Reflector

       Netlink Reflector用来实现高可用集群中Failover时虚拟IP(VIP)的设置和切换。Netlink Reflector的所有请求最后都发送到内核空间的NETLINK模块来完成。

二、keepalived配置文件keepalived.conf介绍

     keepalived.conf 配置的配置文件都是以快(block)的形式组织,分别是global_defs、static_ipaddress、static_routes、vrrp_script、vrrp_instance和virtual_server;

###全局配置:global_defs

! Configuration File for keepalived


global_defs {
   #notification_email {
   #  acassen@firewall.loc
   #  failover@firewall.loc
   #  sysadmin@firewall.loc
   #}
   #notification_email_from Alexandre.Cassen@firewall.loc
   #smtp_server 192.168.200.1
   #smtp_connect_timeout 30
   router_id LVS_DEVEL
}

解释:

notification_email           故障发生时给谁发邮件通知。

notification_email_from  通知邮件从哪个地址发出。

smpt_server                    通知邮件的smtp地址。

smtp_connect_timeout    连接smtp服务器的超时时间。

enable_traps                   开启SNMP陷阱(Simple Network Management Protocol)。

router_id                         表示运行Keepalived服务器的一个标识,是发送邮件显示在邮件主题中的信息。

##VRRP配置

VRRP配置时keepalived核心,主要用来实现Keepalived的高可用性功能。从结构上看:VRRPD配置有可以分为VRRP同步组和VRRP实例配置。

(1).vrrp_sync_group

     vrrp_sync_group的应用场景为:如果路由有2个网段,一个个网,一个外网,每个网段开启一个VRRP实例,假设VRRP配置为检查内网,那么当外网出现问题时,VRRPD会认为自己是健康的,则不会发送Master和Backup的切换,从而导致问题,同步组可以把两个实例都放入Sync Group,这样的话,Group里任何一个实例出现问题都会发生切换。

vrrp_sync_group VG1 {
    group {
        VI_1
        VI_2
    }
     notify_backup "/usr/local/bin/vrrp.back arg1 arg2"   keepalived进入backup状态时需要执行脚本
     notify_master "/usr/local/bin/vrrp.mast arg1 arg2"   keepalived进入master状态时需要执行脚本
     notify_fault  "/usr/local/bin/vrrp.fault arg1 arg2"  keepalived进入fault状态时需要执行脚本
     notify_stop   "/usr/local/bin/vrrp.stop arg1 arg2"   keepalived程序终止时需要执行脚本
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.23.8.80
    }
}
vrrp_instance VI_2 {
    state MASTER
    interface eth1
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
     virtual_ipaddress {
      #<IPADDR>/<MASK>  brd  <IPADDR>  dev <STRING>  scope <SCOPT>  label <LABEL>
        192.168.200.16
        192.168.200.17 dev eth1
        192.168.200.18 dev eth2
    }
    virtual_routes {
        #src  <IPADDR>  [to] <IPADDR>/<MASK>  via|gw  <IPADDR>  dev <STRING>  scope <SCOPE>
        src 192.168.100.1 to 192.168.109.0/24 via 192.168.200.254 dev eth1
        192.168.110.0/24 via 192.168.200.254 dev eth1
        192.168.111.0/24 dev eth2
        192.168.112.0/24 via 192.168.100.254
        192.168.113.0/24 via 192.168.100.252 or 192.168.100.253
}
        nopreempt 
        preemtp_delay  300
}


virtual_server 10.23.8.80 80 {
    delay_loop 6
    lb_algo wlc
    lb_kind NAT
    persistence_timeout 600
    protocol TCP
    real_server 172.18.1.11 80 {
        weight 100
        TCP_CHECK {
            connect_timeout 3
        }
    }
    real_server 172.18.1.12 80 {
        weight 100
        TCP_CHECK {
            connect_timeout 3
        }
    }
    real_server 172.18.1.13 80 {
        weight 100
        TCP_CHECK {
            connect_timeout 3
        }
    }
}

notify_master:指定当Keepalived进入Master状态时要执行的脚本,这个脚本可以是一个状态报警脚本,也可以是一个服务管理脚本。Keepalived允许脚本传入参数,因此灵活性很强。

notify_backup:指定当Keepalived进入Backup状态时要执行的脚本,同理,这个脚本可以是一个状态报警脚本,也可以是一个服务管理脚本。

notify_fault:指定当Keepalived进入Fault状态时要执行的脚本,脚本功能与前两个类似。

notify_stop:指定当Keepalived程序终止时需要执行的脚本。

VRRP配置以“vrrp_instance”作为标识,配置选项介绍:  

 vrrp_instance:是VRRP实例开始的标识,后跟VRRP实例名称。

 state:于指定Keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器。

 interface:用于指定HA监测网络的接口。

 virtual_router_id:是虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识,即在同一个vrrp_instance下,MASTER和BACKUP必须是一致的。

priority   用于定义节点优先级,数字越大表示节点的优先级就越高。在一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级。

advert_int   用于设定MASTER与BACKUP主机之间同步检查的时间间隔,单位是秒。

mcast_src_ip  用于设置发送多播包的地址,如果不设置,将使用绑定的网卡所对应的IP地址。

garp_master_delay用于设定在切换到Master状态后延时进行Gratuitous arp请求的时间。

track_interface用于设置一些额外的网络监控接口,其中任何一个网络接口出现故障,Keepalived都会进入FAULT状态。

 authentication用于设定节点间通信验证类型和密码,验证类型主要有PASS和AH两种,在一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信。

virtual_ipaddress   用于设置虚拟IP地址(VIP),又叫做漂移IP地址。可以设置多个虚拟IP地址,每行一个。之所以称为漂移IP地址,是因为Keepalived切换到Master状态时,这个IP地址会自动添加到系统中,而切换到BACKUP状态时,这些IP又会自动从系统中删除。Keepalived通过“ip address add”命令的形式将VIP添加进系统中。要查看系统中添加的VIP地址,可以通过“ip add”命令实现。“virtual_ipaddress”段中添加的IP形式可以多种多样,例如可以写成 “192.168.16.189/24 dev eth1” 这样的形式,而Keepalived会使用IP命令“ip addr add 192.168.16.189/24 dev eth1”将IP信息添加到系统中。因此,这里的配置规则和IP命令的使用规则是一致的。

virtual_routes和virtual_ipaddress段一样,用来设置在切换时添加或删除相关路由信息。使用方法和例子可以参考上面的示例。通过“ip route”命令可以查看路由信息是否添加成功,此外,也可以通过上面介绍的notify_master选项来代替virtual_routes实现相同的功能。

nopreempt    设置的是高可用集群中的不抢占功能。在一个HA Cluster中,如果主节点死机了,备用节点会进行接管,主节点再次正常启动后一般会自动接管服务。这种来回切换的操作,对于实时性和稳定性要求不高的业务系统来说,还是可以接受的,而对于稳定性和实时性要求很高的业务系统来说,不建议来回切换,毕竟服务的切换存在一定的风险和不稳定性,在这种情况下,就需要设置nopreempt这个选项了。设置nopreempt可以实现主节点故障恢复后不再切回到主节点,让服务一直在备用节点工作,直到备用节点出现故障才会进行切换。在使用不抢占时,只能在“state”状态为“BACKUP”的节点上设置,而且这个节点的优先级必须高于其他节点。

preemtp_delay用于设置抢占的延时时间,单位是秒。有时候系统启动或重启之后网络需要经过一段时间才能正常工作,在这种情况下进行发生主备切换是没必要的,此选项就是用来设置这种情况发生的时间间隔。在此时间内发生的故障将不会进行切换,而如果超过“preemtp_delay”指定的时间,并且网络状态异常,那么才开始进行主备切换。

      LVS段的配置以“virtual_server”作为开始标识,此段内容有两部分组成,分别是real_server段和健康检测段。下面是virtual_server配置说明:

virtual_server 192.168.12.200 80 {        
    delay_loop 6
lb_algo rr
lb_kind DR 
persistence_timeout 50
    persistence_granularity  <NETMASK>
protocol TCP
ha_suspend
virtualhost  <string>
sorry_server <IPADDR>  <PORT>

virtual_server:设置虚拟服务器的开始,后面跟虚拟IP地址和服务端口,IP与端口之间用空格隔开。

delay_loop:设置健康检查的时间间隔,单位是秒。

lb_algo:设置负载调度算法,可用的调度算法有rr、wrr、lc、wlc、lblc、sh、dh等,常用的算法有rr和wlc。

lb_kind:设置LVS实现负载均衡的机制,有NAT、TUN和DR三个模式可选。

persistence_timeout:会话保持时间,单位是秒。这个选项对动态网页是非常有用的,为集群系统中的session共享提供了一个很好的解决方案。有了这个会话保持功能,用户的请求会一直分发到某个服务节点,直到超过这个会话的保持时间。需要注意的是,这个会话保持时间是最大无响应超时时间,也就是说,用户在操作动态页面时,如果在50秒内没有执行任何操作,那么接下来的操作会被分发到另外的节点,但是如果用户一直在操作动态页面,则不受50秒的时间限制。

persistence_granularity:此选项是配合persistence_timeout的,后面跟的值是子网掩码,表示持久连接的粒度。默认是255.255.255.255,也就是一个单独的客户端IP。如果将掩码修改为255.255.255.0,那么客户端IP所在的整个网段的请求都会分配到同一个real server上。

protocol:指定转发协议类型,有TCP和UDP两种可选。

ha_suspend:节点状态从Master到Backup切换时,暂不启用real server节点的健康检查。

virtualhost:在通过HTTP_GET/ SSL_GET做健康检测时,指定的Web服务器的虚拟主机地址。

sorry_server:相当于一个备用节点,在所有real server失效后,这个备用节点会启用。

real_server段的一个配置示例:

real_server 192.168.12.132 80 {
weight 3
inhibit_on_failure
notify_up  <STRING> | <QUOTED-STRING>
notify_down <STRING> | <QUOTED-STRING>
}

real_server:是real_server段开始的标识,用来指定real server节点,后面跟的是real server的真实IP地址和端口,IP与端口之间用空格隔开。

weight:用来配置real server节点的权值。权值大小用数字表示,数字越大,权值越高。设置权值的大小可以为不同性能的服务器分配不同的负载,为性能高的服务器设置较高的权值,而为性能较低的服务器设置相对较低的权值,这样才能合理地利用和分配了系统资源。

inhibit_on_failure:表示在检测到real server节点失效后,把它的“weight”值设置为0,而不是从IPVS中删除。

notify_up:此选项与上面介绍过的notify_maser有相同的功能,后跟一个脚本,表示在检测到real server节点服务处于UP状态后执行的脚本。

notify_down:表示在检测到real server节点服务处于DOWN状态后执行的脚本。

健康检测段允许多种检查方式,常见的有HTTP_GET、SSL_GET、TCP_CHECK、SMTP_CHECK、MISC_CHECK。

TCP_CHECK检测方式示例:

TCP_CHECK  {
connect_port 80
            connect_timeout  3 
            nb_get_retry  3 
            delay_before_retry  3 
        }

connect_port:健康检查的端口,如果无指定,默认是real_server指定的端口。

connect_timeout:表示无响应超时时间,单位是秒,这里是3秒超时。

nb_get_retry:表示重试次数,这里是3次。

delay_before_retry:表示重试间隔,这里是间隔3秒。

HTTP_GET和SSL_GET检测方式的示例:

HTTP_GET |SSL_GET
{
    url  {         
    path  /index.html
    digest  e6c271eb5f017f280cf97ec2f51b02d3
    status_code   200 
}
    connect_port 80
    bindto  192.168.12.80
    connect_timeout  3
    nb_get_retry  3 
    delay_before_retry  2 
}

url:用来指定HTTP/SSL检查的URL信息,可以指定多个URL。

path:后跟详细的URL路径。

digest:SSL检查后的摘要信息,这些摘要信息可以通过genhash命令工具获取。例如:genhash -s 192.168.12.80 -p 80 -u /index.html。

status_code:指定HTTP检查返回正常状态码的类型,一般是200。

bindto:表示通过此地址来发送请求对服务器进行健康检查。

MISC_CHECK检测方式的示例:

MISC_CHECK
{
    misc_path  /usr/local/bin/script.sh
    misc_timeout  5
    ! misc_dynamic
}

MISC健康检查方式可以通过执行一个外部程序来判断real server节点的服务状态,使用非常灵活。以下是常用的几个选项的含义。

misc_path:用来指定一个外部程序或者一个脚本路径。

misc_timeout:设定执行脚本的超时时间。

misc_dynamic:表示是否启用动态调整real server节点权重,“!misc_dynamic”表示不启用,相反则表示启用。在启用这功能后,Keepalived的healthchecker进程将通过退出状态码来动态调整real server节点的“weight”值,如果返回状态码为0,表示健康检查正常,real server节点权重保持不变;如果返回状态码为1,表示健康检查失败,那么就将real server节点权重设置为0;如果返回状态码为2~255之间任意数值,表示健康检查正常,但real server节点的权重将被设置为返回状态码减2,例如返回状态码为10,real server节点权重将被设置为8(10-2)。

最后再附一个VRRP的详细配置,供参考。

vrrp_sync_group VG_1 {  #监控多个网段的实例
    group {
        inside_network   # name of vrrp_instance (below)
        outside_network  # One for each moveable IP.
        ...
    }
    notify_master /path/to_master.sh      # notify_master表示切换为主机执行的脚本
    notify_backup /path/to_backup.sh      # notify_backup表示切换为备机师的脚本
    notify_fault "/path/fault.sh VG_1"    # notify_fault表示出错时执行的脚本
    notify /path/notify.sh  # notify表示任何一状态切换时都会调用该脚本,且在以上三个脚本执行完成之后进行调用
    smtp_alert  # smtp_alert 表示是否开启邮件通知(用全局区域的邮件设置来发通知)
}


vrrp_instance VI_1 {
    state MASTER # state MASTER或BACKUP,当其他节点keepalived启动时会将priority比较大的节点选举为MASTER,因此该项其实没有实质用途。
    interface eth0  # interface 节点固有IP(非VIP)的网卡,用来发VRRP包
    use_vmac    dont_track_primary # use_vmac 是否使用VRRP的虚拟MAC地址,dont_track_primary 忽略VRRP网卡错误(默认未设置)
    track_interface {# track_interface 监控以下网卡,如果任何一个不通就会切换到FALT状态。(可选项)
        eth0
        eth1
    }
    #mcast_src_ip 修改vrrp组播包的源地址,默认源地址为master的IP
    mcast_src_ip    lvs_sync_daemon_interface eth1 #lvs_sync_daemon_interface 绑定lvs syncd的网卡
    garp_master_delay 10  # garp_master_delay 当切为主状态后多久更新ARP缓存,默认5秒
    virtual_router_id 1   # virtual_router_id 取值在0-255之间,用来区分多个instance的VRRP组播, 同一网段中virtual_router_id的值不能重复,否则会出错
    priority 100 #priority用来选举master的,根据服务是否可用,以weight的幅度来调整节点的priority,从而选取priority高的为master,该项取值范围是1-255(在此范围之外会被识别成默认值100)
    advert_int 1 # advert_int 发VRRP包的时间间隔,即多久进行一次master选举(可以认为是健康查检时间间隔)
    authentication { # authentication 认证区域,认证类型有PASS和HA(IPSEC),推荐使用PASS(密码只识别前8位)
        auth_type PASS  #认证方式
        auth_pass 12345678  #认证密码
    }


    virtual_ipaddress { # 设置vip
        10.210.214.253/24 brd 10.210.214.255 dev eth0
        192.168.1.11/24 brd 192.168.1.255 dev eth1
    }


    virtual_routes { # virtual_routes 虚拟路由,当IP漂过来之后需要添加的路由信息
        172.16.0.0/12 via 10.210.214.1
        192.168.1.0/24 via 192.168.1.1 dev eth1
        default via 202.102.152.1
    }


    track_script {
        chk_http_port
    }


    nopreempt # nopreempt 允许一个priority比较低的节点作为master,即使有priority更高的节点启动
    preempt_delay 300 # preempt_delay master启动多久之后进行接管资源(VIP/Route信息等),并提是没有nopreempt选项
    debug
    notify_master|    notify_backup|    notify_fault|    notify|    smtp_alert
}

✨✨ 感谢阅读,欢迎关注 ✨✨

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值