在分布式架构体系中,业务逻辑复用的需求十分强烈,上层业务想借助已有的底层服务,来快速搭建更多、更丰富的应用,降低新业务开展的人力和时间成本,快速满足瞬息变化的市场需求。公共的服务被拆分出来,形成可用的服务,最大程度的保障了代码和逻辑的复用,避免重复建设,这种设计也称之为SOA
。
在SOA架构之中,服务消费者通过服务名称,在众多服务中找到调用的服务的地址表,称为服务的路由(如 上图所示)。当请求到来时,为了将请求均衡的分配到后端服务器,负载均衡程序将从服务对应的地址列表中,通过相应的负载均衡算法和规则,选取一台服务器进行访问,这个过程就叫做负载均衡。
为了保证系统的稳定性,减轻系统的压力,负载均衡算法就显得很重要了,下面就重点介绍一些常见的负载均衡算法。
1.轮询算法
轮询就是将请求轮流的分配到后端服务器上,他均衡对待每台服务器,而不关心实际的连接数和系统的负载。
idx=(idx+1)%M
2.随机算法
通过系统随机函数,根据服务器列表的大小值来随机选取其中一台进行访问。由概率论统计理论可以得知,随着调用量的增加,其实际效果越来越接近平均分配流量到每一台后端服务器,也是轮询的结果。
idx=rand()%M
3.最少连接算法
客户端的每一次请求服务在服务器停留的时间都可能会有较大的差异,随着工作时间的加长,如果采用简单的轮循或随机均衡算法,每一台服务器上的连接进程可能会产生极大的不同,这样的结果并不会达到真正的负载均衡。最少连接数均衡算法对内部中有负载的每一台服务器都有一个数据记录,记录的内容是当前该服务器正在处理的连接数量,当有新的服务连接请求时,将把当前请求分配给连接数最少的服务器。
此种负载均衡算法适合长时间处理的请求服务。
4.响应速度算法
负载均衡设备对内部各服务器发出一个探测请求(例如Ping),然后根据内部中各服务器对探测请求的最快响应时间来决定哪一台服务器来响应客户端的服务请求。
此种负载均衡算法能较好地反映服务器的当前运行状态,但最快响应时间仅仅指的是负载均衡设备与服务器间的最快响应时间,而不是客户端与服务器间的最快响应时间。
5.持续性算法
从一个特定的客户端发出的请求都被分配到一个实服务组中的同一个实服务器上进行处理。
5.1.基于IP的算法
- Persistent IP(pi): 基于用户IP地址来选择服务器。
- Hash IP(hi): 基于用户IP地址的HASH值,来选择服务器
- Consistent Hash IP(chi): 基于列表IP来选择服务器
5.2.基于报头/请求的算法
- HashHeader(hh): 基于用户请求报中HTTP报头来选择服务器;
- PersistentHostname(ph): 基于用户请求报中HTTP报头的Hostname的HASH值,来选择服务器;
- PersistentURL(pu): 基于对URITag和值的静态对应关系来选择服务器。
- SSLSessionID(sslsid): 基于SSL会话ID来选择服务器。
5.3.基于Cookie的负载均衡算法
- PersistentCookie(pc):选择服务器基于用户请求包用CookieName/Value的静态对应关系;
- HashCookie(hc):选择服务器基于用户请求包用CookieName/Value的Hash值对应关系;
- InsertCookie(ic):选择服务器基于负载均衡器向服务器响应包中插入Cookie;
- Re-writeCookie(rc):选择服务器基于负载均衡器向服务器响应包中重写Cookie值。(必须为重写指定Cookie值的偏移量)