1、介绍
主要用来管理并监控LVS集群系统中各个服务节点的状态,用来提供故障切换的和健康检查功能,判断LVS负载调度器,节点服务器的可用性,及时隔离并替换为新的服务器,当故障主机恢复后将其重新加入集群。
keepalived软件主要通过VRRP协议实现高可用功能的,VRRP是虚拟路由冗余协议的缩写,VRRP是为了解决单点故障问题的,他能保证当个别的节点宕机时,整个网络可以不断的运行。
1.2、keepalivaed 高可用是如何实现故障切换的
keepalived 服务工作时,主master节点会不断地向备用节点发送心跳信息,告诉backup节点自己还活着。当主节点发生故障时,就无法发送心跳了,于是会调用自身的接管程序,接管主节点的ip资源和服务。
1.3、keepalived工作原理
keppalived具有3、4、5层交换机健康检测功能
1、Layer3层检测:是以服务器的ip地址是否有效作为服务器工作正常与否的标准
2、Layer4层检测:进行端口检测,主要是以TCP端口的状态决定服务器工作是否正常、
3、Layer5层检测:是基于应用层的方式检测,是靠访问返回的状态码来确定主机是否正常,
1.5、Keepalived服务的三个重要功能
1、管理LVS
2、对LVS集群节点检查
3、作为其他网络服务的高可用功能
1.6、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状态。
1.7keeppalived官网
http://www.keepalived.org/
2、使用keepalived 构建LVS-DR模式的高可用集群
2.1、实验环境
vip:172.168.1.160/24
角色 | 主机名 | 外网接口 | 外网ip | 内网接口 | 内网ip |
主调度器 | master | ens33 | 192.168.1.160 | ens33 | 192.168.1.4 |
从调度器 | dockup | ens33 | 192.168.1.160 | ens33 | 192.168.1.5 |
RS节点1 | RS01 | ens33 | 192.168.1.160 | ens33 | 192.168.1.6 |
RS节点02 | RS02 | ens33 | 192.168.1.160 | ens33 | 192.168.1.7 |
注:关闭防火墙和selinux
使用keppalived构建集群时,也需要用到ipvsadm管理工具,但大部分工作会由keepailed完成
不需要手动执行ipvsadm
2.2、安装keepalived
安装依赖包:
yum -y install gcc openssl-devel pcre-devel libnl-devel
tar zxf keepalived-2.0.18.tar.gz #进入在安装包内
./configure --prefix=/usr/local/keepalived #预编译
make && make install #编译安装
2.3、配置keepalived+LVS-DR模式
在这种模式下,虚拟ip在某时刻只能属于一个节点,另一个节点作为备用节点存在。当主节点宕机时,备用节点会接管虚拟ip,提供正常服务
2.4、主节点配置
keepalived 只有一个配置文件 keepalived.conf , 里面主要包括global_defs、vrrp_instance和virtual_server
global_defs:只要是配置故障发生时的通知对象以及机器标识、
vrrp_instance:用来定义对外服务的vip区域及相关属性
virtual_server:虚拟服务器定义
2.5、修改keepalived.conf 配置文件
ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/ #设置符号连接
mkdir /etc/keepalived/ #创建keepalived目录
cp /usr/local/keepalived/etc/keepalived/keepalived.conf #将配置文件复制到创建好的目录下
vim /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 server地址,即发邮件服务器
smtp_connect_timeout 30 #设置smtp超时连接时间,以上参数可以不配置
router_id m_director #表示运行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, 两个节点设置必须一样
172.16.16.172
}
}
#至此为止以上为实现高可用配置,如只需使用高可用功能下边配置可删除
#以下为虚拟服务器定义部分
#类似添加虚拟服务器 ipvsadm -A -t 172.16.16.172:80 -s rr
virtual_server 172.16.16.172 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 172.16.16.177 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 172.16.16.178 80 { #RS节点2
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
#默认配置文件中还有两个 virtual_server 模版,把剩下的都删除了,就可以。 如:
#virtual_server 10.10.10.2 1358 { 。。。 }
#virtual_server 10.10.10.3 1358 { 。。。 }
2.6、重启keepalived
systemctl restart keepalived
2.7、安装ipvsadm
yum -y install ipvsadm #安装ipvsadm
lsmod | grep ip_vs #查看ip_vs
ipvsadm -L –n #查看LVS集群
2.8、配置backup从节点
参考master节点的安装
2.9、修改keepalived配置文件
备用节点的keepalived.conf文件配置与主节点基本相同,只是router_id,state,priority三处不同,其他配置都相同
注:红色为改动项值
! Configuration File for keepalived
global_defs {
router_id s_director
}
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 {
172.16.16.172
}
virtual_server 172.16.16.172 80 {
delay_loop 6
lb_algo rr
lb_kind DR
#persistence_timeout 50
protocol TCP
real_server 172.16.16.177 80 {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 172.16.16.178 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
启动keepalived和安装ipvsadm
systemctl enable keepalived.service
yum -y install ipvsadm
安装完成后不需要任何配置,启动方式由keepalived控制
3、测试主备切换
在master和backup上分别执行ip addr show ens33命令查看master和backup对VIP的控制权
master:
backup:
3.1、测试主备VIP漂移
只需关闭主节点的keepalived服务,主节点的VIP地址消失,备节点显示VIP,再次开启主节点后备节点VIP消失,VIP又会回到主节点
systemctl stop keepalived.service #停止keepalived
ip addr show ens33
再次查看master节点的VIP消失
查看从节点backup
现在backup节点显示VIP地址
3.2、keepalived脑裂现象
由于某些原因,导致两台keepalived高可用服务器在指定时间内,无法检测到对方存活心跳信息,从而导致互相抢占对方的资源和服务所有权,然而此时两台高可用服务器有都还存活。表现形式就是备节点上出现了虚拟IP, 此时主节点也是持有虚拟IP的。
脑裂产生的原因:
一般来说,裂脑的发生,有以下几种原因:
高可用服务器对之间心跳线链路发生故障,导致无法正常通信。
因心跳线坏了(包括断了,老化)。
因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)。
因心跳线间连接的设备故障(网卡及交换机)。
高可用服务器上开启了iptables防火墙阻挡了心跳消息传输。
高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败。
其他服务配置不当等原因,如心跳方式不同,心跳广插冲突、软件Bug等。
Keepalived配置里同一 VRRP实例如果 virtual_router_id两端参数配置不一致也会导致裂脑问题发生。
4、配置RS节点
4.1、关闭ARP转发
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
4.2、配置虚拟ip地址
生成回环口配置文件
cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=172.16.16.172
NETMASK=255.255.255.255
ONBOOT=yes
NAME=loopback
重启network
systemctl restart network
ifconfig
4.3、安装httpd
yum install -y httpd
systemctl start httpd
echo "192.168.1.6" > /var/www/html/index.html
5、配置RS02
跟rs01一样
5.2、测试VIP
在master节点上查看lvs状态
ipvsadm -LN
访问vip地址
5.3、keepalived的常见的健康检查方式
TCP_CHECK :tcp端口检测
HTTP_GET :http接口检测
MISC_CHECK :自定义脚本检测
5.3.1、TCP_CHECK检测
real_server 172.16.16.177 80 {
weight 100
TCP_CHECK {
connect_port 80 #检测端口,利用80端口检查
connect_timeout 3 #连接超时时间
nb_get_retry 3 #重连次数
delay_before_retry 3 #重连间隔
}
}
5.3.2、HTTP_GET检测
是基于状态的检测
real_server 172.16.16.177 80 {
weight 1
HTTP_GET {
url {
path /index.html
status_code 200 #http://172.16.16.177/index.html的返回状态码
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
5.3.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选项表示设置数据传输的最大时间。传输的最大允许时间