一、 global_defs:全局定义块

# 全局定义块 
global_defs
{
	# 定义邮件通知,用于服务有故障时发送邮件报警,可选项,不建议用,需要系统开启sendmail服务,建议用第三独立监控服务
	notification_email
	{
	# 接收人,一行一个
	acassen@firewall.loc;

	failover@firewall.loc;
	sysadmin@firewall.loc;
	}


	# 邮件的发送人
	notification_email_from Alexandre.Cassen@firewall.loc

	# SMTP服务器地址
	smtp_server 192.168.200.1

	# SMTP服务器连接超时时间
	smtp_connect_timeout 30

	#用于指定发送hole消息的主机,一般是mx记录的主机
 	stmp_hole_name   


	# lvs负载均衡器标识,在一个网络内,它的值应该是唯一的。 
	lvs_id LVS_DEVEL_ID


	# 路由器标识,可以需要改,默认为本地主机名。故障发生时,邮件通知会用到。
	# 在局域网内应该是唯一的,注意和backup节点区分开。
	router_id KEEPALIVED.192.168.80.110

 


	# VRRP的ipv4和ipv6的广播地址,配置了VIP的网卡向这个地址广播来宣告自己的配置信息,下面是默认值
	vrrp_mcast_group4 224.0.0.18
	vrrp_mcast_group6 ff02::12

	
	# 设置用户static ipaddress的默认网络接口,如果系统没有eth0接口或者想为多个static ipaddress配置不同的接口时,使用该配置将会简化配置。
	default_interface  p33p1.3        

 


	# 该选项没有详细的官方文档说明,根据测试发现,该参数作用于ipvsad的sync daemon选项.
	# 当lvs_sync的状态和keepalived的状态一致,当kill掉master keepalived时,backup keepalive的state转变为master状态。
	lvs_sync_daemon <INTERFACE> <VRRP_INSTANCE> [id <SYNC_ID>] [MAXLEN <LEN>] [port <PORT>]  [ttl <TTL>] [group <IP ADDR>] 


	# 该功能新增于1.2.23版本。
	# 启动keepalived时刷新lvs配置,如果lvs没有配置,这不会刷新
	lvs_flush                                           


	# 设置当keepalived转变为master后,延迟多少秒发送第二组gratuitous arp。
	# 时间单位为秒,默认5秒,0表示不发送第二组gratuitous arp发送。
	# 注意第二组发送和第二次发送的区别
	vrrp_garp_master_delay 10                  


	# keepalived状态转变为master后,每次发送多少组grntuitous APR 信息的数量,默认为5个
	vrrp_garp_master_repeat 1                

	# 当master keepalived接收到一个较低优先级的广播后,一次发送gratuitous apr的数量组
	vrrp_garp_lower_prio_repeat 1  
           
	# master keepalived 每次发送gratuitous arp的最小时间间隔。默认是0,没有
	vrrp_garp_master_refresh 60               
	
	# master keepalived 每次发送gratuitous arp消息的组数量。
	vrrp_garp_master_refresh_repeat 2      
	

	# 小数类型,单位秒,在一个网卡上每组gratuitous arp消息之间的延迟时间
	# 默认为0,一个发送的消息=n组 arp报文
	vrrp_garp_interval  0.001        
	    
	# 小数类型,单位秒, 在一个网卡上每组na消息之间的延迟时间,默认为0
	vrrp_gna_interval    0.000001              
	
	# 如果接收到一个低优先级的通告,只需要丢弃它,不用发送其他通告
	# 字符类型:布尔值,false/true
	vrrp_lower_prio_no_advert                 
	
	# 设置vrrp协议版本,默认是版本2
	vrrp_version <2 or 3>                        


	# 该配置添加于1.2.21版本,添加vrrp_iptables全局配置选项。 
	# iptables / ip6tables条目始终添加在INPUT链的末尾,但对于许多配置,这在处理中太晚了。 
	# 此修补程序允许指定要添加规则的链名称, 并且还允许添加指定无规则的选项。
	#  如果指定了链名称,则该链必须已经存在于iptables和/或ip6tables配置中,并且该链将从ip表配置中的适当点调用。 
	# 默认是入站过滤 
	vrrp_iptables                                       


	# 或用于出站过滤。注意,出站过滤将不适用于IPv4,因为可以选择VIP作为出站连接的源地址。 
	# 对于IPv6,由于地址已过时,因此不太可能 
	vrrp_iptables keepalived_in keepalived_out     

	# 不添加任何iptables规则   
	vrrp_iptables                                                    


	# Keepalived可以选择将ipset与iptables结合使用。 如果是这样,则可以指定ipset名称,默认如下。如果没有指定名称,则不使用ipsets,否则将通过向先前指定的名称添加“_if”和/#或“6”来构造任何省略的名称。
	# ipset是iptables的扩展,它允许你创建匹配整个地址sets(地址集合)的规则。
	vrrp_ipset [keepalived [keepalived_if [keepalived6 [keepalived_if6]]]]               

	
	# 该选项允许在unicast模式中,检查vrrp包的源ip地址是否是unicast peers中的一个
	vrrp_check_unicast_src                     
	
	# 检查vrrp报文中的所有地址比较耗时,设置此标志的意思是如果接收的到报文和上一个报文来至同一个路由器,则不执行检查。默认是跳过检查
	vrrp_skip_check_adv_addr                    

	# 严格遵守vrrp协议,下面这些功能将会禁止:
		1.   0 VIP   
		2.   unicast(单播) peers    
		3.   vrrp 版本2的ipv6功能
	vrrp_strict                                            



	# 当vrrp或checker进程超时时,可以使用下面4个选项。
	# 这可以是备vrrp实例变为主vrrp状态。有时由于主或备系统太过繁忙,导致无法处理vrrp数据包,但这个时候主系统依然还在运行。 
	# 这时就需要使用下列四个选项来处理该问题。

	# 设置vrrp子进程优先级
	vrrp_priority <-20 to 19>  
                  
	# 设置checker子进程优先级
	checker_priority <-20 to 19 >     
       
	# 设置vrrp子进程不可交换
	vrrp_no_swap              
                        
	# 设置checker子进程不可交换 
	checker_no_swap           


                       
	# keepalived已经构建了对SNMP的支持,keepalived,checker和RFC支持可以单独启用/禁用

	# 用户指定连接到SNMP主代理的套接字(默认 unix:/var/agentx/master),除非使用的是网络空间名称,默认为udp:localhost:705
	snmp_sockert udp:1.2.3.4:705          

	# enable keepalived MIB的vrrp元素的SNMP处理功能
	enable_snmp_keepalived                

	# enable keepalived MIB的checker元素的SNMP处理功能
	enable_snmp_checker                
        
	# enable RFC2787和RFC6527处理功能 
	enable_snmp_rfc             

	# enable RFC2787 vrrp MIB的处理功能 
	enable_snmp_rfcv2         
 
	# enable RFC6527 vrrp  MIB的处理功能 
	enable_snmp_rfcv3     
       
	# enable SNMP traps功能 
	enable_traps                                        
}

二、vrrp_script
定义用于实例执行的脚本内容

vrrp_script check_nginx {

	# 执行脚本的路径
	script "/etc/nginx/check_nginx.sh"

	# 调用脚本两次之间的间隔,默认为1秒
	interval 1

	# 第二次调用脚本后多长时间没有回应的超时时间
	timeout 10

 
	# 根据该权重,动态调整调用该脚本选项的vrrp实例优先级,默认是2  
	# 当脚本返回值为0,权重大于0时,vrrp实例优先级增加;
	# 当脚本返回值为非0,权重小于0时,vrrp实例优先级减小,其他情况优先级不变。 
	# 当该值为0时,不改变实例的优先级 
	weight  <INTEGER:-254..254>  
	
	
	# 设置脚本返回值连续为0的次数。加入该参数后,
	# 当脚本执行码连续为0的次数为rise次,且权重大于0时,vrrp实例优先级增加
	rise <INTEGER>    
	# 设置脚本返回值连续为非0的次数。加入该参数后
	# 当脚本执行码连续为非0的次数为rfall次,且权重小于0时,vrrp实例优先级减小
	fall  <INTEGER>   

}

三、VRRP 实例定义块

3.1、vrrp_sync_group

# 同步vrrp级,用于确定失败切换(FailOver)包含的路由实例个数。即在有2个负载均衡器的场景,一旦某个负载均衡器失效,需要自动切换到另外一个负载均衡器的实例是哪
vrrp_sync_group string { 

	# 至少要包含一个vrrp实例,vrrp实例名称必须和vrrp_instance定义的一致
    group {

        string
        string

    }
}

3.2、vrrp_instance

# 定义一个虚拟路由器的实例,实例名称VI_1
vrrp_instance VI_1 {
	# 状态只有MASTER和BACKUP两种,并且要大写,MASTER为工作状态,BACKUP是备用状态。
	state MASTER

	# 对外提供服务的网卡接口,即VIP绑定的网卡接口。如:eth0,eth1。当前主流的服务器都有2个或2个以上的接口(分别对应外网和内网),在选择网卡接口时,一定要核实清楚。 
	interface ens33


    # 这个默认没有,负载均衡器之间的监控接口,类似于 HA HeartBeat 的心跳线。但它的机制优于 Heartbeat,因为它没有“裂脑”这个问题,它是以优先级这个机制来规避这个麻烦的。在 DR 模式中,lvs_sync_daemon_inteface与服务接口interface使用同一个网络接口 
 
    lvs_sync_daemon_inteface enp0s8

	# 本机IP地址 
    mcast_src_ip 182.138.32.12 

	# 有故障时是否激活邮件通知 
	smtp_alert


	# 虚拟路由ID,如果是一组虚拟路由就定义一个ID,如果是多组就要定义多个,
	# 而且这个虚拟ID还是虚拟MAC最后一段地址的信息,取值范围0-255
	# 同一个vrrp_instance的MASTER和BACKUP的vitrual_router_id 是一致的。
	virtual_router_id 51

	# 使用哪个虚拟MAC地址
	use_vmac XX:XX:XX:XX:XX

	# 监控本机上的哪个网卡,网卡一旦故障则需要把VIP转移出去
	track_interface {
		eth0
		ens33
	}

	# 优先级,同一个vrrp_instance的MASTER优先级必须比BACKUP高。
	priority 100

	# MASTER 与BACKUP 负载均衡器之间同步检查的时间间隔,单位为秒。
	advert_int 1

	# 验证authentication。包含验证类型和验证密码。类型主要有PASS、AH 两种,通常使用的类型为PASS.
	# auth_pass 1111   据说AH 使用时有问题。验证密码为明文,同一vrrp 实例MASTER 与BACKUP 使用相同的密码才能正常通信。
	authentication {
		auth_type PASS
		auth_pass 1111
	}

	# 虚拟VIP地址,可以有多个地址,每个地址占一行,不需要子网掩码
	# 同时这个ip 必须与我们在lvs 客户端设定的vip 相一致!
 
	virtual_ipaddress {
		# IP/掩码 dev 配置在哪个网卡
		192.168.200.16/24 dev eth1

		# IP/掩码 dev 配置在哪个网卡的哪个别名上
		192.168.200.17/24 dev label eth1:1
	}

	# 虚拟路由,在需要的情况下可以设置lvs主机 数据包在哪个网卡进来从哪个网卡出去
	virtual_routes {
		192.168.110.0/24 dev eth2
	}

	# 工作模式,nopreempt表示工作在非抢占模式,默认是抢占模式 preempt
	nopreempt|preempt

	# 如果是抢占默认则可以设置等多久再抢占,默认5分钟
	preempt delay 300

	# 追踪脚本,通常用于去执行上面的vrrp_script定义的脚本内容
	track_script {
		#调用检测脚本
		check_nginx

		#chk_http_port
	}

	# 三个指令,如果主机状态变成Master|Backup|Fault之后会去执行的通知脚本,脚本要自己写
	notify_master ""
	notify_backup ""
	notify_fault ""
}

四、虚拟服务器定义块

# 定义LVS集群服务,名称可以是IP+PORT,也可以是fwmark 数字,也就是防火墙规则 
virtual_server 10.10.10.2 1358 {
	# 健康检查时间间隔,单位:秒 
	delay_loop 6

	# 负载均衡调度算法,互联网应用常用方式为wlc或rr 
	lb_algo rr|wrr|lc|wlc|lblc|sh|dh 

	# 负载均衡转发规则。包括DR、NAT、TUN 3种,一般使用路由(DR)转发规则。 
	lb_kind NAT|DR|TUN

	# 子网掩码,这个掩码是VIP的掩码
	nat_mask 255.255.255.0

	# http服务会话保持时间,单位:秒 
	persistence_timeout 50

	# 转发协议,分为TCP和UDP两种
	protocol TCP

	# 如果后端应用服务器都不可用,就会定向到那个服务器上
	sorry_server 192.168.200.200 1358

    # 真实服务器IP和端口,可以定义多个 
    real_server 192.168.200.2 1358 {
		# 负载权重,值越大,转发的优先级越高 
        weight 1

        # MSIC_CHECK|SMTP_CHEKC|TCP_CHECK|SSL_GET|HTTP_GET这些都是,针对应用服务器做健康检查的方法  
        MISC_CHECK {}

        # 用于检查SMTP服务器的
        SMTP_CHEKC {}

        # 如果应用服务器不是WEB服务器,就用TCP_CHECK检查
        TCP_CHECK {
			
			# 向哪一个端口检查,如果不指定默认使用上面定义的端口
			connect_port <PORT>
			
			# 向哪一个IP检测,如果不指定默认使用上面定义的IP地址
			bindto <IP>
			
			# 连接超时时间
			connect_timeout 3

        }

        # 如果对方是HTTPS服务器就用SSL_GET方法去检查,里面配置的内容和HTTP_GET一样
        SSL_GET {}

        # 应用服务器UP或者DOWN,就执行那个脚本
        notify_up "这里写的是路径,如果脚本后有参数,整体路径+参数引起来"
        notify_down "/PATH/SCRIPTS.sh 参数"

        # 使用HTTP_GET方法去检查
        HTTP_GET {
				# 检测URL
			url { 
				# 具体检测哪一个URL
				path /testurl/test.jsp

				# 检测内容的哈希值
				digest 640205b7b0fc66c1ea91c463fac6334d

				# 除了检测哈希值还可以检测状态码,比如HTTP的200 表示正常,两种方法二选一即可
				status_code 200
			}
            url { 
				path /testurl2/test.jsp
				digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
				path /testurl3/test.jsp
				digest 640205b7b0fc66c1ea91c463fac6334d
            }
            # 向哪一个端口检查,如果不指定默认使用上面定义的端口
            connect_port <PORT>

            # 向哪一个IP检测,如果不指定默认使用上面定义的IP地址
            bindto <IP>

            # 连接超时时间
            connect_timeout 3

            # 服务连接失败重试次数 
            nb_get_retry 3

            # 重试连接间隔,单位:秒
            delay_before_retry 3
        }
    } 
}