web负载均衡的实现方式

什么是web负载均衡
服务器集群(Cluster)使得多个服务器节点能够协同工作,根据目的的不同,服务器集群可以分为:

高性能集群:将单个重负载的请求分散到多个节点进行处理,最后再将处理结果进行汇总
高可用集群:提高冗余单元,避免单点故障
负载均衡集群:将大量的并发请求分担到多个处理节点。由于单个处理节点的故障不影响整个服务,负载均衡集群同时也实现了高可用性。

一般提到的负载均衡(Load Balance),是指实现负载均衡集群。负载均衡实现了横向扩展,避免纵向的升级换代。

本文中的web负载均衡,特指能够分担web请求(http,https等)的负载均衡技术。

基本原理
任何的负载均衡技术都要想办法建立某种一对多的映射机制: 一个请求的入口映射到多个处理请求的节点,从而实现分而治之(Divide and Conquer)。

这种映射机制使得多个物理存在对外体现为一个虚拟的整体,对服务的请求者屏蔽了内部的结构。

采用不同的机制建立映射关系,可以形成不同的负载均衡技术,常见的包括:

http重定向
DNS负载均衡
CDN负载均衡
反向代理负载均衡
IP负载均衡(LVS-NAT)
直接路由(LVS-DR)
IP隧道(LVS-TUN)

http重定向
http重定向大家一定不陌生,WEB开发过程中的自动跳转。比如登录后跳转到相应的管理页面。由WEB应用程序即可实现。

常见应用有:镜像下载,比如PHP源代码的下载

DNS负载均衡
DNS轮询是最简单的负载均衡方式。以域名作为访问入口,通过配置多条DNS A记录使得请求可以分配到不同的服务器。

DNS轮询没有快速的健康检查机制,而且只支持WRR的调度策略导致负载很难“均衡”,通常用于要求不高的场景。 并且DNS轮询方式直接将服务器的真实地址暴露给用户,不利于服务器安全。另外故障转移不太方便,因为域名解析是需要时间的。

CDN负载均衡
CDN(Content Delivery Network,内容分发网络)。通过发布机制将内容同步到大量的缓存节点,并在DNS服务器上进行扩展, 找到里用户最近的缓存节点作为服务提供节点。

因为很难自建大量的缓存节点,所以通常使用CDN运营商的服务。目前国内的服务商很少,而且按流量计费,价格也比较昂贵。

反向代理负载均衡
反向代理服务器的核心工作便是转发HTTP请求,因此它工作在HTTP层面,也就是TCP七层结构中的应用层(第七层),比较常用的有:Nginx、HAProxy

IP负载均衡(LVS-NAT)
基于NAT技术的负载均衡,它可以工作在传输层,对数据包中的IP地址和端口信息进行修改,所以也称为四层负载均衡。

将实际服务器放置在内部网络,而作为网关的NAT服务器将来自用户端的数据包转发给内部网络的实际服务器。很多家用宽带路由器都有支持。

由两块网卡,分别连接外部网络和内部网络,外部请求的数据包通过外部网络进入后再转发给内网服务器

如何修改IP数据包,可以通过linux的Netfilter模块实现,我们可以通过iptables来对Netfilter的过滤表进行插入、修改或删除,让数据包按照我们的规则来干活,但没有调度能力和调度策略

现在就需要IPVS/ipvsadm,ipvsadm是IPVS的管理工具,提供命令行的配置界面,也称为LVS

直接路由(LVS-DR)
不同于NAT机制,它工作在数据链路层(第二层),它通过修改数据包的目标MAC地址,将数据包转发到实际服务器,并且最重要的是实际服务器的响应数据包将直接发送给用户端,而不经过调度器。

需要了解IP别名,它可以实现多个IP设置到一个网卡上。

可以为调度服务器和实际服务器设置相同IP别名,但实际服务器不要去寻找其它拥有这个IP别名的服务器,同时还要防止实际服务器响应来自网络中针对IP别名的广播。

解决了带宽瓶颈

IP隧道(LVS-TUN)
与LVS-DR原理相似,不同的是:实际服务器可以和调度器不在同一个WAN网段。它是将调度器收到的IP数据包封装在一个新的IP数据包中,转交给实际服务器,然后实际服务器的响应数据包可以直接到达用户端。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据