0%

keepalived

keepalived

Keepalived是一款用于保障服务高可用性的软件,它能自动侦测服务器状态、移除故障服务器、切换到正常运行的服务器、添加恢复后的服务器到集群中。

实现的基本思路

Keepalived是基于VRRP协议的实现,主要用在IP层、TCP层和应用层。

  • IP层:Keepalived会定期向服务器群中的服务器发送一个数据包(既Ping),如果发现IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除。
  • TCP层:类似IP层,只不过这里是检测服务的端口
  • 应用层:Keepalived将根据用户的设定来检查服务程序的运行是否正常

VRRP协议

VRRP (Virtual Router Redundancy Protocol),虚拟路由冗余协议,是解决局域网中配置静态网关出现单点故障的路由协议。 VRRP是一种选择协议,它可以把一个虚拟路由器的职责,动态转交给Master进行处理;VRRP是一种路由容错协议,也可以叫做备份路由协议。当Master宕掉后,虚拟路由将启用备份路由器,从而实现网络通信可用

在具有多播或广播能力的局域网中,借助VRRP能在某台路由器出现故障时仍然提供高可靠的缺省链路,有效避免单一链路发生故障后网络中断的问题,而无需修改动态路由协议、路由发现协议等配置信息

  • VRRP路由器:物理的路由器,上面运行了实现VRRP协议的VRRPD程序
  • VRRP虚拟路由器:逻辑上的路由器,通常由多台路由器组成,可以看成是一个VRRP路由器池,对外看起来是一个路由器,就是那个虚拟的路由器,其标识称为VRID(范围是0-255)
  • Master和Backup:一个虚拟路由里面的多个路由器,并不是同时工作的,工作的那台称为Master,其他的就是Backup。
VRRP协议工作机制
  • 路由器开启VRRP功能后,会根据优先级确定出Master
  • Master会通过IP多播包的形式来发送公告报文,Backup会接收到这些报文
  • 如果是抢占式:Backup会跟发送报文的Master比较优先级,如果Backup优先级更高,那么Backup会抢占成为Master,而Master会让位成为Backup;如果是非抢占式:只要Master没有故障,不会出现新的Master。
  • 如果备份路由器在连续三个公告间隔内收不到VRRP公告,或收到优先级为0的公告的话,就会按照竞选协议来选出新的Master,以保证服务的可用
VRRP负载分担

在实际组网中一般会进行VRRP负载分担方式的设置。负载分担方式是指多台路由器同时承担业务,避免设备闲置。

同一台路由器可以加入多个备份组,在不同组中有不同的优先级,使得该路由器可以在一个组中作为Master,在其他的备份组中作为Backup

keepalived结构

大致分两层结构:用户空间 user space和内核空间 kernel space

  • IPVS:IP虚拟服务器(IP Virtual Server),是一种提供负载平衡功能的技术
  • NetLink:提供高级路由及其他相关的网络功能
  • WatchDog:负责监控checkers和VRRP进程的状况
  • Checkers:负责真实服务器的健康检查,是keepalived最主要的功能。可以没有VRRP Stack,但健康检查healthchecking是一定要有的。
  • VRRP Stack:负责负载均衡器之间的失败切换FailOver。如果只用一个负载均衡器,则VRRP不是必须的。
  • IPVS wrapper:用来发送设定的规则到内核的IPVS部分
  • Netlink Reflector:用来设定VRRP的vip地址等
  • 控制面板:对配置文件的编译和解析。Keepalived不是一次性解析所有的配置文件,而是用到一个模块解析一个,因此可以在每个模块看到XXX_parser.c这样的文件

配置示例

检查nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/sh
# check nginx server status
NGINX=/usr/common/nginx/sbin/nginx
PORT=80

nmap localhost -p $PORT | grep "$PORT/tcp open"

#echo $?

if [ $? -ne 0 ];then
$NGINX -s stop
$NGINX
sleep 3
nmap localhost -p $PORT | grep "$PORT/tcp open"
[ $? -ne 0 ] && cd /usr/common/keepalived/sbin && pkill keepalived

echo "over"
fi