LVS、Keepalived、Haproxy概念以及架构总结
因为对整体概念的不熟悉,导致对线网组件的架构不清晰,这边主要对于一些概念作区分总结,主要摘抄于骏马金龙 - 博客园 (cnblogs.com)的博客,还有就是其他的一些文章,都同意写在文章最后面。
1. LVS
网站架构中,负载均衡技术是实现网站架构伸缩性的主要手段之一。所谓”伸缩性”,是指可以不断向集群中添加新的服务器来提升性能、缓解不断增加的并发用户访问压力。通俗地讲,就是一头牛拉不动时,就用两头、三头、更多头牛来拉。
负载均衡有好几种方式:http URL重定向、DNS的A记录负载均衡、反向代理负载均衡、IP负载均衡和链路层负载。本文所述为LVS,它的VS/NAT和VS/TUN模式是IP负载均衡的优秀代表,而它的VS/DR模式则是链路层负载均衡的优秀代表。
LVS是章文嵩开发的一个国产开源负载均衡软件。LVS最初是他在大学期间的玩具,随着后来使用的用户越来越多,LVS也越来越完善,最终集成到了Linux的内核中。有不少开源牛人都为LVS开发过辅助工具和辅助组件,最出名的就是Alexandre为LVS编写的Keepalived,它最初专门用于监控LVS,后来加入了通过VRRP实现高可用的功能。
LVS的全称是Linux virtual server,即Linux虚拟服务器。之所以是虚拟服务器,是因为LVS自身是个负载均衡器(director),不直接处理请求,而是将请求转发至位于它后端真正的服务器realserver上。
LVS是四层(传输层tcp/udp)、七层(应用层)的负载均衡工具,只不过大众一般都使用它的四层负载均衡功能ipvs,而七层的内容分发负载工具ktcpvs(kernel tcp virtual server)不怎么完善,使用的人并不多。
ipvs是集成在内核中的框架,可以通过用户空间的程序ipvsadm
工具来管理,该工具可以定义一些规则来管理内核中的ipvs。就像iptables和netfilter的关系一样。
2. LVS+Keepalived
KeepAlived主要有两个功能:
- 能够对RealServer进行健康状况检查,支持4层、5层和7层协议进行健康检查
- 对负载均衡调度器实现高可用,防止Director单点故障
在keepalived设计之初,它只是LVS周边的一个辅助工具,用于LVS的监控状况检查,因此它和LVS的兼容性非常好。如果某一个realserver节点宕了,keepalived会将此节点从管理列表中踢出去,当此节点恢复后又将此节点加回管理列表,这样能够就让realserver负载均衡变的智能化。但是,此时的调度器存在单点故障的可能性,因此有必要对其实现高可用。
实现LVS高可用可以使用多种软件来实现,如heartbeat,但是heartbeat本身不能实现ipvs的健康状况检查,需要搭配Ldirectord(安装完heartbeat就有了)来进行健康检查。所幸的是keepalived后来也加入了高可用的功能,而且配置起来也相当简单。相比于heartbeat+Ldirectord,keepalived的检查速度极快,故障转移也极快,布置也简单的多。所以一般来说,要管理ipvs,都会选择使用keepalived。
keepalived实现故障转移的功能是通过VRRP(virtual router redundancy protocol虚拟路由器冗余协议)协议来实现的。 在keepalived正常工作的时候,主节点(master)会不断的发送心跳信息给备节点(backup),当备节点不能在一定时间内收到主节点的心跳信息时,备节点会认为主节点宕了,然后会接管主节点上的资源,并继续向外提供服务保证其可用性。当主节点恢复的时候,备节点会自动让出资源并再次自动成为备节点。
注意,使用keepalived监控、高可用LVS集群时(即常说的keepalived+lvs),并不需要在Director上使用ipvsadm等管理工具额外配置ipvs规则。因为keepalived中集合了管理ipvs规则的组件(即ipvs wrapper),可以直接在keepalived的配置文件中配置ipvs相关规则,在解析配置文件时会通过特定的组件将规则发送到内核中的ipvs模块。
3. Keepalived&Haproxy
上面说过,Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件。
keepalived分为vrrp实例的心跳检查和后端服务的健康检查。如果要配置后端服务,则后端服务只能是LVS(也就是上面说的下线了护会剔除,这就是健康检查)。但vrrp能独立于lvs存在,例如keepalive结合haproxy、mysql等服务实现它们的高可用。
vrrp实例的心跳检查(lvs,haproxy,mysql…)
除了LVS,vrrp只能通过脚本来实现vrrp的健康检查,并通过vrrp实例脚本结束keepalived进程来中断该实例的心跳通告。此时virtual server部分的配置需省略。
对于LVS,无需使用任何脚本,因为所有keepalived节点会同时对后端服务(即LVS)进行健康检查,并同时从LVS规则中剔除下线的服务。如果所有后端服务都不健康,那就没有必要切换keepalived。
后端Real Server的健康检查(只能是LVS)
- 一般采用TCP_CHECK、HTTP_GET、SSL_GET进行健康检查。
- 但也能自写脚本进行后端服务的健康检查,这种模式称为MISC_CHECK。
4. 相关资料
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!