netty实现的http,tcp协议之后如何做负载均衡
问题背景:
我们的服务是提供数据存储的,数据是硬件采集上报过来的,有的硬件使用tcp协议发送数据,有的是用mqtt协议,有的是用http协议,我们是用netty实现的,现在数据量太大,每秒钟大概有1万条数据上报并存储到我们的Hbase中,现在运行netty的服务器压力很大,我们想做负载均衡,但是真不知道怎么做?
现在的方案是:通过zookeeper去做,但是我完全不知道zookeeper怎么去做复杂均衡?是像ngnix+tomcat那种只要配置就好了 还是 需要自己二次开发借助zookeeper实现与netty的负载均衡?还有没有其他的处理这种情况的负载均衡的方案了?求大神赐教!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(19)
我是这样解决的:haproxy+keepalived。从操作系统级别解决这个问题的
回复
@ahdkk : 请问楼主这种方案的netty集群,是不是服务端只需要写netty的bossGroup,设备端只需要和haproxy建立连接就可以了?不需要zk和nginx等其他技术? netty服务在收到消息后是如何处理的?业务的处理是在handler里直接调用方法处理还是需要传到其他服务中处理?
请问楼主解决这个问题了吗?遇到了和楼主一样的问题
亲 你们是怎么做的既能接收tcp协议的数据,又能接收http协议的数据呢?
基于netty实现的
还是没有看到关于具体方法
你说的那么多私有协议不过应用层的协议,真正需要写底层协议如ip/tcp/udp等协议是很复杂的,而且需要重写协议栈,一般只有最顶尖的公司才最这么底层的。大多数公司只是写定义应用层协议而已,应用层协议都是基于底层协议写,如http底层是tcp协议,相比你们公司写的私有协议,应该也是用tcp的协议,要么基于udp。你们要作负载均衡的话,可以在tcp层或者应用层做,nginx和tomcat都是在应用层做。你们私有协议很多的话,可以考虑tcp的负载均衡。但是这复杂点。
如果简单只做前端的负载均衡,用标准的4层负载均衡方案就可以了。比如LVS,或者云服务提供的。
像MQTT如果要在服务器之间互访,需要做成分布式的,可以参考我这个开源的例子:
https://github.com/longkerdandy/mithqtt
我们准备使用lvs+keepalived,在请求到虚拟主机的时候(ip+端口号)做分发,分发做在tcp这个传输层。我们主机多,所以应用层协议暂时不做负载均衡
。。要简单可简单,要复杂可复杂。简单的,用nginx,nginx的io应该可以达到100k/tps。你们把io服务开多个服务进程处理,用nginx或其他的做分发。
复杂的,设计成分布式系统就可以了(一般涉及自定义的负载均衡和消息集群,在连接上面就做分发,每台服务器负载的请求在接入的时候就做均衡)。这种方案我做过两个项目了,小项目用这样的方式是很繁琐的。
我对网络这一块不是特别了解,你的意思是说我从传输层把请求分发的不同主机之后,应用层的就不用再管了,其实他就已经做到了负载均衡,其实代码这一块也不需要修改。至于应用层是否需要再做负载均衡,就无关紧要了,是这样吧。
私有协议,在Netty上基本上你脱离不了TCP(底层还是Socket)吧。
用lvs,或者haproxy,或者nginx的tcp sream
当时也没多想,就是觉得负载均衡很常见啊,不会难的,谁知道要实现这么多协议,不仅是tcp,还有mqtt,以后还可能会有自定义的一些私有协议,主要难在这里
HAproxy 可以做tcp层面的负载均衡。
题外话,做负载均衡很容易。 难得是当时你做netty项目时候,如果没考虑负载均衡的, 现在才做,代码上可能要做一些改动
主要我们还有一个协议是mqtt的,不仅是tcp,http两种,未来还有可能基于netty开发一些私有的协议,给物联网设备使用,so ngnix 坑定不可以用在我们这里
mqtt比tcp还底层?
回复
我不太熟悉网络,现在大概知道怎么做了
ngnix也可以做TCP的负载