6
回答
Nginx TCP 层的缓存定位。
滴滴云服务器,限时包月0.9元,为开发者而生>>>   

自从用Nginx取代了zookeeper做TCP层的负载均衡后,腰不酸了,腿也不疼了。真是个好东西。

于是打算继续用Nginx做TCP层的缓存定位。假设我有:

5个Redis缓存服务器,1000个用户根据ID取模散列到这5个服务器上。(先不考虑Hash一致性)

比如有一个TCP请求ID为980用户数据(TCP的消息格式是自定义的),应该定位到第0个Redis服务器上。该怎么在Nginx上实现这种功能呢?

我感觉得自己写Nginx脚本来搞,毕竟TCP消息格式是自己定义的。本人Nginx新手。

举报
Grrrr
发帖于4年前 6回/681阅
共有6个答案 最后回答: 4年前

引用来自“月影又无痕”的答案

骚年们,你这个需求典型提根据URL参数执行定位某个后端机器,有相关的模块可帮助到你

那么规则就是

hash $request_uri


参考地址:http://wiki.nginx.org/HttpUpstreamRequestHashModule

我可以很负责任的告诉你,你连tcp层是什么,都不明白,就在这乱吓人。tcp是什么?传输控制协议,主要解决数据在不可靠的线路上的可靠传递之问题的。

比网络层还要更低一级。

这一层传输的是数据包,包含ip端口等等信息,你要在tcp层实现,那就相当于要去实现一个linux netfilter网络数据包的拆包、解包、重新封包的操作。

--- 共有 2 条评论 ---
明月照大江你搞歪了~,网络层上面才是传输层,netfilter和libpcap抓的是链路层的包~~。 4年前 回复
Grrrr谢谢你的回答,请你无视我这个白痴的问题。我知道TCP层在HTTP之下,但是在网络IP层之上。 我就是要打算自己在TCP层解包,重组包的(用的google protocol buffer)。将打好的包发给后端的服务端(用netty写的TCP服务器)。我就是想问一下nginx能这么做吗? 4年前 回复

那搞了半天,不还是上升到应用层去了?

这个应该是应用层协议转换的操作,无须拆包、封包这些处理。就像ssh的端口转发,netcat代理一样。

应该是开发一个nginx和netty交互的应用层协议就可了。不就是相当于nginx直接访问memcached, mysql这种模式吗?

--- 共有 1 条评论 ---
Grrrr咱俩说的应用层可能不是一个东西,我一直说的是TCP层。你说的可能是TCP层上的应用。我这个应用比较特别,还真需要解包,要不你怎么知道980的用户资料存在那个redis服务器上?你转发给谁?要是不需要解包,我就不在这里问了。 4年前 回复

没有看楼上几位的说的

url hash

要是不想自己拆包

包的首行写http的试试看

get  /index.html HTTP/1.1\r\n

顶部