负载均衡是指在一组后端服务器(也称为服务器群或服务器池)之间有效地分配传入网络流量。 现代高流量网站必须以快速可靠的方式处理来自用户或客户端的数十万并发请求,并返回正确的文本、图像、视频或应用程序数据。为了经济高效地扩展以满足这些高容量,现代计算最佳实践通常需要添加更多服务器。 负载均衡器充当“流量交警”,位于你的服务器前,并在所有服务器之间路由客户端请求,这些服务器能够以最大限度地提高速度和容量利用率的方式满足这些请求,并确保没有任何服务器过度工作,这可能会降低性能.如果单个服务器出现故障,负载均衡器会将流量重定向到其余的在线服务器。将新服务器添加到服务器组时,负载均衡器会自动开始向其发送请求。 负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
Nginx 是一个基于 C 实现的高性能 Web 服务器,可以通过系列算法解决负载均衡问题。并且由于它具有高并发、高可靠性、高扩展性、开源等特点,成为开发人员常用的反向代理工具。
正向代理为客户端访问服务器地址,它代理客户端访问服务器,替客户端发起请求。 比如客户端想要访问 Google,但是由于一些原因访问不了这时找到了以为可以访问的“朋友”:代理服务器,代理服务器访问目标服务器并把结果返回给客户,目标服务器是不知道究竟是谁访问的。
如果有很多请求发往同一个服务器,一个服务器无法支撑那么大的访问量然后把一些请求分发给附近的服务器。此式,来自不同客户端的所有请求都发到了代理服务器,然后再由代理服务器通过算法分发给各个服务器代理其请求。方向代理过程中客户不知道哪个服务器处理了自己的请求,这样既提升了速度也提高了安全性。
假设一共拥有N台服务器,代理服务器遍历服务器列表并按照顺序分配给每个服务器请求,当遍历完所有服务器后再从头开始遍历。轮询为负载均衡中较为基础也较为简单的算法,它不需要配置额外参数 特点:由于该算法每个请求按照时间先后分配给每个服务器,比较适合服务器性能差距不大的集群,每个服务器承载相同的负载。但对于性能差异较大的服务器群容易造成资源浪费。
相对于普通的轮询给每个服务器加上了权重,代理服务器按权分配给不同服务器相应的请求,当一个请求到来时优先分配给高性能的服务器。 特点:加权轮询适合服务器性能差别较大的集群,能够合理利用服务器性能。
ip_hash 根据IP的 hash 值分配服务器,该算法保证同一IP的请求映射到同一服务器,或者不同IP同 hash 的请求映射到同一服务器。 特点:该算法一定程度上解决了服务器 Session 不共享的问题。 Session 不共享:在反向代理的情况下用户的请求会被分发给不同的服务器,假设用户登录,Session 存到A服务器上,下一次用户的请求被映射到B服务器上,但由于 Session 不共享,B服务器无法读取用户的登录信息,以至于用户在进行别的操作时可能会要重新登陆。所以 Session 共享方案在分布式环境和微服务系统下,显得尤其重要。 实际应用中,我们可以利用 ip_hash,将一部分 IP 下的请求转发到运行新版本服务的服务器,另一部分转发到旧版本服务器上,实现灰度发布。再者,如遇到文件过大导致请求超时的情况,也可以利用 ip_hash 进行文件的分片上传,它可以保证同客户端发出的文件切片转发到同一服务器,利于其接收切片以及后续的文件合并操作。
url_hash 是根据请求的 URL 的 hash 值来分配服务器。该算法的特点是,相同 URL 的请求会分配给固定的服务器,当存在缓存的时候,效率一般较高。然而 Nginx 默认不支持这种负载均衡算法,需要依赖第三方库。
假设拥有N台服务器,当有请求访问时遍历所有服务器找到请求最少的服务器把请求交给它。
参考自:五分钟看懂 Nginx 负载均衡