好的,所以这是我的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;
}
问题是,我该如何:
答案 0 :(得分:0)
我认为 set_hashed_upstream 的目的是确保特定的 $ memc_key 会一直触及特定的后端 - 每个对象只会被缓存一次,它是自己的服务器。这意味着您可能不希望对它们进行加权:您希望特定键始终命中相同的后端 - 否则多个后端将必须保存同一对象的副本。
也就是说,如果它不是问题,你仍然想要均匀分配 - 你最好使用带有ip_hash或循环法的多个服务器的单个上游。从长远来看,可能意味着所有对象都缓存在每个服务器上。
好的,如果你想更进一步,有一种稍微复杂的方法来使用你自己的代码控制哈希分配。您可以编写一个哈希函数,该函数在确保特定哈希将始终命中同一服务器的同时,将创建哈希的加权分布,从而确保某些服务器比其他服务器更受欢迎。这里如何将它集成到nginx配置中:
免责声明:我自己没有尝试过。
为相应上游的每台服务器分别设置 max_fails 和 fail_timeout (但不是权重)参数,即:
upstream sun {
server 127.0.0.1:11211 max_fails=2 fail_timeout=10;
}
配置HttpLuaModule
http://wiki.nginx.org/HttpLuaModule
使用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;
}
然后,您可以编写一个哈希函数,它将返回一个合适的后端。您将不得不定义一个算法来将权重纳入一个帐户(例如,返回一个后端比另一个后端多5倍)。然后,您可以使用ngx.arg [i]访问参数。
基于算法的简单示例:
(这只是为了给你一个大致的想法)
这应该可以满足您的需求。
灵感来源: