Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,主要用来提供故障切换和健康检查功能,如判断LVS负载调度器、节点服务器的可用性,及时隔离并替换为新的服务器,当故障主机恢复后将其重新加入集群。后来又加入了可以实现高可用的VRRP功能。因此,keepalived除了能够管理LVS软件外,还可以作为其他服务的高可用解决方案软件(如nginx、Mysql等应用服务)。
keepalived软件主要是通过VRRP协议实现高可用功能的。VRRP是Virtual Router Redundancy Protocol(虚拟路由冗余协议)的缩写,VRRP出现的目的就是为了解决路由器的单点故障问题的,它能保证当个别节点宕机时,整个网络可以不间断地运行。所以,keepalived一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可以实现系统网络服务的高可用功能。
VRRP是针对局域网中配置静态网关出现单点故障的解决方案,一个局域网络内的所有主机都设置缺省路由(默认网关),当网内主机发出的目的地址不在本网段时,报文将被通过缺省路由发往外部路由器,从而实现了主机与外部网络的通信。当缺省路由器down掉(即端口关闭)之后,内部主机将无法与外部通信,如果路由器设置了VRRP时,那么这时,虚拟路由将启用备份路由器,从而实现全网通信。
工作流程如图:
VRRP是针对路由器的一种备份解决方案-----由多台路由器组成一个热备组。这个热备组里面有一个master和多个backup。master上面有一个对外提供服务的vip,通过vip地址对外提供服务;每个热备组内同一时刻只有一台主服务器提供服务,其他服务器处于冗余状态,若当前在线的主服务器失败,其他服务器会自动接替(优先级决定接替顺序)虚拟IP地址,以继续提供服务。热备组内的每台服务器都可以成为主服务器,虚拟IP地址(VIP)可以在热备组内的服务器之间进行转移,所以也称为漂移IP地址,使用Keepalived时,漂移地址的实现不需要手动建立虚拟接口配置文件(如ens33:0),而是由Keepalived根据配置文件自动管理。
Keepalived高可用服务对(主备)之间的故障切换转移,是通过VRRP来实现的。在keepalived服务工作时,主Master节点会不断地向备节点发送(多播的方式)心跳消息,用来告诉备Backup节点自己还活着。当主节点发生故障时,就无法发送心跳的消息了,备节点也因此无法继续检测到来自主节点的心跳了。于是就会调用自身的接管程序,接管主节点的IP资源和服务。当主节点恢复时,备节点又会释放主节点故障时自身接管的IP资源和服务,恢复到原来的备用角色。
OSI七层:
OSI七层相关协议
Layer3、4、5工作在IP/TCP协议栈的IP层,TCP层,及应用层。
keepalived具有3、4、5层交换及健康检测功能。
Layer3层检测:进行ICMP ping包检测,确认主机是否存活,如果异常,则会该主机从服务器集群中剔除。Keepalived 使用 Layer3 的方式工作式时, Keepalived 会定期向集群中的服务器发送一个 ICMP 的数据包(既我们平时用的 Ping 程序),如果发现某台服务的IP地址没有激活,Keepalived 便报告这台服务器失效,并将它从集群中剔除,这种情况的典型例子是某台服务器被非法关机。Layer3 的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。
Layer4层检测: 进行端口检测,例如80、3306等,端口不通时,将服务器从集群中剔除;主要以TCP端口的状态来决定服务器工作正常与否。如 web server 的服务端口一般是80,如果 Keepalived 检测到 80 端口没有启动,则 Keepalived 将把这台服务器从服务器群中删除。
Layer5层检测:这个就是基于应用的了,如http返回码是否为200,确认主机是否正常。Layer5 就是工作在具体的应用层了,比 Layer3,Layer4 要复杂一点,在网络上占用的带宽也要大一些。 Keepalived 将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则 Keepalived 将把服务器从服务器群中剔除(例如:http返回码是否为200,确认主机是否正常)。
1.管理LVS
2.对LVS集群节点检查
3.作为其他网络服务的高可用功能
下图是keepalived的组件图:
keepalived也是模块化设计,不同模块负责不同的功能,它主要有三个模块,分别是core、check和VRRP,其中:
core模块:为keepalived的核心组件,负责主进程的启动、维护以及全局配置文件的加载和解析;
check:负责健康检查,包括常见的各种检查方式;
VRRP模块:是来实现VRRP协议的。
其他组件:
system call:系统调用
watch dog:监控check和vrrp进程的看管者,check负责检测健康状态,当其检测到master上的服务不可用时则通告vrrp将其转移至backup服务器上。
大致如下:
1.利用VRRP协议进行主备通信。组播224.0.0.18
2.利用VRRP协议进行主备竞选,产生VIP
3.利用VRRP协议主向备发送组播包。当备服务器接收不到主服务器的组播包,就会认为主出现故障,主动接管资源
4.当主恢复时,根据配置决定是否抢占备服务器资源
ipvs wrapper:为集群内的所有节点生成IPVS规则
注意,keepalived和LVS完全是两码事,只不过他们各负其责,相互配合而已。
Keepalived启动后会有三个进程:
父进程:内存管理,子进程管理等等
子进程:vrrpd子进程
子进程:healthchecker子进程
由上图可知,两个子进程都被系统WatchDog看管,两个子进程各自实现自己的事,healthchecker子进程实现检查各自服务器的健康程度,例如HTTP,LVS等等,如果healthchecker子进程检查到MASTER上服务不可用,就会通知本机上的VRRP子进程,让他删除通告,并且去掉虚拟IP,转换为BACKUP状态。
LVS+keepalived+nginx+tomcat(apache+php+eaccelerator)+nfs(nfs可选)
注:eaccelertor [əkˈseləreɪtər]是一个开放源代码的php加速、优化和动态内容缓存的扩展模块,它可以提升php程序的缓存性能,降低PHP程序在解析时对服务器的性能开销。eaccelerator还有对PHP优化的作用,加快其执行效率。
Nginx做反向代理,若出现Nginx单机故障,则导致整个系统无法正常运行。针对系统架构设计的高可用要求,我们需要解决Nginx出现单机故障时,系统正常运行的需求。所以系统架构引入Lvs+Keepalived组件,实现系统高可用。
Keepalived for Linux
keepalived下载:
Keepalived for Linux
网络拓扑
上图设计目的是用Keepalived构建高可用性的LVS负载均衡集群。使用Keepalived构建LVS集群更加简便易用,主要优势体现在:对LVS负载调度器实现热备切换,提高可用性,对WEB服务器池中的节点进行健康检查,自动移除失败节点,恢复后再重新加入。
在基于LVS-Keepalived实现的LVS集群结构中,至少包括两台热备的负载调度器,两台或两台以上的web节点服务器,本例将以DR模式的LVS集群为基础,增加一台从负载调度器,使用Keepalived来实现主、从调度器的热备,从而构建建有负载均衡、高可用两种能力的LVS网站集群平台。
注:关闭防火墙和selinux
Keepalived的设计目标是构建高可用的LVS负载均衡群集,可以调用ipvsadm工具来创建虚拟服务器、管理服务器池,而不仅仅用来做双机热备。使用Keepalived构建LVS群集更加简便易用,主要优势体现在:对LVS负载调度器实现热备切换,提高可用性;对服务器池中的节点进行健康检查,自动移除失效点节,恢复后再重新加入。
使用 Keepalived构建LVS群集时,也需要用到ipvsadm管理工具,但大部分工作会由Keepalived自动完成,不需要手动执行ipvsadm(除了查看和监控群集以外)
开一台虚拟机rs02,配置keepalived
第一种安装方法:
yum install –y keepalived
查看安装路径:
rpm -ql keepalived-1.3.5-1.el7.x86_64
第二种安装方法(源码安装)
本文采用第二种安装方法
在主节点ds02上安装keepalived
[root@ds02 ~]# yum -y install gcc openssl-devel pcre-devel libnl-devel #安装依赖
[root@ds02 ~]# tar zxf keepalived-2.0.18.tar.gz #解包
[root@ds02 ~]# cd keepalived-2.0.18/
[root@ds02 keepalived-2.0.18]# ./configure --prefix=/usr/local/keepalived
[root@ds02 keepalived-2.0.18]# make && make install
了解keepalived的文件
[root@ds02 keepalived-2.0.18]# cd /usr/local/keepalived/
[root@ds02 keepalived]# ls
bin etc sbin share
#etc下有配置文件etc/keepalived/keepalived.conf
在从节点ds01上用同样的方法安装keepalived(过程略)
在这种模式下,虚拟 IP 在某时刻只能属于某一个节点,另一个节点作为备用节点存在。当主节点不可用时,备用节点接管虚拟 IP,提供正常服务。
配置说明:
节点ds02(主节点); 节点ds01(备用节点) ;
虚拟 IP :192.168.10.100对外提供服务的 IP。 要求默认情况下由节点ds02提供服务,当节点ds02不可用时,由节点ds01提供服务(即虚拟 IP 漂移至节点ds01)。
主节点ds02配置
keepalived只有一个配置文件keepalived.conf,里面主要包括以下几个配置区域,分别是global_defs、vrrp_instance和virtual_server。
global_defs:主要是配置故障发生时的通知对象以及机器标识。
vrrp_instance:用来定义对外提供服务的VIP区域及其相关属性。
virtual_server:虚拟服务器定义。
修改keepalived.conf配置文件
Ds02主机上的keepalived.conf文件的修改:
[root@ds02 ~]# ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/
[root@ds02 ~]# mkdir /etc/keepalived/
[root@ds02 ~]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
[root@ds02 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived #!表示注释
global_defs { #全局定义部分
notification_email { #设置警报邮箱
[email protected] #接收警报的邮箱地址,根据实际情况写
}
notification_email_from [email protected] #设置发件人地址
smtp_server 192.168.200.1 #设置smtp server地址,即发邮件服务器
smtp_connect_timeout 30 #设置smtp超时连接时间,以上参数可以不配置
router_id ds02 #表示运行keepalived服务器的一个标识,这个标识(router_id)是唯一的
}
vrrp_instance lvs-dr { #定义一个实例,一个集群就是一个实例。 默认VI_1 可以随意改
state MASTER #MASTER表示指定本节点为主节点,备用节点上设置为 BACKUP。注意节点状态均大写。
interface ens33 #绑定虚拟 IP 的网络接口
virtual_router_id 51 #虚拟路由ID标识,这个标识最好是一个数字,在一个keepalived.conf配置中是唯一的, MASTER和BACKUP配置中相同实例的virtual_router_id必须是一致的。
priority 100 #节点的优先级(1-254之间),越大越优先。备用节点必须比主节点优先级低。
advert_int 1 #为同步通知间隔。MASTER与BACKUP之间心跳检查的时间间隔,单位为秒,默认为1。
authentication { #设置验证信息,两个节点必须一致,同一vrrp实例的MASTER与BACKUP使用相同的密码才能正常通信。
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #指定虚拟 IP, 两个节点设置必须一样
192.168.10.100
}
}
#至此为止以上为实现高可用配置,如只需使用高可用功能下边配置可删除
#以下为虚拟服务器定义部分
#类似添加虚拟服务器 ipvsadm -A -t 192.168.10.100:80 -s rr
virtual_server 192.168.10.100 80 { #设置虚拟服务器,指定虚拟IP和端口
delay_loop 6 #健康检查时间为6秒,即Keepalived多长时间监测一次RS。
lb_algo rr #设置负载调度算法为rr算法
lb_kind DR #设置负载均衡模式,有NAT,TUN和DR三种模式可选
nat_mask 255.255.255.0 #非NAT模式注释掉此行 注释用!号
persistence_timeout 50 #连接保持时间,单位是秒。有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话的保持时间。同一IP地址的客户端50秒内的请求都发到同个real server ,这个会影响LVS的 rr 调度算法,同一IP的客户端超过50 秒后,再次访问,才会被转发到另一台real server上。Persistence是持久性的意思
protocol TCP #指定转发协议类型,有TCP和UDP两种
real_server 192.168.10.5 80 { #配置RS节点1,需要指定 realserver 的真实 IP 地址和端口,IP和端口之间用空格隔开
weight 1 ##权重,权重大小用数字表示,数字越大,权重越高
TCP_CHECK { #节点健康检查。这段内容要手动添加,把原来的内容删除
connect_timeout 3 #超时时间,表示3秒无响应超时。
nb_get_retry 3 #表示重试次数
delay_before_retry 3 #表示重试间隔
connect_port 80 #检测端口,利用80端口检查
}
}
real_server 192.168.10.6 80 { #RS节点2
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
#默认配置文件中还有两个 virtual_server 模版,把剩下的都删除了,就可以。
keepalived.conf配置文件完整内容如下所示:
[root@ds02 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id ds02
}
vrrp_instance lvs-dr {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.100
}
}
virtual_server 192.168.10.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
#persistence_timeout 50
protocol TCP
real_server 192.168.10.5 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.10.6 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
重启keepalived服务和开机自启
[root@ds02 ~]# systemctl restart keepalived
[root@ds02 ~]# systemctl enable keepalived
[root@ds02 ~]# systemctl status keepalived
安装ipvsadm
安装完成不需要做任何配置,启动方式由keepalived控制
[root@ds02 ~]# yum -y install ipvsadm #俩台都装(ds01,ds02)
[root@ds02 ~]# lsmod | grep ip_vs
[root@ds02 ~]# ipvsadm -Ln
安装keepalived
和主节点ds02安装相同,请参考ds02的安装过程。
修改keepalived.conf配置文件
备用节点的keepalived.conf文件配置与主节点基本相同,只是router_id,state,priority三处不同,其他配置都相同
[root@ds01 ~]# mkdir /etc/keepalived
[root@ds01 ~]# scp [email protected]:/etc/keepalived/keepalived.conf /etc/keepalived/
复制过来之后,还要做一定的修改:
[root@ds01 ~]# vim /etc/keepalived/keepalived.conf
注:红色为改动项值
! Configuration File for keepalived
global_defs {
router_id ds01
}
vrrp_instance lvs-dr {
state BACKUP
interface ens33
virtual_router_id 51
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.100
}
virtual_server 192.168.10.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
#persistence_timeout 50
protocol TCP
real_server 192.168.10.5 80 {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.10.6 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
重启keepalived服务和开机自启
[root@ds01 ~]# systemctl restart keepalived
[root@ds01 ~]# systemctl enable keepalived
查看主备情况
在ds02和ds01分别执行ip addr show dev ens33命令查看ds02和ds01对VIP(群集虚拟IP)的控制权。
ds02主节点的查看结果:
[root@ds02 ~]# ip addr show dev ens33
ds01从节点的查看结果:
[root@ds01 ~]# ip addr show dev ens33
从上面的显示结果可以看出ds02是主服务器,ds01为备用服务器。
主备vip漂移,只需关闭主节点的keepalived服务,主节点VIP地址消失,备节点显示VIP地址,开启主的keepalived服务,备VIP节点VIP地址消失,主节点显示VIP地址。
[root@ds02 ~]# systemctl stop keepalived
[root@ds02 ~]# ip addr show dev ens33
[root@ds01 ~]# ip addr show dev ens33
[root@ds02 ~]# systemctl start keepalived
[root@ds02 ~]# ip addr show dev ens33
由于某些原因,导致两台keepalived高可用服务器在指定时间内,无法检测到对方存活心跳信息,从而导致互相抢占对方的资源和服务所有权,然而此时两台高可用服务器有都还存活。表现形式就是备节点上出现了虚拟IP, 此时主节点也是持有虚拟IP的。
脑裂产生的原因:
一般来说,裂脑的发生,有以下几种原因:
高可用服务器对之间心跳线链路发生故障,导致无法正常通信。
因心跳线坏了(包括断了,老化)。
因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)。
因心跳线间连接的设备故障(网卡及交换机)。
高可用服务器上开启了iptables防火墙阻挡了心跳消息传输。
高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败。
其他服务配置不当等原因,如心跳方式不同,心跳广插冲突、软件Bug等。
Keepalived配置里同一 VRRP实例如果 virtual_router_id两端参数配置不一致也会导致裂脑问题发生。
关闭ARP转发(在两台RS上都需要同样的操作)。
[root@rs01 ~]# vim /etc/sysctl.conf #最后添加
net.ipv4.conf.ens33.arp_ignore = 1
net.ipv4.conf.ens33.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
使内核参数修改生效:
[root@rs01 ~]# sysctl -p #在rs02上也使内核参数生效
因为之前安装过httpd所以不用安装了,如果没有可以参考之前文章安装httpd
先把之前keepalived配置文件中连接保持时间注释掉(ds01,ds02)
重启keepalived
systemctl restart keepalived
http://192.168.10.100
刷新一下
TCP_CHECK :tcp端口检测
HTTP_GET :http接口检测
MISC_CHECK :自定义脚本检测
TCP_CHECK检测
real_server 192.168.10.5 80 {
weight 1
TCP_CHECK{
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_prot 80
}
}
HTTP_GET检测
基于状态码的检测
real_server 192.168.10.5 80 {
weight 1
HTTP_GET{
url{
path /index.html
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
MISC_CHECK检测
自定义shell脚本监控
real_server 172.16.16.177 80 {
weight 100
MISC_CHECK {
misc_path "/opt/mytools/check_web.sh 172.16.16.177" #脚本名,需全路径
misc_timeout 30 #脚本执行的超时时间
misc_dynamic #如果设置了misc_dynamic,healthchecker程序的退出状态码会用来动态调整服务器的权重(weight)。
}
}
用脚本来检测,脚本如果带有参数,需将脚本和参数放入双引号内。脚本的返回值需为:
#返回0:健康检查OK,权重不被修改
#返回1:健康检查失败,权重设为0
#返回2-255:健康检查OK,权重设置为:退出状态码-2,比如返回255,那么weight=255-2=253
keepalived检测脚本内容/opt/mytools/check_web.sh,返回0代表检查正常,返回1代表检查异常
/opt/mytools/check_web.sh内容如下
#!/bin/sh
serverip=$1
curl -s -m 2 http://$serverip
if [ $? -eq 0 ];then
exit 0
else
exit 1
fi
注:curl命令中的-s选项表示静音模式,不输出任何东西。-m选项表示设置数据传输的最大时间。传输的最大允许时间