MST

星途 面试题库

面试题:微服务架构中Nginx如何实现基于权重和健康检查的负载均衡

在一个复杂的微服务架构环境里,部分服务节点性能有差异,需要根据权重分配请求,同时还要保证将请求分配到健康的服务实例上。请详细描述如何利用Nginx来实现这种基于权重和健康检查的负载均衡策略,包括相关配置指令及配置思路。
34.9万 热度难度
后端开发微服务架构

知识考点

AI 面试

面试题答案

一键面试

配置思路

  1. 定义上游服务器组:将所有微服务实例添加到一个上游服务器组中,并为每个实例设置权重。
  2. 健康检查:利用Nginx的健康检查模块(如ngx_http_upstream_module提供的功能)来检测服务实例的健康状态。
  3. 负载均衡策略应用:在HTTP或其他相关上下文中引用上游服务器组,实现基于权重和健康检查的负载均衡。

相关配置指令

  1. upstream指令:定义上游服务器组。

    upstream backend {
        server backend1.example.com weight=5;
        server backend2.example.com weight=3;
        server backend3.example.com weight=2;
    }
    
    • server:指定后端服务器地址。
    • weight:设置服务器权重,权重越高,分配到的请求越多。
  2. 健康检查相关指令(以ngx_http_upstream_module默认健康检查机制为例)

    • Nginx默认会尝试连接后端服务器,如果连接成功则认为服务器健康。在较新版本中也可通过第三方模块如ngx_http_upstream_check_module实现更复杂的健康检查(如HTTP、TCP等协议的详细状态检查)。假设使用默认机制,无需额外配置健康检查指令即可实现基本的健康实例判断。若使用ngx_http_upstream_check_module模块,配置如下:
    upstream backend {
        server backend1.example.com weight=5;
        server backend2.example.com weight=3;
        server backend3.example.com weight=2;
    
        check interval=3000 rise=2 fall=5 timeout=1000 type=http;
        check_http_send "HEAD / HTTP/1.0\r\n\r\n";
        check_http_expect_alive http_2xx http_3xx;
    }
    
    • check:开启健康检查,interval表示检查间隔(单位毫秒),rise表示连续成功多少次认为服务器恢复健康,fall表示连续失败多少次认为服务器不健康,timeout表示检查超时时间(单位毫秒),type表示检查类型,这里是http类型。
    • check_http_send:指定发送的HTTP检查请求内容。
    • check_http_expect_alive:指定认为服务器健康的HTTP响应状态码。
  3. proxy_pass指令:在HTTP上下文中将请求转发到上游服务器组。

    server {
        listen 80;
        server_name your_domain.com;
    
        location / {
            proxy_pass http://backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    
    • proxy_pass:指定将请求转发到名为backend的上游服务器组。
    • 其他proxy_set_header指令用于设置转发请求时的一些HTTP头信息。