nginx ustream列表服务器权重

时间:2014-05-22 06:56:06

标签: nginx

好的,所以这是我的Conf:

upstream sun {
    server 127.0.0.1:11211;
}

upstream moon {
    server 127.0.0.2:11211;
}

upstream_list universe sun moon;
.... more lines ...
location = /memc {
        internal;

        set $memc_key $query_string;
        set_hashed_upstream $backend universe $memc_key;
        set $memc_exptime 86400; # in seconds
        memc_pass $backend;
    }

问题是,我该如何:

  1. 为上游分配权重?我知道我可以在上游服务器中分配权重,但是如何为上游服务器分配权重?
  2. 分配max_fails和fail_timeout ???

1 个答案:

答案 0 :(得分:0)

我认为 set_hashed_upstream 的目的是确保特定的 $ memc_key 会一直触及特定的后端 - 每个对象只会被缓存一次,它是自己的服务器。这意味着您可能不希望对它们进行加权:您希望特定键始终命中相同的后端 - 否则多个后端将必须保存同一​​对象的副本。

也就是说,如果它不是问题,你仍然想要均匀分配 - 你最好使用带有ip_hash或循环法的多个服务器的单个上游。从长远来看,可能意味着所有对象都缓存在每个服务器上。

好的,如果你想更进一步,有一种稍微复杂的方法来使用你自己的代码控制哈希分配。您可以编写一个哈希函数,该函数在确保特定哈希将始终命中同一服务器的同时,将创建哈希的加权分布,从而确保某些服务器比其他服务器更受欢迎。这里如何将它集成到nginx配置中:

免责声明:我自己没有尝试过。

  1. 为相应上游的每台服务器分别设置 max_fails fail_timeout (但不是权重)参数,即:

     upstream sun {
         server 127.0.0.1:11211 max_fails=2 fail_timeout=10;
     }
    
  2. 配置HttpLuaModule

  3. http://wiki.nginx.org/HttpLuaModule

    1. 使用lua脚本配置后端选择。

      location = /memc {
              internal;
      
              set $memc_key $query_string;
              set $memc_exptime 86400; # in seconds
              set $upstream_list="sun moon"
              set $upstream_weights="5 10"
              set_by_lua_file $backend "conf/hash.lua" $memc_key $upstream_list $upstream_wieghts;
              memc_pass $backend;
      }
      
    2. 然后,您可以编写一个哈希函数,它将返回一个合适的后端。您将不得不定义一个算法来将权重纳入一个帐户(例如,返回一个后端比另一个后端多5倍)。然后,您可以使用ngx.arg [i]访问参数。

    3. 基于算法的简单示例:

      • 假设memc_key介于1和10之间,
      • 如果包含1到6之间 - 返回第一个服务器(权重6)
      • 如果包含7到10之间 - 返回第二台服务器(重量4)

      (这只是为了给你一个大致的想法)

      这应该可以满足您的需求。

      灵感来源:

      http://agentzh.org/misc/slides/nginx-state-of-the-art/#69