Hello!
2012/10/16 drings.liu:
> 有三台redis服务器,通过使用HttpRedis2Module模块来操作redis,
> upstream redis_cluster {
> server 192.168.2.10:6379;
> server 192.168.2.11:6379;
> server 192.168.2.12:6379;
> keepalive 2048 single;
> }
> location /redis_set {
> set_unescape_uri $key $arg_key;
> set_unescape_uri $val $arg_val;
> redis2_query set $key $val;
> redis2_pass redis_pool;
> }
>
> location /redis_get {
> redis2_next_upstream error timeout invalid_response;
> set_unescape_uri $key $arg_key;
> redis2_query get $key;
> redis2_pass redis_pool;
> }
>
> 这样子的话,通过redis_set只能在三中服务器中的一台上插入key,取key值的时候不知道在哪台服务器取。需要怎么写才可以达到要求key在哪台服务器上插入就在哪台服务器上取值呢?
>
Nginx 的 upstream 配置块默认就是 round-robin 轮询调度,无论是你是使用 ngx_redis2 模块还是更常用的
ngx_proxy 模块访问都是一样的。
如果你想自己计算访问后端的话,可以为每一台 server 都定义一个 upstream 名字,例如:
upstream redis_1 {
server 192.168.2.10:6379;
keepalive 2048 single;
}
upstream redis_2 {
server 192.168.2.11:6379;
keepalive 2048 single;
}
upstream redis_3 {
server 192.168.2.12:6379;
keepalive 2048 single;
}
然后在你的 location 里面使用 ngx_set_misc 模块提供的 set_hashed_upstream 配置指令按某个
nginx 变量对这三个 upstream 的名字进行哈希,最后再把 nginx 变量传递给 redis_pass 指令作为目标。
具体细节可以参见 ngx_srcache 模块文档中的这个例子:
http://wiki.nginx.org/HttpSRCacheModule#Distributed_Memcached_Caching
这个例子虽然讨论的是 ngx_memc 模块,但做法对于 ngx_redis2 也是适用的。
如果你需要更高的灵活度,可以考虑直接使用 ngx_lua 模块和 lua-resty-redis 库来替换 ngx_redis2:
http://wiki.nginx.org/HttpLuaModule
https://github.com/agentzh/lua-resty-redis#name
Best regards,
-agentzh