请教关于socket服务器集群,负载均衡……

.Net技术 码拜 6年前 (2015-05-11) 522次浏览 0个评论
 

小弟有个c# 的sockets项目,sockets服务端提供给客户端实时的数据,类似游戏中的实时数据。
但是,现在估计到如果人数很多,担心服务器扛不住【要求服务器的响应时间是100毫秒内】。
目前是一个服务端,整个系统工作原理是这样:
客户端订阅某个货品的即时数据,服务器保存了所有客户端的socket,根据客户端的订阅,实时的向客户端发送数据,直到客户端取消订阅。
想请教2个问题:
1,如果几百个客户端都订阅用一个货品,现在服务端是for循环一个一个send过去(使用beginSend…)。不知道这样会不会延迟?除了增大带宽想不到别的好办法。
2,考虑到货品本身的信息也很多,所以想增加几台服务器。当A服务器压力大的时候,就让B服务器一起提供服务。
但应该怎样协调这些服务器呢?
目前考虑是:
1)增加一台中转服务器,当接收到客户端请求时候,中转服务器向一台压力不大的服务器请求数据,得到数据后转发给客户端。
但是这样的话,岂不是所有数据都要这个中转服务器来发送,这样中转服务器是否压力大?
是否有办法,当中转服务器选择了一个服务器后,让这个服务器直接向那个客户端发送数据而不必中转?或者当某个服务器压力大的时候,自动转移一部分客户端的socket交给别的服务器去承担?

小弟对做这个负载的问题没有经验,情各位高手不吝指点!
谢谢!

接收请求的应用服务器(或者叫网关服务器),将工作异步交给另一个业务服务器去处理,等工作处理完毕回调时直接把结果发送给客户端,这样你的网关服务器就几乎没做什么耗时的工作。

不是堆砌一个中转服务器!而是“扩展一个业务服务器”。开发软件不要笨拙地总是“推倒重来”,而是要学会对外隐藏内部实现,而仅在内部扩展重构。

实际上许多系统都是这样,把业务服务器拆分到多个不同业务集群。而对外的应用服务器(或者叫网关服务器)仅负责维持稳定的长连接。

找你们架构师或者技术总监来弄吧。

你的想法从头到尾都是挨不上的。

.net 里面作分布式通常出动 wcf ,用socket除非你们的架构、编程功底极强才能够驾驭。
引用 楼主 wwwww112233 的回复:

1,如果几百个客户端都订阅用一个货品,现在服务端是for循环一个一个send过去(使用beginSend…)。不知道这样会不会延迟?除了增大带宽想不到别的好办法。

应该是 BeginSend,而不是 Send。

另外,如果你们真的是连单独的通讯服务都显得“拥挤”,那么可以在客户端做业务负载均衡。许多应用(包括游戏)都是这样,在登录的时候由专门的登录服务器负责为客户端找一个服务器,让这个客户端重新直连那个网关服务器。因此在登录和真正的应用服务之间有一次“跳转”,而不是让登录服务器做应用服务器。

不过,如果你不是做那种互联网草根服务,而是作企业管理信息系统服务,我建议你不要盲目学那些互联网公司的烧钱的所谓架构。那些都不符合一般的企业服务的特点!也不需要学习烧钱做网页服务、高消费运维人员的那种架构。

我觉得如果你只有1000个客户端,不妨扩展带宽、改造硬盘(是用带有SSD的机制)、扩充CPU个数和主频。因为你没有那样一盘散沙似地应用服务扩展需求,你也不可能以做一堆“网页”就能吸引大领导们的注意力,你需要把精力用来支持非常高级、酷炫、性能卓越的类似WFP或者Silverlight之类的应用。

我们很多用户,比如说只有20个真正还在发挥作用的管理信息系统(各种信息“孤岛”),却买了30多台昂贵的服务器,数台价值几十万的负载均衡器,还有无数正版软件,每上一个系统都可能被软件集成商在硬件上上狂宰一笔,而服务器平常的CPU占用率不足2%,只是当作各种文件的垃圾堆积场。这跟互联网运营商不同,上面跑的软件架构也不同。

中转模式的负载均衡,是在应用开销远大于网络开销的时候才采用的分流方案。
而推送一般都能做到O(1)的查询,开销远小于网络转发。

如果你确定你的应用开销比较大,而且没有办法优化。可以提供一台查询服务器,用于获取相对空闲的应用服务器。

没有任何互联网应用能够保证100ms的响应,你能保证的仅仅是服务器对于每个请求的处理时间低于0.00XXms。
异步并不保证响应时间,但是大量并发的情况下应该使用异步模式,而无法考虑响应时间。
带宽的消耗量,与异步还是同步没有关系。如果现在的带宽能满足需求,改变响应模式一般也无需增加带宽。
如果可能,楼主可以试试fastCSharp的TCP调用负载均衡。
可以参考demo.loadBalancingTcpCommand+demo.loadBalancingTcpCommandWeb。
100ms通常是指在一个“千兆局域网”里边使用多个客户端做压力测试访问应用服务器时的结果,而不是指互联网。

而且,当业务比较庞杂(比如说常用业务请求超过300种),特别是各种业务服务真正需要的响应时间不需要在同一个数量级上,比如说针对2个应用服务器可以提供20个业务服务器来部署5个功能不同的业务服务集群,比如说当应用服务器高效率维持tcp长连接时各业务服务器其实是异构的LAMP无状态web服务,应用服务器必须是资源占用很低的并且仅用几十个线程就能维持20万长连接的,因此很自然就“只能”是异步访问业务服务器的。

50分
不过我说过了,如果你是开发企业管理信息系统服务器,不建议盲目地搞多服务器架构。那不但在设计和重构上消耗大量多余累赘的精力,也会带来一堆麻烦的运维(一大堆不同东西的部署、动态更新、启动停止、跟踪机制)问题,最终效率也未必很高。

还不如提高服务器本身的能力,提高服务应用软件本身的能力。

我遇到一个企业多个核心业务服务系统软件开发,老板在2年多之间只投入一个普通程序加一个中专实习生的研发费用,却在最后用“带有不屑的表情”去要求服务系统要拆分程序多个服务器联邦架构,这种要求简直是“高大上”到了坑人的地步。所以也不要盲目道听途说什么“大型互联网公司的架构师”们的忽悠,还是要从最近半年、一年的实际格局出发来进行设计。

2年多之间只投入一个普通程序加一个中专实习生的研发费用  –>  2年多之间只投入一个普通程序员加一个实习生搞所有研发和维护
引用 1 楼 sp1234 的回复:

接收请求的应用服务器(或者叫网关服务器),将工作异步交给另一个业务服务器去处理,等工作处理完毕回调时直接把结果发送给客户端,这样你的网关服务器就几乎没做什么耗时的工作。

不是堆砌一个中转服务器!而是“扩展一个业务服务器”。开发软件不要笨拙地总是“推倒重来”,而是要学会对外隐藏内部实现,而仅在内部扩展重构。

实际上许多系统都是这样,把业务服务器拆分到多个不同业务集群。而对外的应用服务器(或者叫网关服务器)仅负责维持稳定的长连接。

谢谢你的耐心回答!
目前在做一些压力测试和模拟测试,你说得对,先从增加硬件方向解决,不然随便增加服务器成本大不少。如果测试下有问题,也就只能加您说的网关服务器了。

引用 7 楼 sbwwkmyd 的回复:

没有任何互联网应用能够保证100ms的响应,你能保证的仅仅是服务器对于每个请求的处理时间低于0.00XXms。
异步并不保证响应时间,但是大量并发的情况下应该使用异步模式,而无法考虑响应时间。
带宽的消耗量,与异步还是同步没有关系。如果现在的带宽能满足需求,改变响应模式一般也无需增加带宽。

谢谢,100ms是个平均值。目前连接都是基于socket的beginSend … 这些,服务端是基于IOCP的完成端口模式。测试下维持众多客户端连接估计问题不大,现在主要担心延迟问题。

sp兄说的,不管是企业还是个人成长,根据实际,由小做大,由浅到深进阶。
基于LZ的问题 我建议你还是先别谈什么 集群以及负载均衡了..

目前这些你都用不到..

因为你连基本的,可扩展的,稳定的socket服务都没有写好..

甚至连思路都不是很清晰..

所以我建议你还是先从基础入口 比如看看socketasynceventargs以及异步以及线程池什么相关的.

然后写出Demo 测试下承受能力.在来讨论

PS:你那客户端有多少? 如果5W之内的话就别讨论什么集群以及负载均衡了.随便的异步都能支持几万的…

引用 15 楼 diaodiaop 的回复:

基于LZ的问题 我建议你还是先别谈什么 集群以及负载均衡了..

目前这些你都用不到..

因为你连基本的,可扩展的,稳定的socket服务都没有写好..

甚至连思路都不是很清晰..

所以我建议你还是先从基础入口 比如看看socketasynceventargs以及异步以及线程池什么相关的.

然后写出Demo 测试下承受能力.在来讨论

PS:你那客户端有多少? 如果5W之内的话就别讨论什么集群以及负载均衡了.随便的异步都能支持几万的…

呵呵,现在像你这样的人太多了,眼高手低,我这个项目是花了不少钱请的团队做的,里面不乏经验丰富的人,不过他们当时夸口还比不上你,他们跟我说3000并发绝对没问题。不错,做出来后若论只要连接上能通信这样也叫做并发,这有什么用。项目要求每个请求在100ms内服务器要回应,最后的结果100个人集体每隔50ms发送请求,收到服务器回应很多超过300ms,这和服务器挂了还不是一样。

引用 16 楼 wwwww112233 的回复:
Quote: 引用 15 楼 diaodiaop 的回复:

基于LZ的问题 我建议你还是先别谈什么 集群以及负载均衡了..

目前这些你都用不到..

因为你连基本的,可扩展的,稳定的socket服务都没有写好..

甚至连思路都不是很清晰..

所以我建议你还是先从基础入口 比如看看socketasynceventargs以及异步以及线程池什么相关的.

然后写出Demo 测试下承受能力.在来讨论

PS:你那客户端有多少? 如果5W之内的话就别讨论什么集群以及负载均衡了.随便的异步都能支持几万的…

呵呵,现在像你这样的人太多了,眼高手低,我这个项目是花了不少钱请的团队做的,里面不乏经验丰富的人,不过他们当时夸口还比不上你,他们跟我说3000并发绝对没问题。不错,做出来后若论只要连接上能通信这样也叫做并发,这有什么用。项目要求每个请求在100ms内服务器要回应,最后的结果100个人集体每隔50ms发送请求,收到服务器回应很多超过300ms,这和服务器挂了还不是一样。

最后的结果100个人集体每隔50ms发送请求,收到服务器回应很多超过300ms,这和服务器挂了还不是一样。 
这个并发量也太大了,甚至可以说严苛。

楼主这是把网游当单机玩呢?每秒10个请求,有任何必要吗?
而且,你到底是服务器向客户端推送数据,还是客户端主动请求啊,测试的时候,100个人每50ms请求一次,这是闹哪样
你到底是要自己做项目,还是花钱买项目?
花钱买的项目不符合心意,去找你所谓的团队,让他们改进啊
也不知道你请的团队到底有几个人.
随便写了几行代码 用测试工具测试了下..

3000并发间隔50ms效果如下

请教关于socket服务器集群,负载均衡......

当然效果可能不尽人意因为随手玩的

socket对我来说 我很陌生的 初学不到2个月 我想 你所谓的不少钱的团队至少比我个人厉害多了吧.

不如拿测试工具说话如何呢?

引用 19 楼 diaodiaop 的回复:

不如拿测试工具说话如何呢?

楼主的程序,保证去查询数据库了,不是仅仅收到请求就直接应答的模式.

引用 18 楼 Z65443344 的回复:

楼主这是把网游当单机玩呢?每秒10个请求,有任何必要吗?
而且,你到底是服务器向客户端推送数据,还是客户端主动请求啊,测试的时候,100个人每50ms请求一次,这是闹哪样
你到底是要自己做项目,还是花钱买项目?
花钱买的项目不符合心意,去找你所谓的团队,让他们改进啊
也不知道你请的团队到底有几个人.

团队是5个人,当然不可能说5个人都做通信,他们内部自己分工的。
他们已经改进不了了…..
服务器收到数据后经过数据库处理再返回,主要在于他们难以排查或者他们也不愿去找原因,他们认为只要运行不挂就算
完成任务了。
作为我这边来说,如果一台服务器能保证100-300人高效稳定通信,大不了多买几个服务器即可。所以现在询问一下集群。
我个人认可前面sp1234的说法。

引用 19 楼 diaodiaop 的回复:

随便写了几行代码 用测试工具测试了下..

3000并发间隔50ms效果如下

请教关于socket服务器集群,负载均衡......

当然效果可能不尽人意因为随手玩的

socket对我来说 我很陌生的 初学不到2个月 我想 你所谓的不少钱的团队至少比我个人厉害多了吧.

不如拿测试工具说话如何呢?

记得一月前你回帖,你那时连同步异步,队列等都搞不清。如果你一月前开始学到现在,学了2个月我倒是相信,
看来你进步很大。
但是劝你一下,你不要捡个别人现成写好的服务框架就觉得如何如何,借用别人的开源服务可以,但你会发现实际中还有
很多东西不是你那样想当然。

不过我还是很高兴看到你去实测。只是你那样的测试,让我想起我读书的时候老师让我们做的测试一样。

既然你认为我的测试没有说服力,或者说我没有实际在项目中应用我也没办法了,.

就算我说过我用”别人的框架”做了高效的server支持N连接N并发你也不信了..

还是那句话..先做出来.现在讨论那些所谓的”框架”,”架构”都是没用的..

如果连基本的”东西”都没有,上来就数据库集群.服务器集群.复杂均衡 CDN一大堆高端的词语 真的没什么意思.

就好比最近看到一个帖子(忘记时间了),可能LZ连基本的页面都做不出来就想着高并发大数据各种缓存,,

反正我觉得这没什么意思..

另外问下您现在如何测试(模拟)tcp_client做数据收发并发操作?求软件名称

看到你文中说到 你是花大钱找的团队开发的?

我一直认为能做游戏服务器的team都是大神

既然叫团队 既然花钱  他们一定会给你一套完美的解决方案..

你是甲方啊..这点要求还没有…而且你又不用参与编码..这些他们来完成都是分内的事..

难不成你是乙方..

学到了很多,谢谢各位牛人
引用 24 楼 diaodiaop 的回复:

既然你认为我的测试没有说服力,或者说我没有实际在项目中应用我也没办法了,.

就算我说过我用”别人的框架”做了高效的server支持N连接N并发你也不信了..

还是那句话..先做出来.现在讨论那些所谓的”框架”,”架构”都是没用的..

如果连基本的”东西”都没有,上来就数据库集群.服务器集群.复杂均衡 CDN一大堆高端的词语 真的没什么意思.

就好比最近看到一个帖子(忘记时间了),可能LZ连基本的页面都做不出来就想着高并发大数据各种缓存,,

反正我觉得这没什么意思..

另外问下您现在如何测试(模拟)tcp_client做数据收发并发操作?求软件名称

呵呵,loadrunner

引用 25 楼 diaodiaop 的回复:

看到你文中说到 你是花大钱找的团队开发的?

我一直认为能做游戏服务器的team都是大神

既然叫团队 既然花钱  他们一定会给你一套完美的解决方案..

你是甲方啊..这点要求还没有…而且你又不用参与编码..这些他们来完成都是分内的事..

难不成你是乙方..

花大钱是不能说的。
只是我实在烦透了那些夸大其词的人,有的时候浪费点钱也就算了,但误了事却麻烦的多。
为什么对你有点火大,当然主要是我个人的问题,感觉你说话的语气像极了那个公司的宣传那个人。
事情没定的时候,拿出一些之前的案例,什么几千几万并发,5年8年经验,负载、压测,专业美工。
结果到做的时候,我查看了一些代码,东拼西凑,和你现在一样拿着别人开发的现成框架拼凑一下以为好牛逼,
由于平时是自娱自乐,当然发现不了bug,好比你现在测试说5w并发一样。结果实际问题一堆,
不然如你所说我何必来关心编码呢。在socket通信这块,如果不是项目有严苛的要求,很多
小问题小bug你自己或许n年都不知道它的存在。

所以当你上次回帖跟我炫耀什么框架,我都懒得回你。

通信跟供电不一样,拿个万用表测一下电压电流电阻,到底出了什么问题就一清二楚了
通信瓶颈有很多的可能性
从你的描述,最大的可能性是出在数据库通信上
你的socket哪怕能支持上亿人在线,你的数据库能支持上亿用户同时访问吗?
你数据库通信的时候,数据量大不大,SQL语句执行效率高不高,会直接影响查询效率

SQL语句做的太烂,很有可能使100ms能返回的数据,整整30秒都没动静

10分
还有,对于重复数据,是否有缓存的技术
就是给客户端推送数据的时候,其实只去查一次数据库,就可以把同样的数据推送给3000个客户端
而不是每个客户端请求都要去查一遍数据库

如果数据库这里不做优化,哪怕你服务器变成100个服务器构成的集群,你的数据库还是只有一个,那么网络通信这里再牛逼,数据库通信依然是瓶颈所在

还有,如果1台服务器能够支持300用户正常访问(就是你说的100ms之内)
并不是说简单的增加99台服务器,就能支持3万用户正常访问了

你什么都不做,仅仅是把程序copy了99份,那么不同的客户端就必须去访问不同的服务器(IP不一样)
而且数据库还是只有一个,这始终会是瓶颈

至少你要有个负载均衡服务器,还要把数据库也分开成N份,去分别访问

    此贴不错! 学习学习
引用 31 楼 Z65443344 的回复:

还有,如果1台服务器能够支持300用户正常访问(就是你说的100ms之内)
并不是说简单的增加99台服务器,就能支持3万用户正常访问了

你什么都不做,仅仅是把程序copy了99份,那么不同的客户端就必须去访问不同的服务器(IP不一样)
而且数据库还是只有一个,这始终会是瓶颈

至少你要有个负载均衡服务器,还要把数据库也分开成N份,去分别访问

你说得对。很大成分也许是出在数据库上。目前我按前面sp1234说的,增加硬件配置增加带宽。

才看到这个帖子,很受益,不知道博主是怎么解决这个问题的。我QQ1097430564 希望能得到您的回复,因为我最近在看一些集群的资料,但是很少,现在做的一个C/S内网聊天的软件,想考虑做成集群,资料说用MEMCHASHED做集群,不知道怎么解决。希望有大神能够给出思路。
现在我考虑遇到的问题是这样,TCP通信时候我是长连接,如果我多台服务器运行C1想与C2通信,但是C1的消息发给了S1,C2的小心发给了S2,这样怎么实现P2P,有资料说用一个中转服务器只负责监控SESSION状态,请问具体应该怎么实现。
第一次发帖,有点语无伦次,希望大家指证和教导,谢谢!

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明请教关于socket服务器集群,负载均衡……
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!