keepalived详解
Keepalive是一个用于实现高可用性(HA)解决方案的开源软件,主要用于在主备服务器之间管理和切换服务。它的主要功能是监控主服务器的状态,并在主服务器出现故障时自动将服务转移到备用服务器,从而确保系统的高可用性
特点:
虚拟IP:Keepalive可以在主服务器和备份服务器之间管理虚拟IP地址,确保用户请求总是可以路由到可用的服务器。
健康检查:它定期检查主服务器的健康状态,使用各种协议(如SSL、TCP连接等)来确认服务器是否正常工作。
自动故障转移:当主服务器不可用时,Keepalive可以自动将流量切换到备份服务器,确保服务的持续可用性。
负载均衡:在某些配置中,Keepalive还可以与负载均衡器结合使用,帮助分配流量到多个后端服务器。
灵活配置:Keepalive支持多种配置选项,允许用户根据自己的需求调整监控间隔、重试次数和其他参数。
Keepalived组成架构
keepalived也是模块化设计,不同模块负责不同的功能,它主要有三个模块,分别是core、check和VRRP
core模块:为keepalived的核心组件,负责主进程的启动、维护以及全局配置文件的加载和解析;
check:负责健康检查,包括常见的各种检查方式;
VRRP模块:是来实现VRRP协议的。
其他组件:
system call:系统调用
watch dog:监控check和vrrp进程的看管者,check负责检测健康状态,当其检测到master上的服务不可用时则通告vrrp将其转移至backup服务器上。
利用VRRP协议进行主备通信。组播224.0.0.18
利用VRRP协议进行主备竞选,产生VIP
利用VRRP协议主向备发送组播包。当备服务器接收不到主服务器的组播包,就会认为主出现故障,主动接管资源
当主恢复时,根据配置决定是否抢占备服务器资源
ipvs wrapper:为集群内的所有节点生成IPVS规则6个节点组成:2台后端web界面服务器,2台nginx负载均衡反向代理缓存服务器,2台lvs+keepalived服务器 2台web服务器要求只能使用内网ip、nginx服务器只是用内网ip、lvs+keepalived使用两张卡、一张内网、一个外网
nginx配置
upstream apache { #在server上面添加
server 192.168.1.15:80 weight=1 max_fails=1 fail_timeout=10s;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
# root html;
# index index.html index.htm;
proxy_pass http://apache;
}
keepalived配置文件
! 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 cong11 #表示运行keepalived服务器的一个标识,这个标识(router_id)是唯一的
}
vrrp_instance lvs-dr { #定义一个实例,一个集群就是一个实例。 默认VI_1 可以随意改
state MASTER #MASTER表示指定本节点为主节点,备用节点上设置为 BACKUP。注意节点状态均大写。
interface ens37 #绑定虚拟 IP 的网络接口
virtual_router_id 51 #虚拟路由ID标识,这个标识最好是一个数字,在一个keepalived.conf配置中是唯一的, MASTER和BACKUP配置中相同实例的virtual_router_id必须是一致的。
priority 100 #节点的优先级(1-255之间),越大越优先。备用节点必须比主节点优先级低。
advert_int 1 #为同步通知间隔。MASTER与BACKUP之间心跳检查的时间间隔,单位为秒,默认为1。
authentication { #设置验证信息,两个节点必须一致,同一vrrp实例的MASTER与BACKUP使用相同的密码才能正常通信。
auth_type PASS
auth_pass 1111
}
# unicast_src_ip 192.168.118.132 #配置单播的源地址,即本机地址
# unicast_peer {
# 192.168.118.129 #配置单播的目标地址,即对方节点地址,备有多台就配置多个地址
# }
virtual_ipaddress { #指定虚拟 IP, 两个节点设置必须一样
192.168.2.88
}
}
#至此为止以上为实现高可用配置,如只需使用高可用功能下边配置可删除
#以下为虚拟服务器定义部分
#类似添加虚拟服务器 ipvsadm -A -t 192.168.2.11:80 -s rr
virtual_server 192.168.2.88 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.2.13 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.2.14 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 { 。。。 }#连接保持时间,单位是秒。有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话的保持时间。同一IP地址的客户端50秒内的请求都发到同个real server ,这个会影响LVS的 rr 调度算法
主节点配置文件
! Configuration File for keepalived
global_defs {
router_id cong11
}
vrrp_instance lvs-dr {
state MASTER
interface ens37
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.2.88
}
}
virtual_server 192.168.2.88 80 {
delay_loop 6
lb_algo rr
lb_kind DR
#persistence_timeout 50
protocol TCP
real_server 192.168.2.13 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.2.14 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}从节点配置文件
! Configuration File for keepalived
global_defs {
router_id cong12
}
vrrp_instance lvs-dr {
state BACKUP
interface ens37
virtual_router_id 51
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.2.88
}
}
virtual_server 192.168.2.88 80 {
delay_loop 6
lb_algo rr
lb_kind DR
#persistence_timeout 50
protocol TCP
real_server 192.168.2.13 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.2.14 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}keepalived的常见的健康检查方式
TCP_CHECK检测
real_server 192.168.2.13 80 {
weight 100
TCP_CHECK {
connect_port 80 #检测端口,利用80端口检查
connect_timeout 3 #连接超时时间
nb_get_retry 3 #重连次数
delay_before_retry 3 #重连间隔
}
}
基于HTTP状态码的检测
real_server 192.168.2.13 80 {
weight 1
HTTP_GET {
url {
path /index.html
status_code 200 #http://192.168.2.13/index.html的返回状态码
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
MISC_CHECK检测
自定义Shell脚本监控
real_server 192.168.2.13 80 {
weight 1
HTTP_GET {
url {
path /index.html
status_code 200 #http://192.168.2.13/index.html的返回状态码
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
用脚本来检测,脚本如果带有参数,需将脚本和参数放入双引号内。脚本的返回值需为:
#返回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选项表示设置数据传输的最大时间。传输的最大允许时间
非抢占模式
和抢占模式的配置相比,只改了两个地方:
1、在vrrp_instance块下,两个节点各增加了nopreempt指令,表示不争抢vip。
2、两个节点的state都为BACKUP。
在非抢占模式下,两个keepalived节点都启动后,默认都是BACKUP状态,双方在发送组播信息后,会根据优先级来选举一个MASTER出来。由于两者都配置了nopreempt,所以MASTER从故障中恢复后,不会抢占vip。这样会避免VIP切换可能造成的服务延迟。
! Configuration File for keepalived
global_defs {
router_id cong11
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}
vrrp_instance lvs-dr {
state BACKUP
interface ens37
virtual_router_id 51
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.88
}
track_script {
chk_nginx
}
}