redis cluster 集群客户端nignx proxy

753 views
Skip to first unread message

Lucien Li

unread,
Jul 14, 2015, 9:39:13 PM7/14/15
to open...@googlegroups.com
Hi,All
        目前想针对redis cluster 3.0 做一个集群客户端,想利用nginx的高效epoll网络模型,自己开个一个module

1.客户端是http请求过来,我开发一个nginx module,在启动nginx的时候会把slot->node 槽信息以及redis节点信息都加载到内存中。
槽信息对应节点信息从redis cluster中拉取过来。

2.客户端请求过来的我会去解析相应redis的指令,计算相应的crc16(key) 计算slot,然后从内存中找到slot对应的节点信息

3.当我们找到这个key所在的slot,以及对应的节点信息的时候, 把相应的请求转换为redis协议的格式,然后开会了一个nginx upstream模块, 把请求发送到对应节点的后端服务器(redis)

问题1: node 对应1-500 这种一对多的方式,在nginx里面怎么存储,不知道大家有好的方式吗?
问题2: 大家有这样的经验都可以分享下,或者建议都可以说说,感谢了


DeJiang Zhu

unread,
Jul 14, 2015, 11:19:28 PM7/14/15
to open...@googlegroups.com
貌似做成 lua-resty-redis-cluster 这种纯 lua 的更容易实现,也更好维护呢 (slot 信息做到 worker 内共享应该足够了)

前段时间看了写 redis-cluster,后续有想法实现一个 resty-redis-cluster

--
--
邮件来自列表“openresty”,专用于技术讨论!
订阅: 请发空白邮件到 openresty...@googlegroups.com
发言: 请发邮件到 open...@googlegroups.com
退订: 请发邮件至 openresty+...@googlegroups.com
归档: http://groups.google.com/group/openresty
官网: http://openresty.org/
仓库: https://github.com/agentzh/ngx_openresty
教程: http://openresty.org/download/agentzh-nginx-tutorials-zhcn.html

liuwei

unread,
Jul 14, 2015, 11:26:37 PM7/14/15
to open...@googlegroups.com
我看到这里有一个redis cluster的pull request,自己拿来用了一下,目前用起来好像是还没有出问题,不知道春哥是因为工作忙还是别的什么原因一直没有接受这个pull request。
https://github.com/openresty/lua-resty-redis/pull/45

这种事貌似用C去写nginx模块是比较费劲的,坑的也比较多,lua应该是高效安全的解决方案吧。

Yichun Zhang (agentzh)

unread,
Jul 15, 2015, 12:02:43 PM7/15/15
to openresty
Hello!

2015-07-15 11:25 GMT+08:00 liuwei:
> 我看到这里有一个redis cluster的pull request,自己拿来用了一下,目前用起来好像是还没有出问题,不知道春哥是因为工作忙还是别的什么原因一直没有接受这个pull request。
> https://github.com/openresty/lua-resty-redis/pull/45
>

因为我其实一直希望这种东西实现为一个独立的上层库,可以在内部调用 lua-resty-redis 库。集群方面的逻辑我觉得真没必要塞在
lua-resty-redis 这个基础库里面 :)

> 这种事貌似用C去写nginx模块是比较费劲的,坑的也比较多,lua应该是高效安全的解决方案吧。
>

作为同时实现过 ngx_redis2 这个 nginx C 模块以及 lua-resty-redis 这个 Lua 库的人,我表示完全同意 :)

Regards,
-agentzh

Lucien Li

unread,
Jul 16, 2015, 1:18:41 AM7/16/15
to open...@googlegroups.com
可能会遇到很多问题,例如:
我要根据请求的信息,来动态的计算upstream后端服务器ip!  不过这个可以参考upstream_hash
还有就是我upstream 的ip列表都是动态的在内存中添加进去的,当我修改这ip列表数量,upstream的ngx_http_upstream_srv_conf_t 还得从新分配

我尝试着做着看看


在 2015年7月16日星期四 UTC+8上午12:02:43,agentzh写道:

Lucien Li

unread,
Jul 16, 2015, 1:31:10 AM7/16/15
to open...@googlegroups.com
hi
    章老师, 假如我要根据请求的信息,例如post的数据来动态的计算后端服务器的ip:port,然后再让upstream 去这个ip:port请求
是不是得 参考这个nginx_upstream_hash 普通的upstream模块,upstream的ip列表是提前配置好的,而我是根据请求的信息来动态计算的
例如:

问题1:post请求里面的key   crc16(key) % 32648  得到slotid, 然后根据slot_id去内存(启动的时候把slot_id对应node_id加载到内存中的)里面找对应的node_id(ip:port)
然后让upstream去node_id请求 ,这种貌似有些麻烦,普通的upstream模块无法实现的吧?

问题2:upstream ip列表我会动态的去增加或者减少,  这样在不重启nginx的能很平滑的去修改内存中的数据吗? 

以前只是做过简单upstream模块,感觉里面多少有些麻烦,希望春哥,帮忙解答下。
非常感谢春哥的回复。
 



在 2015年7月16日星期四 UTC+8上午12:02:43,agentzh写道:
Hello!

Yichun Zhang (agentzh)

unread,
Jul 16, 2015, 10:59:29 PM7/16/15
to openresty
Hello!

2015-07-16 13:18 GMT+08:00 Lucien Li:
> 可能会遇到很多问题,例如:
> 我要根据请求的信息,来动态的计算upstream后端服务器ip!

这个对于纯 Lua 的解决方案实在是太简单了,呵呵。事实上,我已经在 ngx_lua 模块的一个私有分支里面实现了
balancer_by_lua 指令 [1],从而可以用 Lua 来定义纯动态的 upstream balancer,直接供
ngx_proxy、ngx_fastcgi 这些经典的 upstream 模块使用。

> 不过这个可以参考upstream_hash
> 还有就是我upstream
> 的ip列表都是动态的在内存中添加进去的,当我修改这ip列表数量,upstream的ngx_http_upstream_srv_conf_t 还得从新分配
>

以我愚见,用 C 做比较复杂的 balancer 是自找苦吃呀,呵呵。

Regards,
-agentzh

[1] 这个特性不久后将开源,成为主线 ngx_lua 的一部分。

Lucien Li

unread,
Jul 22, 2015, 12:55:32 AM7/22/15
to openresty
感谢章老师的回复, 期待您的开源~ 

在 2015年7月17日星期五 UTC+8上午10:59:29,agentzh写道:

jzh...@gmail.com

unread,
Mar 31, 2017, 11:16:47 PM3/31/17
to openresty, stup...@126.com
这个提交支持密码范围不, 如何使用?

在 2015年7月15日星期三 UTC+8上午11:26:37,liuwei写道:

Tao Shuai

unread,
Apr 3, 2018, 4:45:45 AM4/3/18
to openresty
老师你好,请问一下现在官方有支持redis cluster连接的库了吗?


在 2015年7月16日星期四 UTC+8上午12:02:43,agentzh写道:
Hello!
Reply all
Reply to author
Forward
0 new messages