keepalived配置文件详解

    keepalived配置文件分为三个部分:全局配置(Globals configurations)、vrrp配置(VRRP configuration)、 LVS配置(LVS configuration),针对这三部分对keepalived配置文件进行解析。

1、全局配置

全局配置分为2个子块:Global definitions与Static routes。

(1)、Global definitions

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

global_defs{                       
    notification_email {            
       <EMAIL ADDRESS>              
       <EMAIL ADDRESS>
       ...
    }
    notification_email_from <EMAILADDRESS>
    smtp_server <IP ADDRESS>               
    smtp_connect_timeout <INTEGER>                                                
    router_id <STRING>                      
}

notification_email:接收告警通知的邮箱,可以设置多个。

notification_email_fromemail:告警邮件从那个邮箱发出。

smtp_server:发送告警邮件的SMTP服务器地址。

smtp_connect_timeout:连接SMTP服务器超时时间。

router_id: #运行keepalived的机器的路由标识,主备机一致。

(2)、Static addresses

static_ipaddress和static_routes用来给服务器配置静态的IP地址/路由。如果你的机器上已经配置了IP和路由,那么这两个区域可以不用配置。

一般情况下你的机器都会有IP地址和路由信息的,因此没必要再在这两个区域配置。

语法如下:

static_ipaddress{          
    <IP ADDRESS>/<MASK> brd <IPADDRESS> dev <STRING> scope <SCOPE>
    <IP ADDRESS>/<MASK> brd <IPADDRESS> dev <STRING> scope <SCOPE>
}
static_routes{                         
    src <IP ADDRESS> [to] <IPADDRESS>/<MASK> via|gw <IP ADDRESS> dev <STRING> scope<SCOPE> table <TABLE-ID> # to is optional
    src <IP ADDRESS> [to] <IPADDRESS>/<MASK> via|gw <IP ADDRESS> dev <STRING> scope<SCOPE> table <TABLE-ID> # to is optional
    src <IP ADDRESS> [to] <IPADDRESS>/<MASK> via|gw <IP ADDRESS> or <IP ADDRESS> dev<STRING> scope <SCOPE> table <TABLE-ID> # will use multipathroute
    blackhole <IP ADDRESS>[/<MASK>]
}

备注:以上两部份中的SCOPE可以指定的值为:site、link、host、nowhere、global。

如下为静态地址与静态路由配置示例:

示例1:

static_ipaddress{
    192.168.200.16 dev eth0 scope link
    192.168.200.17 dev eth1 scope link
    192.168.200.18 dev eth2
}

示例2:

static_routes{
    src 192.168.100.1 192.168.209.0/24 via192.168.200.254 dev eth0
    192.168.210.0/24 via 192.168.200.254 deveth0
    192.168.211.0/24 via 192.168.200.254 deveth0
    192.168.212.0/24 dev eth3 scope site
    192.168.213.0/24 dev eth1 scope link
}

2、VRRP配置

VRRP configuration配置是keepalive实现HA部分重要内容,同样也分为VRRP scripts、VRRP synchronization group、VRRP instance三个子块实现。

(1)、VRRP scripts

vrrp_script <STRING> {          # vrrp_script与track_script结合使用,<STRING>与track_script中<STRING>值设置为相同。
script <QUOTED_STRING>     #监控脚本或者监控命令。
interval<INTEGER>          #脚本运行时间间隔。
weight <INTEGER:-254..254> #设置weight值,取值范围-254-254。keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
    fall <INTEGER>              #运行失败指定次数后发生切换。
    rise <INTEGER>              #运行成功指定次数后不发生切换。
}

(2)、VRRP synchronization group

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

vrrp_sync_group <STRING>{ #vrrp_sync_group组名。

group {                        
      <STRING>      #指定加入vrrp_sync_group组的VRRP_Instance。
      <STRING>                
}
notify_master <STRING>|<QUOTED-STRING> #表示切换为master时所执行的脚本。
notify_backup <STRING>|<QUOTED-STRING> #表示切换为backup时所执行的脚本。
notify_fault <STRING>|<QUOTED-STRING>  #表示切换为fault时所执行的脚本。
notify <STRING>|<QUOTED-STRING>        #表示任何一状态切换时都会调用该脚本,并且该脚本在以上三个脚本执行完成之后进行调用,keepalived会自动传递4个参数。
    $1 = A stringindicating whether it's a "GROUP" or an "INSTANCE"
    $2 = The name of said groupor instance
    $3 = The state it'stransitioning to ("MASTER", "BACKUP" or "FAULT")
    $4 = The priorityvalue
    $1 and $3 are ALWAYSsent in uppercase, and the possible strings sent are the
    same ones listed above("GROUP"/"INSTANCE", "MASTER"/"BACKUP"/"FAULT").
smtp_alert  #使用global_defs里面定义的邮件地址和smtp服务器在切换后发送邮件通知。
}

(3)、VRRP instance

    vrrp_instance用来定义对外提供服务的VIP区域及其相关属性。

常用参数说明:

use_vmac:使用VRRP的虚拟MAC地址。

state MASTER|BACKUP:设置节点状态。keepalived启动时会将priority比较大的节点选举为MASTER。

interface <STRING>:用于HA检测与对外提供服务的网络的接口。

track_interface :监控指定的网卡,如果任何一个不通就会切换到FALT状态。

track_script:与vrrp_script参数一同使用,设定监控服务的脚本,<STRING>与vrrp_script参数中的名称相同。

mcast_src_ip :发送多播包的地址,如果不设置,默认使用绑定的网卡的primary IP。

dont_track_primary:忽略vrrp的interface错误,默认不设置。

lvs_sync_daemon_interface <STRING>:负载均衡器之间的监控接口,类似于HA HeartBeat的心跳线。但它的机制优于Heartbeat,因为它没有“裂脑”这个问题,它是以优先级这个机制来规避这个麻烦的。.

garp_master_delay <INTEGER>:当切为主状态后多久更新ARP缓存,默认为5秒。
virtual_router_id <INTEGER-0..255>:虚拟路由标识,主机与备机保持一致。
priority <INTEGER-0..255>:优先级,主机与备机必须不同。
advert_int <INTEGER>:同步通知间隔,MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位为秒。
authentication {                              
        auth_type PASS|AH:认证类型为PASS或AH,推荐使用PASS,主备必须使用相同认证方式及密码才可以通信。
        auth_pass<STRING>:设置认证密码。密码最多8位。
    }

virtual_ipaddress:漂移地址设置,可以设置多个。

virtual_routes : 虚拟路由,当IP漂过来之后需要添加的路由信息。

nopreempt:功能类似于heartbeat的auto_failback,设置不自动切回,该参数只能设置在state为backup的服务器上,且优先权必须高于其他节点的服务器上。

preempt_delay: 抢占延时,默认为0。

notify_master <STRING>|<QUOTED-STRING>:与vrrp_sync_group中相同。

notify_backup <STRING>|<QUOTED-STRING>:与vrrp_sync_group中相同。

notify_fault <STRING>|<QUOTED-STRING>: 与vrrp_sync_group中相同。

notify_stop <STRING>|<QUOTED-STRING>:  停止vrrp时,执行指定的脚本。

notify <STRING>|<QUOTED-STRING>:       与vrrp_sync_group中相同。

smtp_alert:与vrrp_sync_group中相同。

3、LVS配置

LVS的配置包括2部分:虚拟主机组(virtual server group)和虚拟主机(virtual server)。虚拟主机组一般用不到,这里不介绍。以下为虚拟主机常用参数介绍。

virtual_server<IP ADDRESS> <PORT> {     # 虚拟服务器设置标识,指定虚拟ip与端口,ip地址与端口号之间用空格隔开。

delay_loop <INTEGER>                # 延迟轮询时间
    lvs_sched rr|wrr|lc|wlc|lblc|sh|dh  # LVS调度算法
    ops                 #Apply One-Packet-Scheduling (only for UDP),不常用。
    lvs_method NAT|DR|TUN               # LVS调度类型
    persistence_timeout <INTEGER>       # 会话保持时间,单位为秒。
    persistence_granularity <NETMASK>   # 此选项是配合persistence_timeout,后面跟的值是子网掩码,表示持久连接的粒度。
    protocol TCP                        # 指定协议
    ha_suspend                          #节点状态从MASTER到BACKUP状态切换时,暂不启用real_server健康检查。
    virtualhost <STRING>                # HTTP_GET做健康检查时,检查的Web服务器的虚拟主机。
    sorry_server <IP ADDRESS><PORT>     # 备用机,所有的real server失效后启用。

    real_server健康检查方法有HTTP_GET|SSL_GET、TCP_CHECK、SMTP_CHECK、MISC_CHECK多种,以下分别做以介绍如何使用。

real_server <IP ADDRESS> <PORT> {  # 定义realserver
     weight <INTEGER>    # 用来配置real server节点的权值,数字越大权值越高。默认为1,0为失效。 
     inhibit_on_failure  # 服务器健康检查失败时,将其weight设置为0,而不是直接从IPVS里面删除。
     notify_up <STRING>|<QUOTED-STRING>   # 在检测到real server节点服务up状态后执行脚本。
     notify_down<STRING>|<QUOTED-STRING>  # 在检测到real server节点服务down状态后执行脚本。
       HTTP_GET|SSL_GET {   
            url {               # HTTP/SSL检查的URL,这里可以指定多个URL。
              path <STRING>     # 详细的URL路径。
              digest <STRING>       # SSL检查后的摘要信息。
              status_code <INTEGER> # HTTP检查的返回状态码,一般为200.
            }                       
            url {
              path <STRING>
              digest <STRING>
              status_code <INTEGER>
            }

     connect_ip <IP ADDRESS> # 健康检查连接的ip地址,如果不指定默认为realserver指定的IP。

     connect_port <PORT>     # 健康检查的端口,如果不指定默认为real server指定的端口。

     bindto <IP ADDRESS>     # 如果本机有多个网卡配置多个地址,那么通过此地址来发送请求对服务进行健康检查。

     bind_port <PORT>        # 通过本机此端口来发送请求对服务进行健康检查。

     connect_timeout <INTEGER>   # 连接超时时间

     fwmark <INTEGER>        # fwmark to set on socket (SO_MARK)

     nb_get_retry <INTEGER>  # 重试次数。

     delay_before_retry <INTEGER> # 重试间隔时间(秒)。

如果后端有众多realserver时,如果按精确时间发送检测报文,可能会造成本机的网络堵塞,因此可以使用warmup 指定一个时间,表示将发送检测报文的精确时间差开一点的时间,以免造成本机堵塞。

}
    }
    real_server <IP ADDRESS> <PORT>{   # 同上
        weight <INTEGER>        # 同上
        inhibit_on_failure      # 同上
        notify_up<STRING>|<QUOTED-STRING> # 同上
        notify_down<STRING>|<QUOTED-STRING> # 同上
 
        TCP_CHECK { 
            connect_ip <IP ADDRESS> # IPaddress to connect
            connect_port <PORT>     # TCP port to connect
            bindto <IP ADDRESS>     # IP address to bind to
            bind_port <PORT>        # TCP port to bind to
            connect_timeout<INTEGER>   # Timeout connection
            fwmark <INTEGER>        # fwmark to set on socket (SO_MARK)
            warmup <INTEGER>        # random delay for maximum N seconds
        }
    }
    real_server <IP ADDRESS> <PORT>{   # 同上
        weight <INTEGER>               # 同上
        inhibit_on_failure             # 同上
        notify_up<STRING>|<QUOTED-STRING>   # 同上
        notify_down<STRING>|<QUOTED-STRING> # 同上
 
        SMTP_CHECK {                    
            connect_ip <IP ADDRESS>     #Optional IP address to connect to
            connect_port <PORT>         # Optional port to connect to
            bindto <IP ADDRESS>         # Optional interface to use tooriginate the connection
            bind_port <PORT>            # Optional source port to originatethe connection from
            connect_timeout<INTEGER>   # Optional per-hostconnection timeout.
            fwmark <INTEGER>          # Optional fwmark to mark alloutgoing checker pakets with
            host {                      # Optional additional host/port to check
                connect_ip <IP ADDRESS> #IP address to connect
                connect_port <PORT>     # TCP port to connect
                bindto <IP ADDRESS>     # IP address to bind to
                bind_port <PORT>        # TCP port to bind to
                connect_timeout<INTEGER>   # Timeout connection
                fwmark <INTEGER>        # fwmark to set on socket (SO_MARK)
            }
            host {
                connect_ip <IP ADDRESS> #IP address to connect
                connect_port <PORT>     # TCP port to connect
                bindto <IP ADDRESS>     # IP address to bind to
                bind_port <PORT>        # TCP port to bind to
                connect_timeout<INTEGER>   # Timeout connection
                fwmark <INTEGER>        # fwmark to set on socket (SO_MARK)
            }
            connect_timeout<INTEGER>  # Connection andread/write timeout
            warmup <INTEGER>        # random delay for maximum N seconds
            retry <INTEGER>             # Number of times to retry afailed check
            delay_before_retry <INTEGER># Delay in seconds before retrying
            helo_name<STRING>|<QUOTED-STRING> # Host to use for the HELO request
        }
    }
    real_server <IP ADDRESS> <PORT>{   # 同上
        weight <INTEGER>               # 同上
        inhibit_on_failure             # 同上
        notify_up<STRING>|<QUOTED-STRING>   # 同上
        notify_down <STRING>|<QUOTED-STRING># 同上
 
        MISC_CHECK {                
            misc_path<STRING>|<QUOTED-STRING>  # 外部执行脚本。
            misc_timeout <INTEGER>      # 脚本执行超时时间。
            warmup <INTEGER>        # random delay for maximum N seconds
 
            # If set, exit code from healthcheckeris used
            # to dynamically adjust the weightas follows:
            #  exit status 0: svc check success, weight
            #     unchanged.
            #  exit status 1: svc check failed.
            #  exit status 2-255: svc check success, weight
            #     changed to 2 less than exit status.
            #  (for example: exit status of 255 would set
            #     weight to 253)
            misc_dynamic
        }
    }
}


转载于:https://blog.51cto.com/369day/1729528