1.负载均衡集群中的应用服务器(节点)通常设计为无状态的,用户可以向任意节点发起请求。负载均衡器根据集群中各节点的负载,将用户请求转发到合适的节点。负载均衡器可用于实现高可用性和可扩展性:高可用性:当一个节点发生故障时,负载均衡器会将用户请求转发到另一个节点,从而保证所有服务持续可用;可扩展性:根据整个系统的负载情况,可以方便地添加或删除节点。负载均衡器的运行过程由两部分组成:根据负载均衡算法转发的节点;转发。负载均衡算法1.RoundRobin轮询算法轮流将每个请求发送到每个服务器。下图中一共6个client产生了6个请求,这6个请求是按照(1,2,3,4,5,6)的顺序发送的。对于(1,3,5)的请求会发送给服务器1,对于(2,4,6)的请求会发送给服务器2。这种算法比较适合各服务器性能相近的场景。如果性能上存在差异,性能差的服务器可能无法承受过大的负载(下图中的服务器2)。2.加权轮循(WeightedRoundRobbin)加权轮循是在轮循的基础上,根据服务器的性能差异,给服务器分配一定的权重,对性能好的服务器分配更高的权重。例如下图中,服务器1被分配的权重为5,服务器2被分配的权重为1,那么(1,2,3,4,5)请求将发送给服务器1,并且(6)requestswillbesendto被发送到服务器2。3.LeastConnections(最少连接数)由于每次请求的连接时间不同,如果使用roundrobin或weightedroundrobin算法,当前一台服务器的连接数可能过大,而另一台服务器的连接过小,导致负载不均衡。比如下图中,(1,3,5)个请求会发送到服务器1,但是很快(1,3)就会断开连接,只有(5)个请求连接到服务器1;(2,4,6)请求发送到服务器2,只有(2)断开连接,此时(6,4)请求连接到服务器2。当系统继续运行时,服务器2负载过大.最少连接算法是将请求发送给当前连接数最少的服务器。例如下图中,如果服务器1当前的连接数最少,那么新传入的请求6将发送给服务器1。4.加权最少连接(WeightedLeastConnection)在最少连接数的基础上,根据服务器的性能给每台服务器分配一个权重,然后根据权重计算每台服务器可以处理的连接数。5.随机算法(Random)随机向服务器发送请求。与轮询算法类似,该算法更适用于服务器性能相似的场景。6、源地址哈希法(IPHash)源地址哈希计算客户端IP的哈希值,然后对服务器数量取模得到目标服务器的序号。可以保证相同IP的客户端的请求都会被转发到同一台服务器,用于实现粘性会话(StickySession)转发。实现1.HTTP重定向HTTP重定向负载均衡服务器通过一定的负载均衡算法计算出服务器的IP地址后,将该地址写入HTTP重定向报文中,状态码为302,客户端收到重定向报文后,需要再次向服务器发起请求。缺点:需要两次请求,访问延迟比较高;HTTP负载均衡器的处理能力是有限的,会限制集群的大小。负载均衡转发的缺点很明显,在实际场景中很少使用。2、DNS域名解析在DNS解析域名的同时,使用负载均衡算法计算服务器IP地址。优点:DNS可以根据地理位置进行域名解析,返回离用户最近的服务器IP地址。缺点:由于DNS的多级结构,可能会缓存每一级的域名记录。当服务器离线需要修改DNS记录时,需要很长时间才能生效。大型网站基本上都是使用DNS作为一级负载均衡方式,然后在内部使用其他方式进行二级负载均衡。也就是说,域名解析的结果就是内部的负载均衡服务器IP地址。3.反向代理服务器反向代理服务器位于源服务器之前,用户的请求需要经过反向代理服务器才能到达源服务器。反向代理可以用于缓存、日志记录等,也可以作为负载均衡服务器。这种负载均衡转发方式,客户端不直接请求源服务器,所以源服务器不需要外部IP地址,反向代理需要配置内外两套??IP地址。优点:与其他功能集成,易于部署。缺点:所有请求和响应都需要经过反向代理服务器,这会成为性能瓶颈。4、网络层在操作系统内核进程中获取网络数据包,根据负载均衡算法计算出源服务器的IP地址,修改请求数据包的目的IP地址,最后转发。源服务器返回的响应也需要经过负载均衡服务器,通常通过让负载均衡服务器同时作为集群的网关服务器来实现。优点:在内核进程中处理,性能比较高。缺点:和反向代理一样,所有的请求和响应都要经过负载均衡服务器,这会成为性能瓶颈。5.链路层根据链路层的负载均衡算法计算出源服务器的MAC地址,修改请求报文的目的MAC地址,并转发。通过配置源服务器的虚拟IP地址与负载均衡服务器的IP地址一致,可以在不修改IP地址的情况下进行转发。也因为IP地址相同,源服务器的响应不需要再转发回负载均衡服务器,可以直接转发给客户端,避免负载均衡服务器成为瓶颈。这是一种称为直接路由的三角传输模式。对于提供下载和视频服务的网站,直接路由避免了大量的网络传输数据经过负载均衡服务器。这是目前大型网站使用最广泛的负载均衡转发方式。Linux平台上可以使用的负载均衡服务器是LVS(LinuxVirtualServer)。参考:比较负载均衡算法Redirection和LoadBalancing2.集群下的Session管理着一个用户的Session信息如果是存储在一个服务器上,那么当负载均衡器将用户的下一个请求转发给另一个服务器时,因为该服务器没有用户的Session信息,则用户需要重新登录。StickySession需要配置一个负载均衡器,让一个用户的所有请求都路由到同一个服务器,这样用户的Session就可以存储在服务器中。缺点:当服务器宕机时,服务器上的所有会话都会丢失。SessionReplication在服务器之间进行会话同步,每台服务器都有所有用户的会话信息,因此用户可以向任意一台服务器发出请求。缺点:太占内存;同步过程占用网络带宽和服务器处理器时间。SessionServer使用单独的服务器来存储Session数据,可以使用传统的MySQL,也可以使用内存数据库Redis或Memcached。优点:为了使大型网站具有可扩展性,集群中的应用服务器通常需要保持无状态状态,因此应用服务器不能存储用户会话信息。SessionServer将用户的session信息单独存储,从而保证了应用服务器的无状态性。缺点:需要实现访问Session的代码。
