Nginx是否通过一致哈希来尊重权重属性?

时间:2017-02-02 13:43:00

标签: nginx consistent-hashing

更具体一点,这会有效吗?

upstream backend {
    hash $request_uri consistent;

    server backend1.example.com weight=1;
    server backend2.example.com weight=2;
}

backend2.example.com会获得两倍的流量吗?

此外,如果更改了重量或将其他服务器添加到混音中会发生什么。 “只有几个键会重新映射”仍然会持有吗?

  

hash指令的可选一致参数启用ketama一致哈希负载平衡。根据用户定义的散列键值,请求将在所有上游服务器中均匀分布。如果在上游组中添加或删除上游服务器,则只会重新映射少量密钥,以便在负载平衡缓存服务器和其他累积状态的应用程序时最大限度地减少缓存未命中。

来自https://www.nginx.com/resources/admin-guide/load-balancer/

1 个答案:

答案 0 :(得分:0)

在此配置中,一致哈希 weight 更重要。

换句话说,如果一个上游同时显示权重和一致的哈希,那么主要问题将是一致哈希

然后根据重量将哈希散布到服务器上。

upstream consistent_test {
    server consistent_test.example.ru:80 weight=90;
    server consistent_test2.example.ru:80 weight=10;
    hash $arg_consistent consistent;
}

实验

1)默认状态

上游balancer_test {

hash $arg_someid consistent;
server server1.example.ru:8080;
server server2.example.ru:8080;
server server3.example.ru:8080 down;

}

请求散列固定在主机上:

server1.example.ru ==> 535

server2.example.ru ==> 462

server3.example.ru ==> 0

2)第一步:启用节点并设置权重

上游balancer_test {

hash $api_sessionid consistent;
server server1.example.ru:8080 weight=250;
server server2.example.ru:8080 weight=500;
server server3.example.ru:8080 weight=250;

}

请求散列固定在主机上:

server1.example.ru:8080 ==> 263

server2.example.ru:8080 ==> 473

server3.example.ru:8080 ==> 254

3)第二步:完成流量转换并禁用旧节点

上游balancer_test {

hash $api_sessionid consistent;
server1.example.ru:8080 down;
server2.example.ru:8080;
server3.example.ru:8080;

}

请求散列固定在主机上:

server1.example.ru:8080 ==> 0

server2.example.ru:8080 ==> 533

server3.example.ru:8080 ==> 464

server1.example.ru

1)之前= 463

2)在step_2 = 533

3)哈希匹配= 306

server2.example.ru

1)之前= 536

2)在step_1 = 263

3)哈希匹配= 148

server3.example.ru

1)之前= 255

2)步骤1 = 464

3)哈希匹配= 115