高并发负载均衡 | 基于keepalived的LVS高可用
初识别keepalived
负载平衡框架依赖于广为人知且广泛使用的 Linux 虚拟服务器 (IPVS) 内核模块,该模块提供第 4 层负载平衡。Keepalive 实现一组健康检查器,根据其健康状况动态、自适应地维护和管理负载平衡服务器池。虚拟冗余路由协议 (VRRP) 实现了高可用性。VRRP 是路由器故障转移的基本砖块。此外,保持固定实现一组挂钩VRRP有限的状态机器提供低水平和高速协议交互。每个保留框架可以独立使用或一起提供弹性基础设施。
软件设计
keepalived进程树
PID 111 Keepalived <-- Parent process monitoring children
112 \_ Keepalived <-- VRRP child
113 \_ Keepalived <-- Healthchecking child
为了确保稳健性和稳定性,keepalived分为3个不同的进程:
1、负责监控两个孩子进程的父进程。
2、两个孩子进程,一个负责VRRP框架,另一个负责健康检查。
内核组件
保留使用四个 Linux 内核组件:
1、LVS 框架
2、网络过滤框架:支持NAT和伪装的IPVS代码。
3、网链接界面:设置并删除网络界面上的VRRP虚拟IP。
4、多播: VRRP 广告发送到保留的 VRRP 多播组 (224.0.0.18)。
keepalived的重要组成

如上图,keepalived主要是模块是VRRP Stack和Cheackers,VRRP主要实现VIP(及MAC)的高可用;Checkers主要实现各服务如ipvs等的高可用及realserver健康状态检查,其中ipvs和realserver健康状态检查通过配置keepalived.conf就可以实现,而其他服务高可用则需要通过自己编写脚本,然后配置keepalived调用来实现。
健康检查框架(Checkers)
每次健康检查都注册到全局调度框架中。这些健康检查工作者线程实施以下类型的健康检查:
- TCP_CHECK
在层4工作。为了确保此检查,我们使用TCP_CHECK检查使用非阻止/超时 TCP 连接。如果远程服务器未回复此请求(超时),则测试是错误的,服务器将从服务器池中删除。 - HTTP_GET
在5层工作。执行HTTP获取到指定的网址。然后使用 MD5 算法对HTTP_GET结果进行总结。如果此状态与预期值不匹配,则测试是错误的,并且服务器将从服务器池中删除。此模块实现对同一服务的多网址获取检查。如果您使用的是托管多个应用程序服务器的服务器,此功能是有用的。此功能使您能够检查应用程序服务器是否正常工作。 - SSL_GET
与HTTP_GET相同,但使用SSL连接到远程网络服务器。 - MISC_CHECK
此检查允许用户定义的脚本作为健康检查器运行。结果必须是 0 或 1。可以使用完整路径(即/path_to_script/脚本.sh)调用可以无参数运行的脚本。需要参数的需要用双引号(即"/path_to_script/脚本.sh ")
故障转移 (VRRP) 框架

VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)可以认为是实现路由器高可用的协议,简单的说,当一个路由器故障时可以由另一个备份路由器继续提供相同的服务。
即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的网关ip和虚拟mac;master会发送224.0.0.18地址组播报文,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup作为master对外提供服务。这样的话就可以保证路由器的高可用,对于该路由器组所在局域网内其他主机来说还是相当于一台路由器,它们就可设置静态缺省路由网关为该路由器组ip了。