• 【Nginx】负载均衡


    一、工作原理

    nginx的高性能主要是因为

    1、事件驱动架构

    Nginx采用事件驱动的非阻塞方式处理请求,主要利用了操作系统提供的多路复用机制,通过异步非阻塞的方式处理大量并发请求,减少了线程切换和资源消耗,提高了并发处理能力和系统的稳定性。

    2、事件循环

    事件循环机制是核心的工作模式之一。它通过单线程的方式处理事件,包括等待事件、处理事件和继续循环。在等待事件时,Nginx并不会像传统多线程模型那样阻塞等待,而是通过事件通知机制在有事件发生时再进行处理,这样可以充分利用CPU资源,提升系统的效率和性能。

    3、多进程

    Nginx可以通过配置文件中的worker_processes选项来启动多个进程来处理请求。每个进程都有自己独立的事件循环和资源管理,进程之间没有共享状态,这种设计可以避免单点故障,提高系统的可靠性和稳定性。并且Nginx的多进程模型使得它能够更好地利用多核CPU,通过并行处理请求来提高整体的处理能力。

    二、反向代理

    server {
        listen 80;  
        server_name example.com;  
        root /root/build/;#静态资源地址
        index index.html;    
    
        location /api/server/ {
            proxy_pass http://localhost:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For
        }
    }
    

    例如在这个例子中,设置了index目录和静态资源目录。并且设置了域名访问。很大了保证了服务器的安全性。在下面的反向代理配置中,通过正则表达式将/api/server/开头的映射到http://localhost:8080这个地址。

    whiteboard_exported_image.png

    三、负载均衡

    负载均衡也就是通过反向代理到不同的服务,保证服务的可用性。多用于在分布式系统中。例如某个系统分布在100个服务器上,当某几台服务器崩溃时,会代理到其他服务器,不会影响系统的运行。更好的实现横向扩展。

    例如一个简单的get请求代码

    import tornado.ioloop
    import tornado.web
    
    class MainHandler(tornado.web.RequestHandler):
        def get(self):
            self.write("Hello, Tornado!") 
    
    def make_app():
        return tornado.web.Application([
            (r"/", MainHandler),
        ])
    
    if __name__ == "__main__":
        app = make_app()
        app.listen(8888) 
        print("Server running on http://localhost:8888")
        tornado.ioloop.IOLoop.current().start()  
    

    具体的负载均衡算法

    1、轮询

    nginx的均衡默认算法:直接基于事件循环。类似于排队,一个一个来,例如第一个请求分发给第一个服务,第二个就分发给第二个服务,以此类推。缺点:没有具体情况具体分析,某些情况下的请求会导致负载很高。

    upstream tornado_servers {
        server 192.168.31.158:8888;
        server localhost:8888;
    }
    
    server {
        listen 80;
        server_name 192.168.62.132; 
    
        location / {
            proxy_pass http://tornado_servers;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
        location /nginx_status {
        stub_status on;
        access_log off;
        allow 192.168.62.0/24;  # 允许访问的IP地址,根据需要调整
        deny all;         # 禁止其他IP地址访问
        }    
    }
    

    将上述访问运行在两个不同的服务器上,默认的轮询会每个服务器都请求一次,除非有一台掉线,否则nginx会均分请求。

    下面行的localhost块b表示新的匹配规则,用于查看nginx当前的连接数和请求统计信息。

    server accepts handled requests

    Active connections: 1

    表示当前活跃的连接数,即正在与Nginx服务器建立通信的客户端连接数量。

    server accepts handled requests

    accepts: 表示Nginx已经接受的连接总数。

    handled: 表示Nginx已经处理的连接总数。

    requests: 表示Nginx已经处理的请求总数。

    Reading: 0 Writing: 1 Waiting: 0

    Reading: 正在读取客户端请求的数量。

    Writing: 正在向客户端发送响应的数量。

    Waiting: 当前空闲的客户端连接数,等待处理请求

    2、最少连接

    会将请求分配给连接最少的服务,保证系统的整体性能。缺点是没有具体情况具体分析,没有考虑负载情况,不是请求越多负载越大。

    upstream tornado_servers {
        least_conn;  # 使用最少连接数算法
        server 192.168.31.158:8888;
        server localhost:8888;
    }
    
    server {
        listen 80;
        server_name 192.168.62.132;  
    
        location / {
            proxy_pass http://tornado_servers;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
    

    least_conn字段表示使用最少连接算法。

    3、IP哈希

    通过客户端的IP地址的哈希值分配给特定的服务器,如果下一次请求的IP哈希值与之前一样,那么依然会请求到之前的服务器。如果不一样那么为新的服务器创建新的哈希值。这样避免了服务器的切换开销,保持了会话的一致性。但是这样的缺点是同一个客户端的请求无法做到负载均衡。

    upstream tornado_servers {
        ip_hash;  # 使用IP哈希算法
        server 192.168.31.158:8888;
        server localhost:8888;
    }
    
    server {
        listen 80;
        server_name 192.168.62.132;  
    
        location / {
            proxy_pass http://tornado_servers;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
        location /nginx_status {
        stub_status on;
        access_log off;
        allow 192.168.62.0/24;  # 允许访问的IP地址,根据需要调整
        deny all;         # 禁止其他IP地址访问
        }
    }
    

    4、加权轮询

    在轮询的基础上为每个服务器加上一个权重值,每个服务器的承受连接数量。在轮询的情况下再次考虑权重值。例如两台服务器,服务器A、B的权重分别为5,3轮询流程为:

    第一次请求:服务器A处理请求

    第二次请求:服务器B处理请求

    第三次请求:服务器A处理请求

    第四次请求:服务器A处理请求

    第五次请求:服务器A处理请求

    第六次请求:服务器B处理请求

    upstream tornado_servers {
        server 192.168.31.158:8888 weight=5;
        server localhost:8888 weight=3;
    }
    
    server {
        listen 80;
        server_name 192.168.62.132; 
    
        location / {
            proxy_pass http://tornado_servers;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
        location /nginx_status {
        stub_status on;
        access_log off;
        allow 192.168.62.0/24;  # 允许访问的IP地址,根据需要调整
        deny all;         # 禁止其他IP地址访问
        }
    }
    

    5、加权最小连接

    在最小连接的算法基础上,加上权重值。这时候需要根据连接数量和权重值来评估目标服务器。

    例如服务器A、B、C。权重值分别为5、3、2。连接数分别为10、5、3.

    计算加权连接数:

    服务器A:10/5=2

    服务器B:5/3=1.67

    服务器C:3/2=1.5

    那么根据加权连接数,最小加权连接数为1.5。那么会代理到服务器C

    upstream tornado_servers {
        least_conn;  # 使用最少连接数算法
        server 192.168.31.158:8888 weight=5;
        server localhost:8888 weight=3;
    }
    
    server {
        listen 80;
        server_name 192.168.62.132; 
    
        location / {
            proxy_pass http://tornado_servers;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
        location /nginx_status {
        stub_status on;
        access_log off;
        allow 192.168.62.0/24;  # 允许访问的IP地址,根据需要调整
        deny all;         # 禁止其他IP地址访问
        }
    }
    

    四、总结

    反向代理就像是位于用户和真实服务器之间的一座桥梁,它接收用户的请求并将其转发到后端的多台服务器上。这种配置不仅隐藏了真实服务器的信息,还能提供安全性和负载均衡功能。负载均衡通过智能地分发请求到不同的服务器,确保每台服务器的负载相对平衡,从而提高整体性能和可靠性。这种结合能够有效地处理高并发请求,保证系统在压力下仍能保持稳定运行。

  • 相关阅读:
    坑爹的jack-server
    [数据集][图像分类]茶叶叶子病害分类数据集304张4类别
    遥感数据
    1、== 和 equals 的区别?
    (附源码)ssm跨平台教学系统 毕业设计 280843
    什么品牌洗地机性价比高?四大出色的王牌机型力荐
    文本分类从入门到精通各种模型的学习——Jieba分词。
    Codeforces Round 886 (Div. 4)F. We Were Both Children(调和级数、埃氏筛)
    Fragment切换的方式介绍和一些问题的解决
    [CISCN2019 华北赛区 Day1 Web1]Dropbox 1
  • 原文地址:https://www.cnblogs.com/changwan/p/18246095