一、负载均衡
集群中的应用服务器通常被设置成无状态,请求可以转发到任意的服务器上;
负载均衡器会根据服务器的情况,将请求转发大合适的节点上;
负载均衡器可以实现高可用性和伸缩性:
高可用:当一个节点发生故障时,可以将请求转发到其他节点上,保证所有请求都可被处理;
伸缩性:在集群中,可以很容易的删除或者添加服务器节点;
负载均衡过程主要经历2个过程:
根据负载均衡服务器分配目标服务器;
转发实现;
1、负载均衡算法:
①轮询法:将客户端请求轮流均匀地发送到所有服务器上;
使用场景:所有服务器性能差不多的情况下;
缺点:如果服务器之间存在性能差距,可能出现部分服务器过载,导致负载不均衡;
②加权轮询算法:在轮询的基础上,根据服务器的性能的不同,给服务器赋不同的接收请求的权重;
③最少连接算法:根据当前所有服务器的连接数,将请求转发到当前连接最少的服务器
优点:解决了轮询法和加权轮询法不能根据请求的属性(请求的处理速度)动态调整服务器分配,使用最少轮询法可以很好 的利用请求和服务器之间的差异性;
④加权最少连接法:在最少连接法的基础上,根据服务器性能的不同,给不同的服务器赋不同的权重,计算出服务器的最少 连接数;
⑤随机法:跟轮询法出不多,给请求随机分配目标服务器;
缺点:容易造成负载不均衡;
⑥原地址哈希法:根据源服务器地址计算哈希值,用哈希值对服务器数量取模,确定服务器的地址;
2、转发实现
①HTTP重定向:HTPP重定向服务器根据某一负载均衡算法计算出服务器IP地址,将该地址写入HTPP重定向的报文中,发 送回客户端,然后客户端重新发送请求到指定的服务器;
缺点:
需要完成2次请求,请求处理时间比较长;
HTTP负载均衡器处理能力有限,会限制集群规模;
②DNS域名解析服务器:在进行DNS域名解析的同时根据负载均衡算法计算服务器地址;
优点:
DNS域名解析服务器可以根据地理位置,将最近位置的服务器返回;
缺点:
DNS域名服务器是多级结构,每一级的域名记录都可能被缓存, 当下线一级域名服务器修改DNS记录时,需要很长时间才 能生效;
③反向代理服务器:反向代理服务器在源服务器的前面,请求通过反向代理服务器到达源服务器,反向代理服务器可以进行 缓存,日志记录等,也可以作为负载均衡器;
这种负载均衡方式下,请求不会直接到达源服务器,源服务器不用配置外部IP,反向代理服务器需要配置内外两套IP;
优点:
与其他功能集成在一起,部署简单;
缺点:
所有请求和响应都要经过反向代理服务器,反向代理服务器处理能力有限,可能成为集群的整体性能的瓶颈;
④网络层:在操作系统内核进程中获取网络数据包,根据负载均衡算法计算源服务器地址,修改数据包中目标服务器地址, 最后进行转发;
源服务器返回的响应也要经过负载均衡器,通常是让负载均衡器作为集群的网关;
优点:
在内核进程中处理,性能高;
缺点:
和反向代理服务器一样,请求和响应都要经过负载均衡器,会成为性能瓶颈;
⑤数据链路层:在链路层根据负载均衡算法计算请求数据包的MAC地址,修改请求数据包的目标MAC地址,进行转发;
通过配置源服务器虚拟IP地址与负载均衡服务器IP地址一样的虚拟IP地址,因此可以不用修改IP地址实现转发,因此源服务 器的响应不用返回负载均衡器,直接发回客户端,避免了负载均衡器成为性能的瓶颈;
二、负载均衡器下的Session管理
如果用户的请求被转发到不同的服务器上,因为没有上次Session,需要重新登录等操作;
1、Sticky Session
将同一用户的所有请求转发到同一个服务器上,保存Session;
缺点:
如果发生宕机,该用户所有的Session将丢失;
2、Session Replication
将用户请求转发到不同的服务器上,对用户的Session记录进行同步;
缺点:
内存消耗较大;
同步过程占用网络带宽和服务器处理时间;
3、Session Server
将用户的Session单独存储在服务器;
为了集群的可伸缩性,要求应用服务器是无状态的,将Session保存在单独服务器中,而不是应用服务器中,可以使应用服务 器处于无状态;
优点:
可是实现大型集群的可伸缩性;
缺点:
需要实现Session的单独的代码;
参考资料:https://cyc2018.github.io/CS-Notes/#/notes/%E9%9B%86%E7%BE%A4