nginx负载均衡策略:ip_hash、url_hash

转发:https://blog.csdn.net/dengjiexian123/article/details/53105918

前言:

目前,许多的web应用,或者web接口,都会在服务器的入口处,使用一个服务器容器来监听端口,然后进行请求转发,例如nginx Apache等。

服务器容器对应整个web服务有着至关重要的作用,包括:可以很好的管理服务进程,进行代理,对请求的预处理,以及负载均衡。

今天要讨论的重点为在服务器集群中,合理使用nginx的hash策略做更有意义的负载均衡。

概要:

当我们的服务是由一台服务器支撑时,就丝毫不存在负载均衡的概念。只有当服务由多台服务器(也就是服务器集群)支撑时,才会使用到负载均衡。

负载均衡顾名思义,是一种策略,用于防止一台服务器过载,而其他服务器闲置情况发生的策略。通过该策略可以使得提供相同服务的服务器负载基本相同。说得直白一点,就是当客户端发起一个请求之后,负载均衡会通过预先设定好的策略将该请求转发给上游的一台服务器进行处理。

如图所示:

负载均衡是一个很成熟的技术,其中对后端服务器进行轮询(默认);通过客户端请求IP进行hash;对后端服务器指定权重等,是较为常见的负载均衡策略。这里不再赘述。

对服务盲目的采用负载均衡策略,是不太合理的。负载均衡默认情况下是轮询策略,这在一些场景下并不高效。

更有意义的负载均衡:

今天讲解的重点是,两种常见的负载均衡hash策略,以及对应的使用场景。

1、ip_hash(通过客户端请求ip进行hash,再通过hash值选择后端server):

当你服务端的一个特定url路径会被同一个用户连续访问时,如果负载均衡策略还是轮询的话,那该用户的多次访问会被打到各台服务器上,这显然并不高效(会建立多次http链接等问题)。甚至考虑一种极端情况,用户需要分片上传文件到服务器下,然后再由服务器将分片合并,这时如果用户的请求到达了不同的服务器,那么分片将存储于不同的服务器目录中,导致无法将分片合并。所以,此类场景可以考虑采用nginx提供的ip_hash策略。既能满足每个用户请求到同一台服务器,又能满足不同用户之间负载均衡。

配置代码如下:

upstream backend{
    ip_hash;
    server 192.168.128.1:8080 ;
    server 192.168.128.2:8080 ;
    server 192.168.128.3:8080 down;
    server 192.168.128.4:8080 down;

}
server {
    listen 8081;
    server_name test.csdn.net;
    root /home/system/test.csdn.net/test;
    location ^~ /Upload/upload {
    proxy_pass http://backend;

    }

}

上述是一个极简的监听8081端口的的nginx服务,其中当请求url 为/Upload/upload时,会走ip_hash策略; upstream是nginx的负载均衡模块,此处,配置了策略为ip_hash,参与负载均衡的机器有四台,其中后两台末尾添加了down关键字,表示下线的意思。

2、url_hash(通过请求url进行hash,再通过hash值选择后端server):

一般来讲,要用到urlhash,是要配合缓存命中来使用。举一个我遇到的实例:有一个服务器集群A,需要对外提供文件下载,由于文件上传量巨大,没法存储到服务器磁盘中,所以用到了第三方云存储来做文件存储。服务器集群A收到客户端请求之后,需要从云存储中下载文件然后返回,为了省去不必要的网络带宽和下载耗时,在服务器集群A上做了一层临时缓存(缓存一个月)。由于是服务器集群,所以同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。在此类场景下,为了使得缓存命中率提高,很适合使用url_hash策略,同一个url(也就是同一个资源请求)会到达同一台机器,一旦缓存住了资源,再此收到请求,就可以从缓存中读取,既减少了带宽,也减少的下载时间。

配置代码如下:

upstream somestream {
    hash $request_uri;
    server 192.168.244.1:8080;
    server 192.168.244.2:8080;
    server 192.168.244.3:8080;
    server 192.168.244.4:8080;

}
server {
    listen 8081 default;
    server_name test.csdn.net;
    charset utf-8;
    location /get {
    proxy_pass http://somestream;

    }  
}

上述同样也是一个极简的监听8081端口的nginx服务,当请求url为/get时,会走url_hash;同样配置了upstream模块,hash $request_uri表明了是按照url规则进行hash策略。

总结:

以上就是本文要介绍的全部内容,本文侧重讲解了ip_hash和url_hash的使用场景和基本配置,另外,在进行nginx server 配置时,可以灵活一些,不同的location采用不同的策略,可以使得服务策略更加的合理。希望此文能为各位带来些许帮助。

`ip_hash`是Nginx的一种负载均衡算法,它基于客户端的IP地址来确定将请求转发给哪个后端服务器。使用`ip_hash`算法,相同IP地址的客户端将始终被分配到同一个后端服务器,这有助于保持会话的一致性。 要配置Nginx使用`ip_hash`算法进行负载均衡,可以按照以下步骤进行: 1. 打开Nginx的配置文件。通常在Linux系统中,配置文件位于`/etc/nginx/nginx.conf`或`/etc/nginx/conf.d/default.conf`。 2. 在`http`块内添加一个`upstream`块,定义要进行负载均衡的服务器列表。示例代码如下: ```nginx http { upstream backend { ip_hash; server backend1.example.com; server backend2.example.com; server backend3.example.com; } ... } ``` 在上面的示例中,我们使用`ip_hash`指令在`upstream`块中启用了IP哈希负载均衡算法,并列出了要进行负载均衡的服务器。 3. 在Nginx的配置文件中,找到你要使用负载均衡的位置(如`location`块),并将其代理到上面定义的`backend`服务器组。示例代码如下: ```nginx http { upstream backend { ip_hash; server backend1.example.com; server backend2.example.com; server backend3.example.com; } server { ... location / { proxy_pass http://backend; } ... } } ``` 在上面的示例中,我们使用`proxy_pass`将请求代理到名为`backend`的服务器组。 4. 保存配置文件并重新加载Nginx配置。在终端中执行以下命令: ```shell sudo nginx -t # 检查配置文件语法是否正确 sudo systemctl reload nginx # 重新加载Nginx配置 ``` 这样配置后,Nginx将使用`ip_hash`算法将请求分发给后端服务器。相同IP地址的客户端将被分配到同一个后端服务器上,从而保持会话的一致性。 请注意,`ip_hash`算法适用于基于客户端IP地址的负载均衡,并且要求Nginx编译时启用了`--with-http_upstream_ip_hash_module`模块。确保你的Nginx版本支持此功能。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值