KeepAlived实现
HA Cluster 配置准备:
 (1) 各节点时间必须同步 ntp, chrony
 (2) 确保iptables及selinux不会成为阻碍
 (3) 各节点之间可通过主机名互相通信(对KA并非必须)建议使用/etc/hosts文件实现
 (4) 各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信(对KA并非必须)

 

一、yum 安装  Base源
yum install keepalived


二、源码编译安装Keepalived

1 安装依赖包
[root@~]# yum install libnfnetlink-devel libnfnetlink ipvsadm  libnl libnl-devel  \
libnl3 libnl3-devel   lm_sensors-libs net-snmp-agent-libs net-snmp-libs  openssh-server \
openssh-clients  openssl  openssl-devel automake iproute  gcc
2.下载Keepalived
[root@~]# cd /usr/local/src/
[root@src]# wget http://www.keepalived.org/software/keepalived-1.3.4.tar.gz
[root@src]# tar xvf keepalived-1.3.4.tar.gz
[root@src]# cd keepalived-1.3.4/
3.编译安装
[root@localhost keepalived-1.3.4]#  ./configure --prefix=/usr/local/keepalived --disable-fwmark
[root@ keepalived-1.3.4]# make && make install

4.复制相关配置文件及启动脚本:
[root@keepalived-1.3.4]# cp /usr/local/src/keepalived-1.3.4/keepalived/etc/init.d/keepalived.rh.init  /etc/sysconfig/keepalived 
[root@keepalived-1.3.4]# cp /usr/local/src/keepalived-1.3.4/keepalived/keepalived.service   /usr/lib/systemd/system/
[root@keepalived-1.3.4]# cp  /usr/local/keepalived/sbin/keepalived  /usr/local/sbin/
5.准备一个简单的配置文件:
[root@keepalived-1.3.4]# mkdir /etc/keepalived
[root@keepalived-1.3.4]# cp  /usr/local/keepalived/etc/keepalived/keepalived.conf   /etc/keepalived/
[root@keepalived-1.3.4]# vim /etc/keepalived/keepalived.conf  从其它keepalived复制过来。

  

Keepalived配置文件
Keepalived配置文件:1.全局设置 2.Vrrpd虚拟路由器设置 3.LVS设置
GLOBAL CONFIGURATION
    Global definitions
    Static routes/addresses
VRRPD CONFIGURATION
    VRRP synchronization group(s):vrrp同步组
    VRRP instance(s):即一个vrrp虚拟路由器
LVS CONFIGURATION
    Virtual server group(s)
    Virtual server(s):ipvs集群的vs和rs

1.全局设置
   notification_email {  # 邮件通知信息
     root@localhost		 # 定义收件人,#QQ邮件账号启用SMTP功能获取到验证码
   }
   notification_email_from keepalived@localhost  #往外发送邮件身份
   smtp_server 127.0.0.1                		 #发邮件地址
   smtp_connect_timeout 30
   router_id  KA1            			#虚拟机路由名称, 路由器标识,可以写成每个主机自己的主机名
   vrrp_mcast_group4 224.100.100.100            #VRRP的ipv4和ipv6的广播地址,配置了VIP的网卡向这个地址广播来宣告自己的配置信息,默认值:224.0.0.18 范围:224.0.0.0到239.255.255.255
   vrrp_mcast_group6 ff02::120 			#VRRP的ipv6的广播地址
   vrrp_script SCRIPT_NAME {			# 定义用于实例执行的脚本内容,比如可以在线降低优先级,用于强制切换
		script <STRING>|<QUOTED-STRING> 	                # shell命令或脚本路径,此脚本返回值为非0时(假),会触发下面OPTIONS执行
		interval <INTEGER> 					# 间隔时间,单位为秒,默认1秒
		timeout <INTEGER> 					# 超时时间
		weight <INTEGER:-254..254> 			        # 权重,监测失败后会执行权重相加,权重可以为负数即相加后降低本机权重
		fall <INTEGER> 						#脚本几次失败转换为失败
		rise <INTEGER> 						# 脚本连续监测成功后,把服务器从失败标记为成功的次数
		user USERNAME [GROUPNAME]			        # 执行监测的用户或组
		init_fail 					        # 设置默认标记为失败状态,监测成功之后再转换为成功状态
   }			

  vrrp_skip_check_adv_addr      #对所有通告报文都检查,会比较消耗性能,启用此配置后,如果收到的通告报文和上一个报文是同一个路由器,则跳过检查,默认值为全检查
  vrrp_strict 		        #严格遵守VRRP协议,禁止以下状况:1.无VIP地址 2.配置了单播(unicast选择) 3.在VRRP版本2中有IPv6地址,开启动此项会自动开启iptables防火墙规则,建议关闭此项配置,
  vrrp_garp_interval 0 		#gratuitous ARP messages报文发送延迟,0表示不延迟
  vrrp_gna_interval 0  		#unsolicited NA messages (不请自来)消息发送延迟
  vrrp_iptables        		#开启此项,当vrrp_strict开启时,不添加防火墙规则,否则VIP无法访问。+KA的VIP接口一般是转发给后端服务器,所以默认是禁止访问KA服务器。
  defaul_interface p33p1.3 	#设置静态地址的默认接口 eth0
  nopreempt         		#非抢占模式所有的state都为BACKUP
  
  include /etc/keepalived/conf.d/*.conf;  #设置Vrrpd虚拟路由器子配置文件。与VRRPD或GLOBAL同级。


2.Vrrpd虚拟路由器配置说明
state MASTER|BACKUP:	#当前节点在此虚拟路由器上的初始状态;只能有一个是MASTER,余下的都应该为BACKUP
interface IFACE_NAME:	#绑定为当前虚拟路由器使用的物理接口
priority 100:		#当前物理节点在此虚拟路由器中的优先级;范围1-254,如果你上面定义了MASTER,这里的优先级就需要定义的比其他的高
virtual_router_id VRID:#当前虚拟路由器惟一标识,范围是0-255,多个节点必须相同
use_vmac XX:XX:XX:XX:XX #使用哪个虚拟MAC地址
advert_int 1:			vrrp通告的时间间隔,也叫心跳通告时间,默认1s
authentication { 		#认证机制,auth_pass仅前8位有效
	auth_type AH|PASS
	auth_pass <PASSWORD>}
virtual_ipaddress {# 设置虚拟VIP地址,一般就设置一个,在LVS中这个就是为LVS主机设置VIP的,这样你就不用自己手动设置了
	192.168.200.17/24
	192.168.200.17/24 dev eth1
	192.168.200.18/24 dev eth2 label eth2:1}
track_interface {    #配置监控网络接口,一旦出现故障,则转为FAULT状态,实现地址转移,主要防止”interface  IFACE_NAME“的网卡出现故障
	eth0
	eth1}

virtual_routes { 	 #虚拟路由,在需要的情况下可以设置lvs主机 数据包在哪个网卡进来从哪个网卡出去
    192.168.110.0/24 dev eth2}	
nopreempt:			 #定义工作模式为非抢占模式
preempt_delay 300:  #抢占式模式,节点上线后触发新选举操作的延迟时长,默认模式
track_script { SCRIPT_NAME }     #追踪脚本,通常用于去执行上面的vrrp_script定义的脚本内容

定义通知脚本:根据状态触发,# 三个指令,如果主机状态变成Master|Backup|Fault之后会去执行的通知脚本,脚本要自己写
	notify_master <STRING>|<QUOTED-STRING>:
		当前节点成为主节点时触发的脚本
	notify_backup <STRING>|<QUOTED-STRING>:
		当前节点转为备节点时触发的脚本
	notify_fault <STRING>|<QUOTED-STRING>:
		当前节点转为“失败”状态时触发的脚本
	notify <STRING>|<QUOTED-STRING>:
		通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知


3.KeepAlived支持IPVS(LVS)设置参数说明

virtual server (虚拟服务)的定义的三种方法:
virtual_server IP port #定义虚拟主机IP地址及其端口, (IP跟virtual_ipaddress中的IP相同,也跟后端LVS中的VIP相同)。
virtual_server fwmark int #ipvs的防火墙打标,实现基于防火墙的负载均衡集群,(FWM标签)
virtual_server group string #将多个虚拟服务器定义成组,将组定义成虚拟服务,如:http和https定义成一个虚拟服务器组

virtual_server IP port {			#VIP和PORT
	delay_loop <INT>:			#检查后端服务器的时间间隔
	lb_algo rr|wrr|lc|wlc|lblc|sh|dh:	#定义调度方法
	lb_kind NAT|DR|TUN:			#集群的类型
	persistence_timeout <INT>: 		#持久连接时长
	protocol TCP|UPD:			#服务协议,仅支持TCP
	nat_mask 255.255.255.0			#子网掩码,这个掩码是VIP的掩码
	sorry_server <IPADDR> <PORT>:  	#所有RS故障时,备用服务器地址
	real_server <IPADDR> <PORT>             #VIP和PORT
	{
		weight <INT> 				        #RS权重
		notify_up <STRING>|<QUOTED-STRING> 		#RS上线通知脚本
		notify_down <STRING>|<QUOTED-STRING> 	        #RS下线通知脚本
		HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... }:#定义当前主机的健康状态检测方法
	}
}
3.1
HTTP_GET|SSL_GET:	应用层检测方法
	HTTP_GET|SSL_GET {
		url {
			path <URL_PATH>:	定义要监控的URL
			status_code <INT>:	判断上述检测机制为健康状态的响应码,(digest要startus 两种方法二选一即可)
			digest <STRING>:	检测内容的哈希值,判断为健康状态的响应的内容的校验码,URL的文件改了哈希值会变以,
		}
		connect_timeout <INTEGER>:	连接请求的超时时长
		nb_get_retry <INT>:		重试次数
		delay_before_retry <INT>:	重试之前的延迟时长
		connect_ip <IP ADDRESS>:	向当前RS哪个IP地址发起健康状态检测请求
		connect_port <PORT>:		向当前RS的哪个PORT发起健康状态检测请求
		bindto <IP ADDRESS>:		发出健康状态检测请求时使用的源地址
		bind_port <PORT>:		发出健康状态检测请求时使用的源端口
	}
3.2
TCP_CHECK	传输层检测方法,如果应用服务器不是WEB服务器,就用TCP_CHECK检查
	TCP_CHECK {
		connect_ip <IP ADDRESS>:	向当前RS的哪个IP地址发起健康状态检测请求
		connect_port <PORT>:		向当前RS的哪个PORT发起健康状态检测请求
		bindto <IP ADDRESS>:		发出健康状态检测请求时使用的源地址
		bind_port <PORT>:		发出健康状态检测请求时使用的源端口
		connect_timeout <INTEGER>:	连接请求的超时时长
		nb_get_retry 3			尝试次数
		delay_before_retry 3		每次尝试之间间隔几秒
	}