写点什么

五分钟看懂 Nginx 负载均衡

  • 2021-03-18
  • 本文字数:2899 字

    阅读完需:约 10 分钟

五分钟看懂 Nginx 负载均衡

前言


对于电商平台而言,随着业务的不断发展壮大,网站访问量和数据量也随之急剧增长,该情况的产生给服务器带来了一定的负担。从用户体验层面而言,由于服务器端数据处理带来的时延,往往导致页面的响应速度过慢、操作流畅性受阻等问题。这在某种程度上甚至会潜在影响平台的成交量。提供高效率,高质量的服务成为亟待解决的问题。负载均衡策略的出现和发展成为缓解上述问题的有效途径。本文将带你了解基于 Nginx 实现的负载均衡。


什么是负载均衡


负载均衡(Load Balance),它在网络现有结构之上可以提供一种廉价、有效、透明的方法来扩展网络设备和服务器的带宽,并可以在一定程度上增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性等。用官网的话说,它充当着网络流中“交通指挥官”的角色,“站在”服务器前处理所有服务器端和客户端之间的请求,从而最大程度地提高响应速率和容量利用率,同时确保任何服务器都没有超负荷工作。如果单个服务器出现故障,负载均衡的方法会将流量重定向到其余的集群服务器,以保证服务的稳定性。当新的服务器添加到服务器组后,也可通过负载均衡的方法使其开始自动处理客户端发来的请求。详情可参考:What Is Load Balancing?


简言之,负载均衡实际上就是将大量请求进行分布式处理的策略。


什么是 Nginx 负载均衡


通过上文简单的概念介绍,你可能对负载均衡有了一个初步的了解,知道它是一种调度策略。那么问题来了,Nginx 又是什么呢?Nginx 如何实现负载均衡?这就要从正向代理和反向代理说起了。


正向代理


正向代理(Forward Proxy)最大的特点是,客户端非常明确要访问的服务器地址,它代理客户端,替客户端发出请求。比如:科学上网,俗称翻墙(警告⚠️:翻墙操作违反相关法律规定,本文只是为了解释正向代理向读者举个例子,仅供学习参考,切勿盲目翻墙)。



假设客户端想要访问 Google,它明确知道待访问的服务器地址是 https://www.google.com/,但由于条件限制,它找来了一个能够访问到 Google 的”朋友”:代理服务器。客户端把请求发给代理服务器,由代理服务器代替它请求 Google,最终再将响应返回给客户端。这便是一次正向代理的过程,该过程中服务器并不知道真正发出请求的是谁。


反向代理


那么,随着请求量的爆发式增长,服务器觉得自己一个人始终是应付不过来,需要兄弟服务器们帮忙,于是它喊来了自己的兄弟以及代理服务器朋友。此时,来自不同客户端的所有请求实际上都发到了代理服务器处,再由代理服务器按照一定的规则将请求分发给各个服务器。


这就是反向代理(Reverse Proxy),反向代理隐藏了服务器的信息,它代理的是服务器端,代其接收请求。换句话说,反向代理的过程中,客户端并不知道具体是哪台服务器处理了自己的请求。如此一来,既提高了访问速度,又为安全性提供了保证。



在这之中,反向代理需要考虑的问题是,如何进行均衡分工,控制流量,避免出现局部节点负载过大的问题。通俗的讲,就是如何为每台服务器合理的分配请求,使其整体具有更高的工作效率和资源利用率。


Nginx 是什么?


Nginx 作为一个基于 C 实现的高性能 Web 服务器,可以通过系列算法解决上述的负载均衡问题。并且由于它具有高并发、高可靠性、高扩展性、开源等特点,成为开发人员常用的反向代理工具。


负载均衡常用算法


1. 轮询 (round-robin)


轮询为负载均衡中较为基础也较为简单的算法,它不需要配置额外参数。假设配置文件中共有  台服务器,该算法遍历服务器节点列表,并按节点次序每轮选择一台服务器处理请求。当所有节点均被调用过一次后,该算法将从第一个节点开始重新一轮遍历。


特点:由于该算法中每个请求按时间顺序逐一分配到不同的服务器处理,因此适用于服务器性能相近的集群情况,其中每个服务器承载相同的负载。但对于服务器性能不同的集群而言,该算法容易引发资源分配不合理等问题。


2、加权轮询


为了避免普通轮询带来的弊端,加权轮询应运而生。在加权轮询中,每个服务器会有各自的 weight。一般情况下,weight 的值越大意味着该服务器的性能越好,可以承载更多的请求。该算法中,客户端的请求按权值比例分配,当一个请求到达时,优先为其分配权值最大的服务器。


特点:加权轮询可以应用于服务器性能不等的集群中,使资源分配更加合理化。


Nginx 加权轮询源码可见:ngx_http_upstream_round_robin.c ,源码分析可参考:关于轮询策略原理的自我理解 。其核心思想是,遍历各服务器节点,并计算节点权值,计算规则为 current_weight 与其对应的 effective_weight 之和,每轮遍历中选出权值最大的节点作为最优服务器节点。其中 effective_weight 会在算法的执行过程中随资源情况和响应情况而改变。较为核心的部分如下:


for (peer = rrp->peers->peer, i = 0;  peer; 	/* peer 为当前遍历的服务器结点*/  peer = peer->next, i++){  ...      /* 每轮遍历会更新 peer 当前的权值*/  peer->current_weight += peer->effective_weight;
... /* best 为当前服务器中的最优节点,即本轮中选中的服务器节点*/ if (best == NULL || peer->current_weight > best->current_weight) { best = peer; p = i; } ...}
复制代码


3. IP 哈希(IP hash)


ip_hash 依据发出请求的客户端 IP 的 hash 值来分配服务器,该算法可以保证同 IP 发出的请求映射到同一服务器,或者具有相同 hash 值的不同 IP 映射到同一服务器。


特点:该算法在一定程度上解决了集群部署环境下 Session 不共享的问题。


Session 不共享问题是说,假设用户已经登录过,此时发出的请求被分配到了 A 服务器,但 A 服务器突然宕机,用户的请求则会被转发到 B 服务器。但由于 Session 不共享,B 无法直接读取用户的登录信息来继续执行其他操作。


实际应用中,我们可以利用 ip_hash,将一部分 IP 下的请求转发到运行新版本服务的服务器,另一部分转发到旧版本服务器上,实现灰度发布。再者,如遇到文件过大导致请求超时的情况,也可以利用 ip_hash 进行文件的分片上传,它可以保证同客户端发出的文件切片转发到同一服务器,利于其接收切片以及后续的文件合并操作。


4、其他算法


URL hash

url_hash 是根据请求的 URL 的 hash 值来分配服务器。该算法的特点是,相同 URL 的请求会分配给固定的服务器,当存在缓存的时候,效率一般较高。然而 Nginx 默认不支持这种负载均衡算法,需要依赖第三方库。


最小连接数(Least Connections)

假设共有  台服务器,当有新的请求出现时,遍历服务器节点列表并选取其中连接数最小的一台服务器来响应当前请求。连接数可以理解为当前处理的请求数。


总结


Nginx 作为一款优秀的反向代理服务器,可以通过不同的负载均衡算法来解决请求量过大情况下的服务器资源分配问题。较为常见的负载均衡算法有轮询、加权轮询、IP 哈希等等,可分别应对不同的请求场景。如果有兴趣可以去 Github 理解下大神的源码,有问题也欢迎一起来探讨~



头图:Unsplash

作者:鱼鱼

原文:https://mp.weixin.qq.com/s/utv6SNkCoiw2PBH9F5R1Gw

原文:五分钟看懂 Nginx 负载均衡

来源:政采云前端团队 - 微信公众号 [ID:Zoo-Team]

转载:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2021-03-18 23:505048

评论 2 条评论

发布
用户头像
InfoQ的博文现在质量都这么差了吗? 这明显的导流到微信公众号了。
2021-03-22 14:23
回复
用户头像
不是 讲真的 这文章
2021-03-20 22:59
回复
没有更多了
发现更多内容

Vue自定义指令

我搬去水星了

6 月 优质更文活动

华为云新一代分布式数据库GaussDB,给世界一个更优选择

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 6 月 PK 榜

Postman 和 GraphQL:最佳实践指南

Liam

Java Postman API graphql 接口工具

实例讲解Flink 流处理程序编程模型

华为云开发者联盟

开发 华为云 华为云开发者联盟 企业号 6 月 PK 榜

禅道软件14年原创研发荣膺SAFe平台合作伙伴,国际权威机构认可专业实力

禅道项目管理

敏捷开发 safe 禅道 禅道项目管理

【6.02-6.09】写作社区优秀技术博文一览

InfoQ写作社区官方

热门活动 优质创作周报

构建财务共享体系,智能化引领转型升级

用友BIP

财务共享

突破创新!Windows主机助你打造独一无二的网站!

一只扑棱蛾子

Windows主机

「悦数图数据库」亮相中国国际信息通信展览会,推进图技术产业化发展

悦数图数据库

通信 图数据库

面向多告警源,如何构建统一告警管理体系?

阿里巴巴云原生

阿里云 云原生 可观测

DHR数智人力:智能学习加速人才培养与创新

用友BIP

人力资源 人才 数智人力

微服务高并发概念与核心类:调用链上下文与入口类

互联网架构师小马

Excelize 荣获 2022 年中国开源创新大赛一等奖

xuri

开源 编程 开发者 创新 Excelize

华为云 UCS GitOps:轻松交付多集群云原生应用

华为云开发者联盟

华为云 华为云开发者联盟 企业号 6 月 PK 榜

旭阳数字:让焦化行业供应链更数智

用友BIP

数智平台

Vue组件-非单文本组件

我搬去水星了

6 月 优质更文活动

vue-基本操作-收集表单元素绑定的数据

我搬去水星了

6 月 优质更文活动

vue-表单元素进阶收集操作

我搬去水星了

6 月 优质更文活动

电源管理IC下游市场向高端工业和汽车领域转型,这家芯片设计厂商值得关注

华秋电子

「悦数图数据库」亮相中国国际信息通信展览会,推进图技术产业化发展

悦数图数据库

通信 图数据库 运营商

Vue-组件的嵌套

我搬去水星了

6 月 优质更文活动

中企出海所面临的几点人力资源挑战

用友BIP

中企出海

NFTScan 与 Realy 达成合作伙伴,双方在元宇宙 NFT 数据方面进行深度合作!

NFT Research

NFT Metaverse

隆重共建开放,共享未来 | 2023开放原子全球开源峰会OpenAtom OpenHarmony分论坛即将启幕

开放原子开源基金会

开源 OpenHarmony 开放原子全球开源峰会

共享电动单车生产厂家怎么找合适

共享电单车厂家

共享电动车厂家 共享电单车厂商 共享电动车生产 本铯电动车厂家

生态伙伴 | 中电创新科技集聚示范区携手华秋硬创,加速智能硬件孵化

华秋电子

创建Vue脚手架(Vue CLI)并分析项目结构

我搬去水星了

6 月 优质更文活动

Vue基本的内置指令

我搬去水星了

6 月 优质更文活动

Java线程池一、基本概念和原理

echoes

Java 线程池

Vue单文件组件

我搬去水星了

6 月 优质更文活动

Vue中组件的几个重要点

我搬去水星了

6 月 优质更文活动

五分钟看懂 Nginx 负载均衡_语言 & 开发_政采云前端团队_InfoQ精选文章