如来神掌第一式第八招----Keepalived详解

###############################################################################
# Name : Mahavairocana                                                                                                                                           
# Author : Mahavairocana                                                                                                                                         
# QQ : 10353512                                                                                                                                                    
# WeChat : shenlan-qianlan                                                                                                                                      
# Blog : http://www.cnblogs.com/Mahavairocana/                                                                                                       
# Description : You are welcome to reprint, or hyperlinks to indicate the                                                                        
#                    source of the article, as well as author information.                                                                                ###############################################################################

 

 

  一、 两个概念:物理路由器和虚拟路由器。


     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出现故障,接着多台BACKUP就会进行选举,优先级最高的BACKUP将成为新的MASTER,这种选举并进行角色切换的过程非常快,因而也就保证了服务的持续可用性。

  二、三个原理: Keepalived工作在TCP/IP参考模型的第三、第四和第五层,也就是网络层、传输层和应用层。根据TCP/IP参考模型各层所能实现的功能,Keepalived运行机制如下。
    
    在网络层,运行着四个重要的协议:互连网协议IP、互连网控制报文协议ICMP、地址转换协议ARP以及反向地址转换协议RARP。Keepalived在网络层采用的最常见的工作方式是通过ICMP协议向服务器集群中的每个节点发送一个ICMP的数据包(类似于ping实现的功能),如果某个节点没有返回响应数据包,那么就认为此节点发生了故障,Keepalived将报告此节点失效,并从服务器集群中剔除故障节点。
    
    在传输层,提供了两个主要的协议:传输控制协议TCP和用户数据协议UDP。传输控制协议TCP可以提供可靠的数据传输服务,IP地址和端口,代表一个TCP连接的一个连接端。要获得TCP服务,须在发送机的一个端口上和接收机的一个端口上建立连接,而Keepalived在传输层就是利用TCP协议的端口连接和扫描技术来判断集群节点是否正常的。比如,对于常见的Web服务默认的80端口、SSH服务默认的22端口等,Keepalived一旦在传输层探测到这些端口没有响应数据返回,就认为这些端口发生异常,然后强制将此端口对应的节点从服务器集群组中移除。
    
    在应用层,可以运行FTP、TELNET、SMTP、DNS等各种不同类型的高层协议,Keepalived的运行方式也更加全面化和复杂化,用户可以通过自定义Keepalived的工作方式,例如用户可以通过编写程序来运行Keepalived,而Keepalived将根据用户的设定检测各种程序或服务是否允许正常,如果Keepalived的检测结果与用户设定不一致时,Keepalived将把对应

  三、配置文件详解

  1、主配置文件

[root@Mahavairocana ~]# cat /etc/keepalived/keepalived.conf    
! 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                #用于设置连接smtp server的超时时间
   router_id LVS_DEVEL                    #表示运行Keepalived服务器的一个标识,是发邮件时显示在邮件主题中的信息。
}

vrrp_sync_group G1 { (仅限于nat模式,而且要作为内网网关时候才使用)#G1同步组包含VI_1、VI_2、VI_5三个VRRP实例,G2同步组包含VI_3、VI_4两个VRRP实例。这五个实例将在vrrp_instance段进行定义。另外,在vrrp_sync_group段中还出现了notify_master、notify_backup、notify_fault和notify_stop四个选项,这是Keepalived配置中的一个通知机制
  group {
    VI_1
    VI_2
    VI_5
  }
  notify_backup "/usr/local/bin/vrrp.back arg1 arg2" #指定当Keepalived进入Backup状态时要执行的脚本,同理,这个脚本可以是一个状态报警脚本,也可以是一个服务管理脚本。
  notify_master "/usr/local/bin/vrrp.mast arg1 arg2" #指定当Keepalived进入Master状态时要执行的脚本,这个脚本可以是一个状态报警脚本,也可以是一个服务管理脚本。Keepalived允许脚本传入参数,因此灵活性很强。
  notify_fault "/usr/local/bin/vrrp.fault arg1 arg2"    #指定当Keepalived进入Fault状态时要执行的脚本,脚本功能与前两个类似。
}
vrrp_sync_group G2 {
  group {
    VI_3
    VI_4
  }
}


vrrp_instance VI_1 {    #VRRP实例开始的标识,后跟VRRP实例名称。
    state MASTER    #指定Keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器。
    interface eth0    #指定HA监测网络的接口。
    virtual_router_id 51    #是虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识,即在同一个vrrp_instance下,MASTER和BACKUP必须是一致的。
    priority 100    #定义节点优先级,数字越大表示节点的优先级就越高。在一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级。
    advert_int 1      #设定MASTER与BACKUP主机之间同步检查的时间间隔,单位是秒。
    mcast_src_ip <IPADDR>    #设置发送多播包的地址,如果不设置,将使用绑定的网卡所对应的IP地址。
    garp_master_delay  10     #用于设定在切换到Master状态后延时进行Gratuitous arp请求的时间。
  
 track_interface {    #设置一些额外的网络监控接口,其中任何一个网络接口出现故障,Keepalived都会进入FAULT状态。
eth0 
eth1
}
    authentication {    #设定节点间通信验证类型和密码,验证类型主要有PASS和AH两种,在一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信。
        auth_type PASS
        auth_pass qwaszx
    }
    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命令的使用规则是一致的。
     #<IPADDR>/<MASK>  brd  <IPADDR>  dev <STRING>  scope <SCOPT>  label <LABEL>
        192.168.2.16
        192.168.2.17 dev eth1
        192.168.2.18 dev eth2
    }
    virtual_routes {  #设置在切换时添加或删除相关路由信息。使用方法和例子可以参考上面的示例。通过“ip route”命令可以查看路由信息是否添加成功,此外,也可以通过上面介绍的notify_master选项来代替virtual_routes实现相同的功能。
#src  <IPADDR>  [to] <IPADDR>/<MASK>  via|gw  <IPADDR>  dev <STRING>  scope <SCOPE>
        src 192.168.10.1 to 192.168.10.0/24 via 192.168.10.254 dev eth1
        192.168.11.0/24 via 192.168.200.254 dev eth1
        192.168.12.0/24 dev eth2
        192.168.13.0/24 via 192.168.13.254
        192.168.14.0/24 via 192.168.14.252 or 192.168.14.253
}
nopreempt   ##设置的是高可用集群中的不抢占功能。在一个HA Cluster中,如果主节点死机了,备用节点会进行接管,主节点再次正常启动后一般会自动接管服务。这种来回切换的操作,对于实时性和稳定性要求不高的业务系统来说,还是可以接受的,而对于稳定性和实时性要求很高的业务系统来说,不建议来回切换,毕竟服务的切换存在一定的风险和不稳定性,在这种情况下,就需要设置nopreempt这个选项了。设置nopreempt可以实现主节点故障恢复后不再切回到主节点,让服务一直在备用节点工作,直到备用节点出现故障才会进行切换。在使用不抢占时,只能在“state”状态为“BACKUP”的节点上设置,而且这个节点的优先级必须高于其他节点。
preemtp_delay  300  ##设置抢占的延时时间,单位是秒。有时候系统启动或重启之后网络需要经过一段时间才能正常工作,在这种情况下进行发生主备切换是没必要的,此选项就是用来设置这种情况发生的时间间隔。在此时间内发生的故障将不会进行切换,而如果超过“preemtp_delay”指定的时间,并且网络状态异常,那么才开始进行主备切换。
}


virtual_server 192.168.200.100 443 { #设置虚拟服务器的开始,后面跟虚拟IP地址和服务端口,IP与端口之间用空格隔开。
    delay_loop 6    #设置健康检查的时间间隔,单位是秒。
    lb_algo rr        #设置负载调度算法,可用的调度算法有rr、wrr、lc、wlc、lblc、sh、dh等,常用的算法有rr和wlc。
    lb_kind NAT    #设置LVS实现负载均衡的机制,有NAT、TUN和DR三个模式可选。
    nat_mask 255.255.255.0
    persistence_timeout 50    #会话保持时间,单位是秒。这个选项对动态网页是非常有用的,为集群系统中的session共享提供了一个很好的解决方案。有了这个会话保持功能,用户的请求会一直分发到某个服务节点,直到超过这个会话的保持时间。需要注意的是,这个会话保持时间是最大无响应超时时间,也就是说,用户在操作动态页面时,如果在50秒内没有执行任何操作,那么接下来的操作会被分发到另外的节点,但是如果用户一直在操作动态页面,则不受50秒的时间限制。
    persistence_granularity  <NETMASK> #此选项是配合persistence_timeout的,后面跟的值是子网掩码,表示持久连接的粒度。默认是255.255.255.255,也就是一个单独的客户端IP。如果将掩码修改为255.255.255.0,那么客户端IP所在的整个网段的请求都会分配到同一个real server上。
    protocol TCP     #指定转发协议类型,有TCP和UDP两种可选。
    ha_suspend        #节点状态从Master到Backup切换时,暂不启用real server节点的健康检查。
    virtualhost  <string>    #在通过HTTP_GET/ SSL_GET做健康检测时,指定的Web服务器的虚拟主机地址。
    sorry_server <IPADDR>  <PORT>    #相当于一个备用节点,在所有real server失效后,这个备用节点会启用。
    
    real_server 192.168.201.100 443 { #是real_server段开始的标识,用来指定real server节点,后面跟的是real server的真实IP地址和端口,IP与端口之间用空格隔开。
        weight 1    #用来配置real server节点的权值。权值大小用数字表示,数字越大,权值越高。设置权值的大小可以为不同性能的服务器分配不同的负载,为性能高的服务器设置较高的权值,而为性能较低的服务器设置相对较低的权值,这样才能合理地利用和分配了系统资源。
        inhibit_on_failure    #表示在检测到real server节点失效后,把它的“weight”值设置为0,而不是从IPVS中删除。
        notify_up  <STRING> | <QUOTED-STRING>    #此选项与上面介绍过的notify_maser有相同的功能,后跟一个脚本,表示在检测到real server节点服务处于UP状态后执行的脚本。
        notify_down <STRING> | <QUOTED-STRING>        #表示在检测到real server节点服务处于DOWN状态后执行的脚本。
        
        
        TCP_CHECK  {  #健康检查方式1
            connect_port 80    #健康检查的端口,如果无指定,默认是real_server指定的端口。
            connect_timeout  3     #无响应超时时间,单位是秒,这里是3秒超时。
            nb_get_retry  3     #重试次数,这里是3次。
            delay_before_retry  3     #重试间隔,这里是间隔3秒。
        }
        
        
        HTTP_GET |SSL_GET  {  #健康检查方式2
        url  {         #用来指定HTTP/SSL检查的URL信息,可以指定多个URL。
        path  /index.html    #后跟详细的URL路径。
        digest  e6c271eb5f017f280cf97ec2f51b02d3    #SSL检查后的摘要信息,这些摘要信息可以通过genhash命令工具获取。例如:genhash -s 192.168.12.80 -p 80 -u /index.html。
        status_code   200     #指定HTTP检查返回正常状态码的类型,一般是200。
        }
        connect_port 80        #检测端口
        bindto  192.168.12.80    #表示通过此地址来发送请求对服务器进行健康检查。
        connect_timeout  3
        nb_get_retry  3 
        delay_before_retry  2 
        }
                }
            }
        }    
        
        MISC_CHECK    #健康检查方式可以通过执行一个外部程序来判断real 
        {  #健康检查3
        misc_path  /usr/local/bin/script.sh    #用来指定一个外部程序或者一个脚本路径。
        misc_timeout  5    #设定执行脚本的超时时间。
        ! misc_dynamic    #表示是否启用动态调整real “!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)。
        }
       
[root@Mahavairocana ~]# cat /etc/sysconfig/keepalived 
# Options for keepalived. See `keepalived --help' output and keepalived(8) and
# keepalived.conf(5) man pages for a list of all options. Here are the most
# common ones :
#
# --vrrp               -P    Only run with VRRP subsystem.
# --check              -C    Only run with Health-checker subsystem.
# --dont-release-vrrp  -V    Dont remove VRRP VIPs & VROUTEs on daemon stop.
# --dont-release-ipvs  -I    Dont remove IPVS topology on daemon stop.
# --dump-conf          -d    Dump the configuration data.
# --log-detail         -D    Detailed log messages.
# --log-facility       -S    0-7 Set local syslog facility (default=LOG_DAEMON)    #需要配合/etc/rsyslog.conf 将对应级别添加
#

KEEPALIVED_OPTIONS="-D -S 7"

 

 

四 、keepalived 命令详解

  

[root@Mahavairocana ~]# keepalived -help
Usage: keepalived [OPTION...]
  -f, --use-file=FILE          #指定配置文件
  -P, --vrrp                   只启动vrrp模块
  -C, --check                  只启动健康检查-l, --log-console            打印日志到控制台
  -D, --log-detail             显示详细的日志
  -S, --log-facility=[0-7]     设定日志级别[0-7]
  -V, --dont-release-vrrp      停止守护进程但是不移除VIP和VROUTEs
  -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      指定健康检查pid文件-x, 
 --snmp 开启snmp -v, --version 显示版本信息 -h, --help 显示帮助信息

 

五、常见故障排查思路

  1、负载均衡器发生故障的检查点
    1.1、  查看系统日志 /var/log/messages ,了解内核是否有报错信息。因为keepalived的日志也被追加到系统日子,因此通过系统日志,也能了解keepalived的运行情况。
    1.2、  检查负载均衡器的网络连通状况。这包括ip地址的设置是否正确,是否能远程访问(如ping 、tracert等)。
    1.3、  检查keepalived的运行情况。这包括进程是否处于运行中,ipvs模块是否被加载到系统的内核,vip是否被绑定到网络接口,ipvsadm是否有输出。
    1.4、  检查负载均衡器的系统负载。
    1.5、  检查keepalived的配置文件书写是否正确。因为keepalived启动过程不对配置文件做语法检查,因此在运行前,必须按需求表逐项检查配置文件keepalived.conf 的内容。有时,就可能就是因为漏写了一个“}”符号而导致意外的结果。配置文件的内容检查还包括主从优先级priority、虚拟路由标识virtual_router_id、路由标识router_id等几个部分,这些值有些是必须相同的、有些则必须不同。
    1.6、  检查负载均衡器是否启用防火墙规则。

  2、真实服务器发生故障的检查点
    2.1、  查看系统日志 /var/log/messages ,了解内核是否有报错信息。
    2.2、  检查服务器的网络连通状况。
    2.3、  检查服务是否正常运行。可以结合察看进程、模拟用户访问来确定。
    2.4、  检查服务器的负载情况,看哪些进程占用较高的资源。如果暂停占资源高的进程,情况会怎么样?
    2.5、  检查vip是否被绑定。Linux只能通过ip add 指令察看,freebsd 用ifconfig就可以了。
    2.6、  检查主机防火墙是否被启用。如果需要启用主机防火墙,则应设置好过滤规则。
    2.7、  从客户端直接访问服务器的服务,看是否能正常访问。这是dr模式的一个优点。

  3、vip发生故障的检查点

    3.1、  检查负载均衡器的vip是否被绑定。
    3.2、  检查负载均衡器ipvsadm的输出,察看输出的vip项是否与我们的设定相一致。
    3.3、  检查各真实服务器的vip是否被绑定。
    3.4、  从客户端测试一下vip的连通情况,如ping vip。
    3.5、  检查vip地址是否与其它服务器的地址相冲突。

  服务发生故障检查点
    4.1、  检查服务是否正常运行。如查进程、模拟用户访问等。
    4.2、  检查系统的负载情况。
    4.3、  检查是否启用主机防火墙。

 

posted on 2017-12-29 23:23  Mahavairocana  阅读(1193)  评论(0编辑  收藏  举报

导航