首页 > 系统相关 >从零手写实现 nginx-31-load balance 负载均衡介绍

从零手写实现 nginx-31-load balance 负载均衡介绍

时间:2024-07-17 22:18:10浏览次数:7  
标签:load 实现 31 192.168 server nginx 手写 backend

前言

大家好,我是老马。很高兴遇到你。

我们为 java 开发者实现了 java 版本的 nginx

https://github.com/houbb/nginx4j

如果你想知道 servlet 如何处理的,可以参考我的另一个项目:

手写从零实现简易版 tomcat minicat

手写 nginx 系列

如果你对 nginx 原理感兴趣,可以阅读:

从零手写实现 nginx-01-为什么不能有 java 版本的 nginx?

从零手写实现 nginx-02-nginx 的核心能力

从零手写实现 nginx-03-nginx 基于 Netty 实现

从零手写实现 nginx-04-基于 netty http 出入参优化处理

从零手写实现 nginx-05-MIME类型(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展类型)

从零手写实现 nginx-06-文件夹自动索引

从零手写实现 nginx-07-大文件下载

从零手写实现 nginx-08-范围查询

从零手写实现 nginx-09-文件压缩

从零手写实现 nginx-10-sendfile 零拷贝

从零手写实现 nginx-11-file+range 合并

从零手写实现 nginx-12-keep-alive 连接复用

从零手写实现 nginx-13-nginx.conf 配置文件介绍

从零手写实现 nginx-14-nginx.conf 和 hocon 格式有关系吗?

从零手写实现 nginx-15-nginx.conf 如何通过 java 解析处理?

从零手写实现 nginx-16-nginx 支持配置多个 server

从零手写实现 nginx-17-nginx 默认配置优化

从零手写实现 nginx-18-nginx 请求头+响应头操作

从零手写实现 nginx-19-nginx cors

从零手写实现 nginx-20-nginx 占位符 placeholder

从零手写实现 nginx-21-nginx modules 模块信息概览

从零手写实现 nginx-22-nginx modules 分模块加载优化

从零手写实现 nginx-23-nginx cookie 的操作处理

从零手写实现 nginx-24-nginx IF 指令

从零手写实现 nginx-25-nginx map 指令

从零手写实现 nginx-26-nginx rewrite 指令

从零手写实现 nginx-27-nginx return 指令

从零手写实现 nginx-28-nginx error_pages 指令

从零手写实现 nginx-29-nginx try_files 指令

从零手写实现 nginx-30-nginx proxy_pass upstream 指令

从零手写实现 nginx-31-nginx load-balance 负载均衡

从零手写实现 nginx-32-nginx load-balance 算法 java 实现

nginx 负载均衡是什么?

Nginx 负载均衡,就像一个聪明的分餐员,帮你把大量订单均匀地分配给不同的大厨,让每个大厨都能忙而不乱,最终让顾客都能快速拿到自己的餐品。

例子

假设你经营了一家非常受欢迎的餐馆,来吃饭的顾客特别多。

如果只有一个大厨来做饭,他很快就会忙不过来,顾客就得等很久。为了提高效率,你雇了好几个大厨,每个大厨都能做相同的菜。

  • 负载均衡器(Load Balancer):Nginx 就像餐馆的一个聪明分餐员,他的工作就是接到订单后,把订单均匀地分给每个大厨。这就叫负载均衡。

具体场景:

  1. 客户请求:很多顾客来点餐(客户端请求)。
  2. Nginx 分发请求:Nginx 分餐员接到订单后,把订单分配给不同的大厨(后端服务器)。
  3. 大厨处理请求:每个大厨根据分配到的订单做菜(处理请求),然后把做好的菜(响应)交给分餐员。
  4. 返回结果:分餐员把菜送到顾客手中(返回响应给客户端)。

举个例子:

http {
    upstream my_backend {
        server 192.168.0.1;
        server 192.168.0.2;
        server 192.168.0.3;
    }

    server {
        listen 80;
        server_name www.example.com;

        location / {
            proxy_pass http://my_backend;
        }
    }
}
  • upstream my_backend:定义了三位大厨的 IP 地址(后端服务器)。
  • proxy_pass http://my_backend:Nginx 分餐员接到顾客的订单后,会把订单均匀地分给这三位大厨处理。

总结

Nginx 负载均衡的目标是通过均匀分配请求,确保每台服务器(大厨)都不至于过载,从而提升整体系统的效率和可靠性。

这样,每个顾客都能更快地得到服务,整个餐馆的运营也更加顺畅。

nginx 支持哪些负载均衡算法?给出对应的例子

Nginx 支持多种负载均衡算法,可以根据不同的需求来选择合适的算法。以下是主要的几种负载均衡算法及其配置示例:

1. 轮询(Round Robin)

这是 Nginx 默认的负载均衡算法。请求依次分配给每个后端服务器,按顺序循环。

upstream my_backend {
    server 192.168.0.1;
    server 192.168.0.2;
    server 192.168.0.3;
}

server {
    listen 80;
    server_name www.example.com;

    location / {
        proxy_pass http://my_backend;
    }
}

2. 权重轮询(Weighted Round Robin)

可以为每个服务器设置权重,权重越高,分配到的请求越多。

upstream my_backend {
    server 192.168.0.1 weight=3;
    server 192.168.0.2 weight=2;
    server 192.168.0.3 weight=1;
}

server {
    listen 80;
    server_name www.example.com;

    location / {
        proxy_pass http://my_backend;
    }
}

3. 最少连接(Least Connections)

将新请求分配给当前活动连接数最少的服务器,适用于请求处理时间不均匀的情况。

upstream my_backend {
    least_conn;
    server 192.168.0.1;
    server 192.168.0.2;
    server 192.168.0.3;
}

server {
    listen 80;
    server_name www.example.com;

    location / {
        proxy_pass http://my_backend;
    }
}

4. IP 哈希(IP Hash)

根据客户端的 IP 地址分配请求,同一 IP 地址的请求会分配到同一台服务器上,适用于需要会话保持的场景。

upstream my_backend {
    ip_hash;
    server 192.168.0.1;
    server 192.168.0.2;
    server 192.168.0.3;
}

server {
    listen 80;
    server_name www.example.com;

    location / {
        proxy_pass http://my_backend;
    }
}

5. 一致性哈希(Hash)

根据用户定义的键(比如 URL、cookie 等)分配请求,确保相同键的请求分配到同一台服务器。

upstream my_backend {
    hash $request_uri;
    server 192.168.0.1;
    server 192.168.0.2;
    server 192.168.0.3;
}

server {
    listen 80;
    server_name www.example.com;

    location / {
        proxy_pass http://my_backend;
    }
}

总结

Nginx 提供了多种负载均衡算法,包括轮询、权重轮询、最少连接、IP 哈希和一致性哈希。

每种算法适用于不同的场景和需求,选择合适的算法可以提升系统的性能和可靠性。

通过配置 upstream 指令和相关参数,可以灵活地实现各种负载均衡策略。

标签:load,实现,31,192.168,server,nginx,手写,backend
From: https://www.cnblogs.com/houbbBlogs/p/18308417

相关文章

  • 题解 P1031 [NOIP2002 提高组] 均分纸牌
    link贪心题中描述每一堆牌只能移动若干张牌到相邻的牌堆上确定了局部最优解必定能推导出全局最优解。易知均分完后,每堆牌的数量都为纸牌总数的平均数\(\mathrm{arg}\)。所以我们可以预处理每堆牌跟\(\mathrm{arg}\)的差距for(inti=1;i<=n;++i)sum+=a[i];......
  • 7、nginx-日志模块的格式-log_format main、access.log(访问服务器记录的日志)
    日志模块的名称:ngx_http_log_module路径:vim/etc/nginx/nginx.conf相关指令:·日志格式:log_format---nginx有非常灵活的日志模式,每个级别的配置可以有各自独立的访问日志、日志格式通过log_format命令定义··语法Syntax:log_formatname[escape=default|json]......
  • 5、nginx-主配置文件解析
    路径:vim/etc/nginx/nginx.conf · CoreModule-核心模块(进程数等):全局/核心块:配置影响nginx全局的指令、一般运行nginx服务器的用户组、nginx进程pid存放的路径、日志存放的路径、配置文件引入、允许生成workerprocess数等CoreModule-核心模块(进程数等)12usern......
  • Nginx、LNMP万字详解
    目录Nginx特点Nginx安装添加Nginx服务Nginx配置文件全局配置HTTP配置状态统计页面Nginx访问控制授权用户授权IP虚拟主机基于域名测试基于IP测试基于端口测试LNAMP解析方式LNMP转发php-fpm解析Nginx代理LAMP解析LNMP部署示例实验环境MariaDB修改密码......
  • centos7 安装nginx
    一.安装必要的依赖yuminstallgcc-c++-yyuminstall-yopensslopenssl-develyuminstall-yzlibzlib-develyuminstall-ypcrepcre-devel二.下载nginx安装包进入usr/local里面创建nginx文件,方便后期删除干净cd/usr/localmkdirnginxcdnginxwget下载安装包w......
  • NC275631 嘤嘤不想求异或喵,NC274492 76与61,NC273546 小红的数组移动
    目录NC275631嘤嘤不想求异或喵题目描述运行代码代码思路ff 函数解释:主函数解释:NC27449276与61题目描述运行代码代码思路函数 countSubsequences 的工作原理:举例说明:NC273546小红的数组移动题目描述运行代码代码思路嘤嘤不想求异或喵题目描述登录—专......
  • P1031 [NOIP2002 提高组] 均分纸牌
    简单贪心题。如果每个数相等时的数为sum,考虑一个数不等于sum,最好的情况通过一次转移使它变为sum。所以按顺序处理,当前数少从后面拿,当前数多向后面扔,中间记录次数即可。考虑正确性,有人会觉得,如果后面的数不够拿成为了负数,需要从更后面拿,就不止一次转移了。其实,如果遇到上述情......
  • Ingress Nginx集成进Skywalking
    注:本文使用的环境为:k3sversionv1.29.5+k3s1IngressNginxcontrollerv1.10.1Skywalking9.7.0-066457bskywalking-nginx-luav0.6.0  本文假设你已经在ingress-nginx命名空间下安装部署了IngressNginxcontroller方案  在介绍方案之前,我们先了解一下相关的背......
  • 代码随想录算法训练营第26天 | 回溯02:39. 组合总和、40.组合总和II、131.分割回文串
    代码随想录算法训练营第26天|回溯02:39.组合总和、40.组合总和II、131.分割回文串组合总和https://leetcode.cn/problems/combination-sum/代码随想录https://programmercarl.com/0039.组合总和.html40.组合总和IIhttps://leetcode.cn/problems/combination-sum-ii/desc......
  • [项目自荐] 交叉编译njs并使用Nginx搭建自由的个人网盘:vList5
    这个博客好久没有打理了,最近才想起来这篇文章是以下5篇文章的组合,希望这个免费的项目能实现他的初衷吧vList5:部署指南vList5.3全面加密,从我做起njs从入门(交叉编译)到入坟(与vList5配对)vList5+njs/moment实用与使用光猫折腾4:为光猫编译armel版本的nginx特色:使用......