Interesting things
学习负载均衡技术。
What did you do today
什么是负载均衡?
一台普通服务器的处理能力是有限的,假如能达到每秒几万个到几十万个请求,
但是却无法再一秒钟内处理上百万个甚至更多的请求,但若能将多台这样的服务器组成一个系统,并通过软件技术将所有请求平均分配给所有服务器,那么这个系统就完全拥有每秒钟处理几百万个甚至更多请求的能力。这就是负载均衡最初的基础设计思想。
基于DNS的负载均衡
DNS(Domain Name System,域名系统)。因特网上作为域名和ip地址相互映射的一个分布式数据库,能够使用户更加方便的访问互联网,而不用去记住能够被机器直接读取的ip数串。通过主机名,最终得到该主机名对应的ip地址的过程叫做域名解析。
DNS协议运行在UDP协议之上,使用端口号53.
DNS负载均衡技术是最早的负载均衡解决方案,它是通过DNS服务中的随机名字解析来实现的,在DNS服务器中,可以为多个不同的地址配置同一名字,而最终查询这个名字的客户机将在解析这个名字时得到其中的一个地址。对于同一名字,不同的客户会得到不同的地址,他们也就访问不同地址上的web服务器,从而达到负载均衡的目的。
优点:实现简单、实施容易,成本低,适用于大多数TCP/IP应用。
缺点:
1.负载分配不均匀,DNS服务器将Http请求平均的分配到后台的Web服务器上,而不是考虑每个Web服务器当前的负载情况。如果后台的Web服务器的配置和处理能力不同,最慢的Web服务器将成为系统的瓶颈,处理能力强的服务器不能充分发挥作用。
2.可靠性低,如果后台的某台web服务器出现故障,DNS服务器仍然会把DNS请求分配到这条故障服务器上,导致不能响应客户端。
3.变更生效时间长,如果更改DNS有可能造成相当一部分用户不能享受到web服务,并且由于DNS缓存的原因,所造成的后果要持续相当长一段时间(一般DNS的刷新周期约为24h)
基于四层交换技术的负载均衡
基于四层交换技术的负载均衡是通过报文中的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器与请求客户端建立TCP连接,然后发送Client请求的数据。
Client发送请求至4层负载均衡器,4层负载均衡器根据负载策略把client发送的报文目标地址(原来是负载均衡设备的ip地址)修改为后端服务器ip地址,这样client就可以直接跟后端服务器建立TCP连接并发送数据。
具有代表意义的产品:LVS、F5(硬件)
优点:性能高、支持各种网络协议。
缺点:对网络依赖较大,负载智能化方面没有7层负载好(比如不支持对url个性化负载),F5硬件性能很高,但成本也高,需要人民币几十万,对于小公司就望而却步。
基于七层交换技术的负载均衡
基于七层交换技术的负载均衡也称内容交换,也就是主要通过报文中的真正有意义的应用层内容,再加上负载均衡设备设置的服务器选择方式,决定最终选择的服务器。
七层负载均衡服务器起了一个代理服务器的作用,client要访问WebServer要先与七层负载设备进行三次握手后建立TCP连接,把要访问的报文信息发送给七层负载均衡设备。然后七层负载均衡设备再根据设备的均衡规则选择特定的web服务器,然后通过三次握手与此台web服务器建立TCP连接,然后web服务器把需要的数据发送给七层负载均衡设备,负载均衡设备再把数据发送给client。
具有代表意义的产品:Nginx、Apache
优点:对网络依赖少,负载智能方案多(可以根据不同的url进行负载)
缺点:网络协议有限,Nginx和Apache支持http负载,性能没有4层负载高。
Nginx优缺点
优点:
1.工作在网络的7层之上,可以针对http应用做一些分流策略,比如针对域名,目录结构,它的正则规则很强大灵活,这也是它目前广泛流行的主要原因之一,Nginx单凭这点可利用的场景就远多于LVS了。
2.Nginx对网络稳定性的依赖非常小,理论上能ping通就能进行负载均衡功能,这个也是它的优势之一,相反LVS对网络稳定性依赖比较大。
3.Nginx安装配置很简单,测试起来很方便,它能把错误用日志打印出来。LVS的配置和测试就要花比较长的时间了。
4.可以承担高负载压力且稳定。
5.Nginx也可作为静态网页和图片服务器,这方面的性能很好,Nginx社区非常活跃,第三方模块也很多。
6.Nginx可作为中层反向代理使用。
7.Nginx现在作为Web反向加速缓存越来越成熟了。
8.Nginx不仅仅是一款优秀的负载均衡器/反向代理软件,它同时也是功能强大的Web应用服务器。
9.Nginx可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码,超时等等,并且会把返回错误的请求重新提交到另一个节点,不过其中的缺点就是不支持url来检测。比如用户正在上传一个文件,而处理该上传的节点刚好在上传过程中出现故障,Nginx会把上传切刀另一台服务器重新处理,而LVS就直接挂了。
缺点:
1.Nginx仅能支持http、https和Email协议。
2.对后端服务器的健康检查,只能通过端口来检测,不支持通过url来检测。不支持session的直接保持,但能通过ip_hash来解决。
LVS实现负载的三种方式
什么是LVS?
LVS是Linux Virtual Server的简写,就是Linux虚拟服务器,是一个虚拟的服务器集群系统。
LVS的优点:
1.抗负载能力强,是工作在网络4层之上仅作分发之用,没有流量的产生,这个特点决定了它在负载均衡软件里的出色的性能,对内存和cpu资源消耗比较低。
2.工作稳定,因为其本身抗负载能力很强,自身有完整的双机热备方案,比如LVS+Keepalived.
3.无流量,LVS只分发请求,而流量并不从它本身出去,这点保证了均衡器IO的性能不会受到大流量的影响。
4.应用范围比较广,因为LVS工作在4层,所以它几乎可以对所有应用做负载均衡,包括http、数据库、在线聊天室。
5.配置比较低,这是一个缺点也是一个优点,因为没有太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率。
LVS缺点:
1.软件本身不支持正则表达式处理,不能做动静分离。而现在很多网站在这方面都有较强的需求,这个是Nginx+Keepalived的优势所在。
2.如果是网站应用比较庞大的话,LVS/DR+Keepalived实施起来就比较复杂了,相对而言,Nginx+Keepalived就简单多了。
LVS中的调度方法有三种:NAT(NetWork Address Translation 网络地址转换)、TUN(tunnel隧道)、DR(direct route直接路由)
LVS-DR模式
请求由LVS接受,由真实提供服务的RealServer直接返回用户,返回的时候不经过LVS。
DR模式需要LVS服务器和RealServer绑定同一个vip,一个请求过来时,LVS只需要将网络帧的MAC地址修改为某一台RealServer的MAC地址,该包就会被转发到相应的RealServer处理。注意此时的源ip和目标ip都没变,RealServer收到LVS转发来的包,发现MAC是自己的,发现IP也是自己的,于是这个包被合法的接受,而当RealServer返回响应时,只要直接向源ip也就是用户ip返回即可,不再经过LVS。
DR模式,LVS接受请求输入,将请求转发给RealServer,由RealServer输出响应给用户,性能非常高。但是它美中不足的是要求负载均衡器与RealServer处于同一物理段。
LVS-NAT模式
NAT是一种外网和内网地址映射的技术。NAT模式下,LVS需要作为RealServer的网关,当网络包到达LVS时,LVS要做DNAT(目标地址转换),将目标ip改为RealServer的ip。RealServer接收到包之后,处理完,返回响应时,RealServer的包通过LVS中转,LVS会做SNAT(源地址转换),将包的源地址改为vip,对于客户端只知道是LVS直接返回给它的。
NAT模式请求和响应都需要经过LVS,性能没有DR模式好。
LVS-TUN模式
TUN模式是通过ip隧道技术减轻LVS调度服务器的压力,很多internet服务的请求包很短小,而响应包通常很大,负载均衡器只负责将请求包分发给物理服务器,而物理服务器将响应包直接分发给用户。所以负载均衡器能处理很巨大的请求量。比NAT模式要高的很多,比DR模式的优点是不限制负载均衡器与RealServer处于同一物理段上。但是它的不足需要所有的服务器(LVS,RealServer)支持“IP Tunneling”协议。
Summary
撸了一遍负载均衡的理论,美滋滋。