负载均衡的最大价值是让多个业务服务器的压力均衡。
服务端应用程序与客户端相比,面临着数据存储、流量调度、高并发等一系列集中式问题,本文所谈论的正是最重要的问题之一流量调度。
为什么需要流量调度?
主要原因是单台服务器的资源是有限的,由于宽带、内存等限制,导致的服务器连接数也有其上限。在遇到单台服务器瓶颈的时候,通常的做法是加入多台服务器进行分担压力,此时如何在多台服务器之间分配流量就成为了最大的问题。
一个基本的服务端程序的服务请求,通常是由一个请求包(Request)和一个应答包(Response)构成。这样一问一答就是一次完整的服务。
并发数
并发数就是指,单位时间里服务器处理的请求连接数量。指的是已经发送请求,但是未完成应答的连接数量。
IOPS
IOPS是指单位时间内系统能处理的请求数量,一般以每秒处理的请求数量为单位,请求通常为读或写数据操作请求。一般用来判断服务器的做事效率。
入口流量和出口流量
入口流量是指服务器每秒接收到的流量总量。计算方式为:
- 平均每秒收到的请求包(Request)数量 * 请求包平均大小。
出口流量是指服务器每秒返回的流量总量,计算方式为:
- 平均每秒返回的应答包(Response)数量 * 应答包平均大小。
流量调度方式
基于DNS解析的流量分发
一个域名通过 DNS 解析到多个 IP,每个 IP 对应不同的服务端程序实例。这样就完成了流量调度。这样的流量调度方式,无法做到真正意义上的负载均衡。当用户在浏览器里输入www.baidu.com的时候,DNS是如何进行解析到IP的:
- 浏览器首先会在自己的缓存中查找是否有www.baidu.com对应的IP地址,如果存在,则进行之间返回,不存在则进入系统缓存查找。
- 系统查找host文件里,是否有www.baidu.com对应的IP地址,如果没用则进入路由器缓存查找。
- 当浏览器和系统中均未查到对应的IP时,就进入路由器进行查询(以上均属于客户端缓存)。
- 客户端未发现www.baidu.com的IP,则会进入互联网服务提供商缓存查询。(电信、联通等)。
- 如果服务提供商也未查询到该域名,则进请求根域名服务器(13个IP对应的根域服务器)进行查询。根域名服务器会查看区域域名记录(如:com、cn等),如果未查询到记录,则代表无此域名。
- 顶级域名服务器收到请求后查看区域文件记录,若无则将其管辖范围内主域名服务器的IP地址告诉本地DNS服务器;
- 主域名服务器接受到请求后查询自己的缓存,如果没有则进入下一级域名服务器进行查找,并重复该步骤直至找到正确记录;
- 本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时将该结果反馈给客户端,客户端通过这个IP地址与web服务器建立链接。
在经过层层的缓存查询之后,DNS才能找到正确的IP映射。加入缓存的好处是是的DNS的解析更迅捷,常用的域名只需要一次解析,缓存浏览器端就可以进行使用。但是同样的缓存也带来了数据一致性的问题,即当域名对应的IP有变化时,客户端不能够及时得到响应,而请求到错误的IP上去。那这样做,对服务器的调度有哪些影响呢?
- 应用服务升级不便,当每个IP对应的服务停止后,还会有流量进来。
- 流量调度不均衡,虽然在DNS服务端已经更改了域名,但是客户端每次请求不一定都经过服务端。
基于硬件的负载均衡
常见的做法是通过改写请求报文的 MAC 地址,将请求发送到真实服务器,真实服务器将响应直接返回给客户。
第 1 步,客户端发起请求,其 IP 报文中,源 IP 为用户的 CIP ,目标 IP 是 VIP;源 MAC 地址为 CMAC ,目标 MAC 地址为 DMAC。
第 2 步,请求包到达 LVS 调度器(Director Server)。我们保持原 IP 和目标 IP 不变,仅仅修改目标 MAC 地址为 RMAC,将请求转发到真实的业务服务器实例 RS(Real Server)。
第 3 步,RS 收到数据包并经过处理,直接响应发送给客户端。
整个过程其实是加入了一个调度器,同意接收客户端传来的请求,然后改写成真实的服务器MAC地址进行访问。我们只要给到调度器一定的流量转发策略,就可以得到想要的效果。同样的,基于硬件的负载均衡也有不足的地方:
- 引入了调度器进行流量分发,同样的流量压力也给到了调度器。所幸的是,现在基于F5等负载均衡硬件,还是可以承受很大的压力的。
- 无法检测服务器的状态,服务器出现异常情况还会有流量进入,解决这个异常只能通过客户端重试。
应用层负载均衡
应用层的负载均衡彻解决了硬件负载均衡的问题,接收到的请求,根据一定的算法转发到对应的服务器上,Nginx 和 Apache 都是常见的应用层负载均衡器,也叫做应用网关。
基于应用层的负载均衡,可以根据心跳检测等方式,更细节地了解到服务器状态,在检测到服务器状态异常时候,应用网关可以将请求转发给其他正常的机器。
结语
随着需求的发展,负载均衡不仅仅是完成流量调度,另外一层面就是给应用提供稳定升级,持续服务的能力。
虽然应用层的负载均衡看起来可以满足负载均衡的需求,但是在实际的使用过程中,通常是硬件加上软件结合的方式,以应对更大量的流量调度需求。
如若转载,请注明出处:https://www.vsaren.com/89113.html