分类: LINUX
2015-03-09 18:54:18
原文地址:服务器集群负载均衡算法 作者:zyd_cu
当Web服务器、文件服务器、游戏服务器等的用户数不断增加时,单服务器模型肯定不能完全满足服务的需求,集群服务模式已经逐渐普及,使用服务器集群做后台,一个主要的问题就是要解决负载均衡问题。
负载均衡算法主要分为两种,持续性和非持续性的负载均衡,持续性是指特定客户端发出的请求将由同一服务器服务。持续性算法主要基于随机理论,即其默认客户的访问时随机的,从而服务器的选择也是随机的,以此来实现负载均衡。如可以根据客户的IP地址的hash值,http报头信息等来选择服务器,相同的IP地址的客户端将被分配到同一服务器。持续性算法的缺点在于其不易于动态更新,比如使用IP地址hash值进行分配,刚好某个IP非常频繁的请求服务,而这些服务将被定向到同一服务器,从而很容易出现但服务器热点的情况。但由于持续性算法简单高效,也被广泛使用。
持续性算法通常用于实现较粗粒度的均衡,在很多网游的设计中可以体现出来,如盛大的三国杀Online,所有的服务器被分为7个大区,每个用户在第一次登录前需选择一个区域(通常是离自己最近的CDN),一旦用户做出选择,以后该用户的访问都会到该区,从而实现负载分散。
非持续型算法主要包括轮询算法,最优选择算法(这里的选择会根据业务的不同分类,扩展自web服务的最少连接数算法)。
轮询算法很简单,对于每一次请求,依次选择服务器组的下一个服务器即可,该算法简单易实现,适用于所有服务器在软硬件配置相当的情况,如果不同的服务器在处理能力上差别很大,该算法效果可能会很差,导致处理能力强的服务器空闲而处理能力弱的服务器一直吃力的处理请求。
最优选择算法会根据服务类型来制定最优的标准,服务器根据某项指标排序,最前面的为最优的服务器,对于新的服务器,选择最前面的服务器服务即可,该算法要求对每个服务器维护一些额外的信息,并在信息更新时对服务器表排序。
对于web服务器、文件服务器,可采用最少连接数算法,每个服务器包含一个连接数计数器,并按计数器的值从小到大排序,对于新的请求,选择计数最小的服务器,并增加服务器的计数器,同时对服务器计数值进行重新排序;
对于存储服务器,可根据服务器当前的负载及空闲空间信息来决定最优,比如最大空闲空间算法,那么每次选择可用空间最大的节点,然后按可用空间从大到小排序。
在最优选择算法中,如果每服务一个请求就需要对服务器组进行重新排序,无疑开销会很大,
可以设定一个阈值,只有当当前连接数最少的服务器接受的请求数超过阈值时,才进行重新排序。
另外,最优选择算法在评估指标的更新上一定要是实时的,比如连接数、可用空间,如果这些信息的更新有一定的时间间隔,则在该时间间隔内的所有请求将由同一服务器服务,会导致该服务器出现单点失效问题。