理解负载均衡,首先要理解转移与转发的区别:
转移与转发就象客户与外包公司是否需要直接接触的场景一样,如果直接与外包公司接触就是转移。如果通过接包人接触。客户与外包公司之间透明,就是转发。
转移:数据包从客户端转移到实际服务器,需要知道实际服务器的地址。
转发:数据包只须从客户端发送到代理服务器或DNAT服务器上,再由它们转发到实际服务器。当数据包发给代理或DNAT时,客户端就认为数据包已经发送给实际服务器上。当实际服务器接收到代理或DNAT发来的包,实际服务器就认为数据包就是来自客户端。
转移只需要客户端,实际服务器参与
转发需要客户端 代理或DNAT 实际服务器参与
一.DNS的负载均衡:
DNS的负载均衡是一种[转移]。而不是[转发]。
二.反向代理负载均衡:
对于客户端,实际服务器是基于WEB服务器或一些专门的代理varnish就是工作在一种转发的模式下。转发的优势,在七层工作,可以针对每个http请求定制负载。可以配置负载的权重。可以将调度策略落实到每一个 HTTP 请求。
反向代理服务器工作在 HTTP 层面,对于所有 HTTP 请求都要亲自转发,可谓是大事小事亲历亲为,可控也带来了劣势。就是可扩展会限制。
反向代理服务器的另一个特点就是可以根据ip进行hash,从而做到sticky session,即一个客户的连续请求被转发到同一台backend。
事实上,在后端服务器上保存 Session 数据和本地化缓存是bad smell.它使得后端服务器显得过于个性化,以至于和整个系统格格不入,如果允许的话,我们应该尽量避免这样的设计,比如采用分布式 Session 或者分布式缓存等,让后端服务器的应用尽量与本地无关,也可更好地适应环境。
解决如下:
1.SNA.
2.分布式session:memcached/terracotta
三.DNAT负载均衡:
DNAT与DNS协作的方式:
DNS是翻译域名为IP。DNAT是用来修改包。
因为DNAT转发都是通过IP进行的,而不是通过域名。
如果客户端通过域名访问DNAT服务器,首先会通过DNS将域名翻译成IP地址。然后再把客户端的数据包发送到DNAT服务器上。如果客户端直接使用IP地址。连DNS的翻译都免了,直接找的是DNAT服务器。然后再通过DNAT来修改数据包地址及端口来实现[转发]到实际服务器。
DNAT服务器:与动态代理服务器干的一样的工作:[转发]。
DNAT的工作原理:修改数据包目标地址及端口。
DNAT是根据内核的Netfilter包及规则配置iptables(类似于数据文件)来完成对数据包的目标地址及端口进行修改。
注意:
1.Netfilter与iptables是DNAT实现修改包的工具,是DNAT最重要的组成部分。
2.DNAT表示了原理。其实DNAT服务器有时候就是NAT服务器。所以,简称为NAT方式实现IP层的负载均衡。
DNAT的缺点:
iptables 似乎只能按照我们的规则来干活,没有调度器应该具备的调度能力和调度策略。
四:LVS负载均衡
熟悉了 Netfilter/iptables 的机制后。
理解 IPVS(IP Virtual Server)就一点也不难了,它的工作性质类似于 Netfilter 模块,也工作在 Linux 内核中,但是它更专注于实现 IP 负载均衡。
IPVS 不仅可以实现基于 NAT 的负载均衡,同时还包括后面要介绍的直接路由和 IP 隧道等负载均衡。IPVS模块已经内置到 Linux 2.6.x 内核中,这意味着使用 Linux 2.6.x 内核的服务器将无须重新编译内核就可以直接使用它。
当然,IPVS 也需要有与DNAT类似的管理工具,即ipvsadm
VIP是使用LINUX的内核进行负载均衡:
[反向代理服务器]作为负载均衡调度器的工作机制,其本身的开销已经严重制约了这种框架的可扩展性,从而也限制了它的性能极限。
能否在 HTTP 层面以下实现负载均衡呢?答案是肯定的。回忆一下网络分层模型,事实上,在数据链路层(第二层) 、网络层(第三层)以及传输层(四层)都可以实现不同机制的负载均衡,但有所不同的是,这些负载均衡调度器的工作必须由 Linux 内核来完成,因为我们希望网络数据包在从内核缓冲区进入进程用户地址空间之前,尽早地被转发到其他实际服务器上,没错,Linux 内核当然可以办得到,随后我们会介绍位于内核的 Netfilter 和 IPVS,而用户空间的应用程序对此却束手无策。
好处:
1.因为可以将调度器工作在应用层以下,这些负载均衡系统可以支持更多的网络服务协议,比如 FTP、SMTP、DNS,以及流媒体和 VoIP 等应用。
2.调度策略
LVS的三种配置:
LVS-NAT:与DNAT达到的结果一样,实现方式不一样。
LVS-DR:返回的内容不需要再经过调度器(NAT服务器),直接发给客户端,这样可以减轻调度器的带宽压力,适用于响应的内容远远大于请求的内容时(其实,基本适用于80%的场景。通常响应的内容比请求都要大很多。并不一定是视频服务等)
LVS-TUN:调度器(NAT服务器)可以与实际服务器不在同一个WAN网段,比如应用是分布式的。调度器通过 IP 隧道技术来转发请求到实际服务器,所以实际服务器也必须拥有合法的 IP 地址。