Nginx 一文总结Nginx负载均衡

一、Nginx的负载均衡策略


负载均衡就是将请求“均衡”地分配到多台业务节点服务器上。这里的“均衡”是依据实际场景和业务需要而定的。

对于Nginx来说,请求到达Nginx,Nginx作为反向代理服务器,有绝对的决策权,可以按照规则将请求分配给它知道的节点中的一个,通过这种分配,使得所有节点需要处理的请求量处于相对平均的状态,从而实现负载均衡。

Nginx支持的负载均衡策略很多,比较重点的如下:

  • round robin(轮询)
  • random(随机)
  • weight(权重)
  • fair(按响应时长,三方插件)
  • url_hash(url的hash值)
  • ip_hash(ip的hash值)
  • least_conn(最少连接数)

这么多的策略,非常不利于记忆和选择,我们不妨将这些常见的策略归类,分而化之,方便挑选。

第一类 最佳实现


  • weight(权重)
  • random(随机)

最佳实践,其实就是最常见、最普通的默认配置,当然也是在一定程度上最好用的配置。不知道用什么方式的时候,就可以选择用这一类型。

轮询不用多说。这里的随机,其实在大量请求的情况下,按照概率的理论等同于轮询的方式。

轮询配置参考:

#默认配置就是轮询策略 upstream server_group { server backend1.example.com; server backend2.example.com; }

随机配置参考:

upstream server_group { random; server backend1.example.com; server backend2.example.com; server backend3.example.com; server backend4.example.com; }

第二类 性能优先


  • weight(权重)
  • fair(按响应时长,三方插件)
  • least_conn(最少连接数)

让业务节点中性能更强的机器得到更多请求,这也是一个比较好的分配策略。什么是性能更好的机器?这个问题也有很多的维度去考量。

  • 从经验或硬件上分为高权重、低权重的机器。
  • 按照节点请求的响应时长来决定是多分配请求,还是少分配请求。
  • 按照保持的连接数。一般来说保持的连接数越多说明处理的任务越多,也是最繁忙的,可以将请求分配给其他机器处理。

权重的配置参考:

upstream server_group { server backend1.example.com weight=5; #默认为不配置权重为1 server backend2.example.com; }

响应的时长(fair)配置参考:需要在Nginx编译时加入nginx-upstream-fair模块。

upstream server_group{ fair; server backend1.example.com; server backend2.example.com; server backend3.example.com; server backend4.example.com; }

最少连接数(least_conn)配置参考:

upstream server_group { least_conn; server backend1.example.com; server backend2.example.com; }

第三类 保持稳定


  • ip_hash
  • url_hash

很多请求都是有状态的,上一次请求到哪个业务节点,这次还要请求到哪台机器。比如常见的session就是这样一种有状态的业务。

这里Nginx提供了按照客户端ip的hash来作为用户的标示分配、url的hash作为分配标示的规则。本质上还是要找到用户的请求中不变的要素,抽离出来,这样就可以进行分配了。

ip_hash配置参考:

upstream server_group { ip_hash; server backend1.example.com; server backend2.example.com; }

url_hash配置参考:(请求同一个资源被同一个服务器截获)

upstream server_group{ hash $request_uri consistent; server backend1.example.com; server backend2.example.com; server backend3.example.com; server backend4.example.com; } upstream web{ hash $request_uri consistent; server 192.168.179.100 ; server 192.168.179.101 ; } [root@localhost html]# while true;do curl 192.168.179.99;sleep 1;done --可以看到每次访问固定的资源都会到固定的服务器上去 proxy this is 192.168.179.101 page proxy this is 192.168.179.101 page proxy this is 192.168.179.101 page 

二、Nginx支持一致性哈希进行分配


Nginx支持一致性hash进行分配,也就是配置中consistent。

什么是一致性hash?为什么要引入这个机制?在生产环境下,业务节点经常会出现增加或减少的情况,就算这种增加或减少都是被动的,可能会对hash分配产生影响。如何能够做到尽量减少影响呢?这时一致性hash被发明出来。

一致性hash解决两个问题:

  • 分配特别不均匀;
  • 节点变动除了对分配到这个节点上的请求有影响,还会导致其他节点上的请求重新分配。

1)如何解决分配不均的问题

将原来的每一个节点复制出N个虚拟节点,并且给这些虚拟节点都起个名字。

比如原来有5个节点,分配的时候经常会不均匀,现在每个节点都虚拟出N个节点,就是5*N个节点,会极大降低分配不均匀的情况。下面就要说说如何分配的问题了。

2)如何解决节点变动的问题

一致性哈希的基本思想:

  • 定义一个[0,(2^32)-1]的数值空间。相当于取长度从 0到2^32-1 的线段。节点映射到线段上。将每个节点,包括虚拟节点,都通过hash算法得到数值,然后映射到这个取值区间上。如下图:

  • 计算数据的Hash值。把请求中的关键字符串通过hash算法得到一个数值,在线段中找到一个位置,如果算出来的数值大于2^32-1则认为是0。按照这个规则,其实是把这个线段首尾相连形成一个环,所以也叫hash环。
  • 数据节点在线段上找归属的节点。沿着这个线段向右找到离得最近的节点,并把该节点作为这个数据的归属节点。

下面再来看节点的变化对一致性Hash的影响。

  • 节点减少:比如NodeA突然故障了,原来分配到其他节点上的数据不会发生变化,只有分配到NodeA上的数据会重新找离它们最近的点,从而减少了hash重新分配的数量。这也是一致性hash最大的优势。
  • 节点增加:比如现在请求量抖增,需要增加节点降低负载。当新加入节点NodeE时,NodeE及它的一群虚拟节点会根据hash值分配在hash环上。这时,大部分数据再根据一致性哈希规则找其归属的Node节点都不会发生变化,只有那些值计算出来发现离NodeE更近的数据发生了变化,但数量毕竟是有限的,减少了因为节点增加造成的影响。

三、故障节点摘除与恢复


先看看经典配置,再详细解释。

upstream server_group { server backend1.example.com ; server backend2.example.com max_fails=3 fail_timeout=30s; server backup1.example.com backup; }

max_fails=number

这个参数决定了多少次请求后端失败后会暂停这个业务节点,不再给它发新的请求,默认值是1。此参数需要配合fail_timeout一起用。

题外话:如何定义失败,有很多种类型,这里因为主要处理HTTP代理,所以更关注proxy_next_upstream。

proxy_next_upstream:主要定义了当服务节点出现状况时,会将请求发给其他节点,也就是定义了怎么算作业务节点失败。

fail_timeout=time

决定了当Nginx认定这个节点不可用时,暂停多久。不配置默认就是10s。

把上面两个参数联合起来考虑就是:当Nginx发现发送到这个节点上的请求失败了3次的时候,就会把这个节点摘除,摘除时间是30s,30s后才会再次发送请求到这个节点上。

backup

类似于switch语句中的default,当主要节点都挂了的时候,会把请求打到这个backup节点。这是最后一个救兵了。

四、总结


由于Nginx采用了反向代理技术,对于请求的转发有绝对的控制权,使得负载均衡变成了可能。

本文介绍了负载均衡的概念,详细分类了Nginx的负载均衡策略,并提供了简单配置参考。同时介绍了一致性hash的原理,及常用的故障节点的摘除与恢复。

原文链接:https://blog.csdn.net/qq_34556414/article/details/106158077

原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/6446

(0)
优速盾-小U的头像优速盾-小U
上一篇 2022年10月20日 09:59
下一篇 2022年10月20日 11:32

相关推荐

  • Linux环境变量配置全攻略

    Linux环境变量配置 在自定义安装软件的时候,经常需要配置环境变量,下面列举出各种对环境变量的配置方法。 下面所有例子的环境说明如下: 系统:Ubuntu 14.0 用户名:uu…

    行业资讯 2025年2月5日
    00444
  • web安全浅析

    就之前本人主持开发的金融产品所遇到的安全问题,设计部分请参见:http://www.cnblogs.com/shenliang123/p/3835072.html 这里就部分web…

    2023年1月26日
    00788
  • 静态资源CDN挂掉了(处理办法)

    都知道使用静态的 BootCDN – Bootstrap 中文网开源项目免费 CDN 加速服务 引入jQuery等一些js包的时候,会提升网页的性能。 那…

    行业资讯 2022年8月24日
    001.0K
  • Github加速

    国内因为dns污染,所以github不管访问还是clone项目都贼慢,为了加速,可以直接绕过国内dns服务器用github官方的cdn进行加速 1 获取GitHub官方CDN地址 …

    行业资讯 2022年11月16日
    001.0K
  • 母鸡服务器是什么?

    母鸡服务器是什么?很多小白站长朋友可能不是很清楚母鸡服务器是什么?其实母鸡服务器可以简单理解为可以用来创建VPS主机的高配专用服务器。VPS是由高配的服务器分割而来,…

    行业资讯 2025年8月22日
    00173
  • 网站策划未来趋势

    网站策划是成功网站平台建设成败的关键内容之一。在中国真正普及全职的网站策划人员严格讲是2002年,在之前更多是由技术性人才(软件项目经理、网站美工等)担任此项职位,随着中国互联网环…

    行业资讯 2023年1月16日
    00542
  • 免备案CDN加速的作用有哪些

    免备案cdn加速的作用有:1、能有效解决跨运营商的访问延迟问题,实现带宽优化;2、能将用户接入到距离最近的节点上,有效解决网络拥堵的问题并提高网站的实时响应速度;3、能隐藏源站,使…

    2022年7月30日
    00716
  • 希腊旅游业加速回暖

    原标题:希腊旅游业加速回暖 来源:人民日报 当前,希腊已进入旅游旺季。希腊《每日报》近日报道说,未来几个月,希腊的酒店入住率和航班上座率都将恢复到疫情前水平,2022年希腊的旅游收…

    行业资讯 2022年9月1日
    00613
  • FP10.2のStageVideo

    其实吧,我又想的太美好了…   老式的Video作为显示对象的一种,由CPU负责渲染,某些情况下GPU承担一点事情。虽然可以实现很有创意的想法,但也因此导致C…

    行业资讯 2022年10月23日
    00734
  • 西安双减政策有托管服务吗 – 西安本地宝

    推行课后服务“5+2”模式,即学校每周5天都要开展课后服务,每天至少开展2小时,结束时间要与当地正常下班时间相衔接。对家长接孩子还有困难的学生,应提供延时托管服务。 关于支持探索开…

    行业资讯 2024年10月6日
    00364

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

优速盾注册领取大礼包www.cdnb.net
/sitemap.xml