Keepalived 是 Linux 下一个轻量级别的高可用解决方案,通过 **VRRP 协议(虚拟路由冗余协议)**来实现服务或者网络的高可用,可以利用其来解决单点故障。
起初是为 LVS 设计的,一个 LVS 服务会有 2 台服务器运行 Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟 IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候, 备份服务器就会接管虚拟 IP,继续提供服务,从而保证了高可用性。
Keepalived 的作用:
Keepalived 提供了很好的高可用性保障服务,它可以检查服务器的状态,如果有服务器出现问题,Keepalived 会将其从系统中移除,并且同时使用备份服务器代替该服务器的工作,当这台服务器可以正常工作后,Keepalived 再将其放入服务器群中,这个过程是 Keepalived 自动完成的,不需要人工干涉,只需要修复出现问题的服务器即可。
Keepalived 的特点:
Keepalived 的核心功能:
健康检查
采用 tcp 三次握手,icmp 请求,http 请求,udp 、echo 请求等方式对负载均衡器后面的实际的服务器(通常是承载真实业务的服务器)进行保活
故障切换
主要应用在配置了主备的服务器上,使用虚拟路由冗余协议维持主备之间的心跳
当主服务器出现问题时,由备服务器承载对应的业务,从而在最大限度上减少损失,并提供服务的稳定性
Keepalived 从 3 个层次来检测服务器的状态,Layer3 、Layer4 以及 Layer7 工作在 IP/TCP 协议栈的IP层,TCP层及应用层,原理分别如下:
Layer3 工作在网络层
Keepalived 使用 Layer3 的方式工作时,Keepalived 会定期向服务器群中的服务器发送一个 ICMP 的数据包(既平时用的 Ping 程序),如果发现某台服务的 IP 地址没有激活,Keepalived 便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。
Layer3 的方式是以服务器的 IP 地址是否有效作为服务器工作正常与否的标准。
Layer4 工作在传输层
Layer4 主要以 TCP 端口的状态来决定服务器工作正常与否。keepalived 一旦在传输层探测到这些端口没有响应数据返回,就认为这些端口所对应的节点发生故障,从集群中剔除故障节点。
例如 web server 的服务端口一般是 80,如果 Keepalived 检测到 80 端口没有启动,则 Keepalived 将把这台服务器从服务器群中剔除。
Layer7 工作在应用层
Layer7 工作在具体的应用层,比 Layer3,Layer4 要复杂一点,在网络上占用的带宽也要大一些。Keepalived 将根据用户编写的脚本来检测各种程序或者服务是否正常,如果与用户的设定不相符,则将对应的把服务器从服务器群中剔除。
keepalived 主要有三个模块,分别是 core、check 和 vrrp
体系结构
整个体系结构分层用户层和内核层
Scheduler I/O Multiplexer
I/O 复用分发调用器,负责安排 Keepalived 所有的内部的任务请求
Memory Management
内存管理机制,提供了访问内存的一下通用方法 Keepalived
Control Plane
控制面板,实现对配置文件的编译和解析,Keepalived 的配置文件解析比较特殊,它并不是一次解析所有模块的配置,而是只有在用到某模块时才解析相应的配置
Core components
Keepalived 的核心组件,包含了一系列功能模块,主要有 watch dog、Checkers、VRRP Stack、IPVS wrapper、Netlink Reflector
watch dog:
一个极为简单又非常有效的检测工具,针对被监视目标设置一个计数器和阈值,watch dog 会自己增加此计数值,然后等待被监视目标周期性的重置该数值,一旦被监控目标发生错误,就无法重置该数值,watch dog 就会检测到。
Keepalived 是通过它来监控 Checkers 和 VRRP 进程
Checkers:实现对服务器运行状态检测和故障隔离
VRRP Stack:实现 HA 集群中失败切换功能,通过 VRRP 功能再结合 LVS 负载均衡软件即可部署一个高性能的负载均衡集群
IPVS wrapper:实现 IPVS 功能,该模块可以将设置好的IPVS规则发送到内核空间并提交给 IPVS 模块,最终实现负载均衡功能
Netlink Reflector:实现 VIP 的设置和切换
在现实的网络环境中,主机之间的通信都是通过配置静态路由(默认网关)来完成的
而主机之间的路由器一旦出现故障,就会通信失败
因此在这种通信模式下,路由器就会有单点瓶颈问题,为了解决这个问题,引入了 VRRP 协议(Virtual Router Redundancy Protocol 虚拟路由冗余协议)
通过 VRRP 可以在网络发生故障时透明的进行设备切换而不影响主机之间的数据通信
虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将两台或多台提供相同功能的路由器组成一个虚拟路由器组,这个组里面有一个master 和多个 backup,master 上面有一个对外提供服务的 VIP(Virtual IP Address 即虚拟 IP 地址,可以一个或多个)(该路由器所在局域网内其他机器的默认路由为该 vip),master 会发组播,当 backup 收不到 vrrp 包时就认为 master 宕掉了,这时就需要根据 VRRP 的优先级来选举一个 backup 当 master。这样的话就可以保证路由器的高可用了。
VRRP 角色
master 路由器由选举算法产生,它拥有对外服务的 VIP,提供各种网络服务,如 ARP 请求、数据转发、ICMP 等等,而backup 路由器不拥有 VIP,也不对外提供网络服务
当 master 发生故障时,backup 将重新进行选举,产生一个新的 master 继续对外提供服务
VRRP 工作模式
VRRP 有三种工作状态,分别是:
VRRP 选举机制
# 查看 keepalived 系统日志。-f:持续输出
tail -f /var/log/messages
# 查看 keepalived 配置文件
vi /etc/keepalived/keepalived.conf
# 启动 keepalived 服务
systemctl start keepalived
# 查看 keepalived 服务状态
systemctl status keepalived
# 停止 keepalived 服务
systemctl stop keepalived
# keepalived 启动成功后有 3 个keepalived 的进程
# 一个是父进程,负责监控其子进程。一个是 vrrp 子进程,另外一个是 checkers 子进程。
ps -ef | grep keepalived