4.5.4 均衡策略与实现
负载均衡的两大职责是“选择谁来处理用户请求”和“将用户请求转发过去”。前面我们仅介绍了后者,即请求的转发或代理过程。前者是指均衡器所采取的均衡策略,由于这一块涉及的均衡算法太多,笔者无法逐一展开,所以本节仅从功能和应用的角度去介绍一些常见的均衡策略。
·轮询均衡(Round Robin):每一次来自网络的请求轮流分配给内部的服务器,从1至N然后重新开始。此种均衡算法适合于服务器集群中的所有服务器都有相同的软硬件配置并且平均服务请求相对均衡的情况。
·权重轮询均衡(Weighted Round Robin):根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求。譬如:设置服务器A的权值为1,B的权值为3,C的权值为6,则服务器A、B、C将分别接收到10%、30%、60%的服务请求。此种均衡算法能确保高性能的服务器得到更多的使用率,避免低性能的服务器负载过重。
·随机均衡(Random):把来自客户端的请求随机分配给内部的多个服务器,在数据量足够大的场景下能达到相对均衡的分布。
·权重随机均衡(Weighted Random):此种均衡算法类似于权重轮询算法,不过在分配处理请求时是随机选择的过程。
·一致性哈希均衡(Consistency Hash):将请求中的某些数据(可以是MAC、IP地址,也可以是更上层协议中的某些参数信息)作为特征值来计算需要落在的节点,算法一般会保证同一个特征值每次都一定落在相同的服务器上。这里的一致性是指保证当服务集群某个真实服务器出现故障时,只影响该服务器的哈希值,而不会导致整个服务器集群的哈希键值重新分布。
·响应速度均衡(Response Time):负载均衡设备对内部各服务器发出一个探测请求(例如Ping),然后根据内部各服务器对探测请求的最快响应时间来决定哪一台服务器响应客户端的服务请求。此种均衡算法能较好地反映服务器的当前运行状态,但最快响应时间仅仅指的是负载均衡设备与服务器之间的最快响应时间,而不是客户端与服务器之间的最快响应时间。
·最少连接数均衡(Least Connection):客户端的每一次请求服务在服务器停留的时间可能会有较大差异,随着工作时间增加,如果采用简单的轮询或随机均衡算法,每一台服务器上的连接进程可能会产生极大的不平衡,并不能达到真正的负载均衡。最少连接数均衡算法会对内部需负载的每一台服务器有一个数据记录,记录当前该服务器正在处理的连接数量,当有新的服务连接请求时,将把当前请求分配给连接数最少的服务器,使均衡更加符合实际情况,使负载更加均衡。此种均衡策略适合长时处理的请求服务,如FTP传输。
从实现角度来看,负载均衡器的实现分为“软件均衡器”和“硬件均衡器”两类。在软件均衡器方面,又分为直接建设在操作系统内核的均衡器和应用程序形式的均衡器两种。前者的代表是LVS(Linux Virtual Server),后者的代表有Nginx、HAProxy、KeepAlived等。前者性能会更好,因为无须在内核空间和应用空间中来回复制数据包;而后者的优势是选择广泛,使用方便,功能不受限于内核版本。
在硬件均衡器方面,往往会直接采用应用专用集成电路(Application Specific Integrated Circuit,ASIC)来实现,有专用处理芯片的支持,避免操作系统层面的损耗,以达到最高的性能。这类均衡器的代表就是著名的F5和A10公司的负载均衡产品。