使用Linux虚拟服务器来负载均衡MMO游戏中的区域

5
我是一款MMO游戏的开发者,目前我们公司面临一些可扩展性问题,我认为通过合适的游戏世界集群化可以解决这些问题。我不想重复造轮子,因此我认为Linux Virtual Server可能是一个不错的选择,特别是使用一些第7层负载均衡技术。我正在考虑作为负载均衡解决方案的ktcpvs,并想知道它是否是一个合适的选择。主要思想是在专用服务器上运行许多区域(按照我的游戏术语称为“位置”)。当玩家决定去某个特定位置时,负载均衡器会决定哪个区域服务器实际上为玩家提供服务(这就是我需要第7层负载均衡器的原因)。你们对以上所有内容有什么看法?更新:我在LVS用户邮件列表中发布了相同的问题http://marc.info/?l=linux-virtual-server&m=124976265209769&w=2

更新:我还在gamedev.net论坛上开了一个类似的话题http://www.gamedev.net/community/forums/topic.asp?topic_id=544386


有趣,但我认为你会在http://serverfault.com/获得更好的帮助。 - Nifle
2
我知道这个网站,但我认为它更专注于服务器管理而不是编程... - pachanga
听起来你的问题的答案和暴雪是如何解决《魔兽世界》中的这个问题一样。 - Matt Ball
他们是如何做到的?有链接吗?;) - pachanga
4个回答

10
为了回答你的问题,我们需要了解你需要的是容量还是响应速度,但同时获得两者是很困难的。
第七层负载均衡 - 是基于数据应用的负载均衡,在此,网络数据包的数据内容需要被路由到一个终端点。您可以通过在应用程序级别、服务级别或内核级别实现路由来实现容量(更多用户)。
可扩展性 - 我假设您会遇到内存、CPU资源和网络带宽等瓶颈问题。
- 应用程序级 - 您的应用逻辑接收应用程序数据包并进行相应的路由。 - 服务级别 - 您的系统框架(一种前端服务)接收数据包,并通过一个模块执行路由(例如自定义Apache模块,甚至网络驱动程序模块 - 就像编写网络过滤器一样)。 - 内核级别 - 在网络数据包级别上执行路由。
越靠近硬件层级,响应速度就越好。我建议使用专用的Linux服务器来执行路由 - 原生地去做,而不是虚拟化。对于广域网使用多个或团队化的网络适配器,每个端点使用一个专用的适配器(一个以上的广域网,每个连接的应用服务器各一个)。
如果响应时间很重要,那么您需要使用内核/监管状态解决方案,这将节省一些上下文切换,但请注意必须尽可能限制跳数,最好使用较少的、更大的机器,而您的扩展性将始终受到限制。使用KTCPVS存在风险,因为它相当老旧且没有得到积极更新。如果您认为它适合您,那就太棒了;否则,请考虑编写类似于网络过滤器的东西,只要它在系统状态下运行即可。
如果容量很重要,但响应时间次要,实现一个自定义高速套接字交换机,在问题/用户状态下使用C ++构建,这是最易于维护的,并且将提供最佳的可扩展性。
您需要建立一些原型来找出最适合您需求的解决方案。
最后的想法 -
在进行上述任何操作之前,请先确保优化了游戏设计。您可能已经知道其中大部分,我在此列出以造福所有人。

(a) 消息应该适合一个网络数据包,对于大多数家庭路由器来说,少于1500字节。

(b) 尽可能在游戏客户端中处理路由逻辑,而不是服务器。通过向客户端简单下载包含区域和IP地址的小表格,您可以避免上述所有问题。

(c) 尝试通过将区域可见性限制在客户端内来减少负担,这些客户端仅需知道其所在区域和相邻区域(如果您实施了上述b点)。

希望这有所帮助,抱歉我无法就KTCPVS提供更具体的信息。


非常感谢您的详细回复 :) 遗憾的是,stackoverflow 的评论系统很糟糕,我必须将我的回复分成几篇帖子。 - pachanga
是的,我听说KTCPVS已经过时了,有人建议我看看Perdition作为应用级负载均衡的示例。我想知道它是否需要LVS或者可以独立使用(似乎是后者)。我真正喜欢LVS的能力是使用直接路由方案(http://www.linuxvirtualserver.org/VS-DRouting.html),我想知道它是否可以在非LVS服务器上使用... - pachanga
我投票支持这个回答,但是b)点似乎是对drhirsch回答的概括。不管怎样,这是一个好的回答。 - ATorras

2
您没有指定瓶颈在哪里。是网络流量?磁盘IO?CPU周期?
假设您的意思是第7层负载均衡器,并且没有足够的CPU功率,我认为LVS不是最佳选择。我已经使用LVS进行了Web服务器负载平衡,这很简单并且并不复杂。
但是我认为用这种方式负载平衡MMORP需要在LVS中编写大量额外的代码,可能更容易使用分布在一些多核服务器上的多线程应用程序来进行负载平衡。但这并不完全可扩展,这只能让您获得16个内核而没有过高的成本增加。

负载均衡的主要目标是减少CPU使用率并增加冗余,以使游戏服务更具容错性。我需要LVS提供基本的低级基础设施,我不想重新发明轮子(例如LVS / DR模式)。我希望只需在LVS之上实现负载均衡器即可利用它。我还考虑构建自定义负载平衡应用程序,目前正在研究Perdition和HAProxy以获取灵感。 - pachanga
只是一个想法:我认为在解决CPU、RAM、冗余等问题之后,客户端的网络延迟将成为主要问题。当我在线玩游戏时,我真的很讨厌卡顿... - ATorras
这部分可以使用巧妙的内插/外推技巧来解决。 - pachanga

0
像这样的东西中最大的问题是当玩家靠近边界时会发生什么。显然,他们需要能够看到并互动,但他们在不同的服务器上。因此,您需要一些相当花哨的跨服务器通信,有时只需将消息复制到两个服务器。当有人靠近“角落”时,情况可能变得更加复杂,然后您必须处理4个服务器!
书籍《 Massively Multiplayer Game Development》中有一章节关于“共享服务器边界的陷阱”,详细介绍了这个问题。

我之前没有听说过Linux虚拟服务器,所以我不明白它的作用。我认为您实际的服务器应用程序需要支持特定于游戏的负载均衡,而不是尝试运行一个集群并假设它会自动知道如何拆分应用程序(事实上它不会)。如果我是您,我会编写服务器程序来处理自己的领土,并连接周围的领土,然后设计一种服务器间通信协议来传递这些消息(“有一个玩家来了,我要开始告诉你关于他的信息!”“请确保告诉我我们边界附近的消息”,“好了,这个玩家已经离开我的领土进入你的领土了,这里是他的详细数据”等等)。我认为这比仅运行不同版本的Linux并假设您将获得自动负载平衡要复杂一些。


a. 我的游戏世界并不是无缝的,所以我不需要处理像描述中那样复杂的情况(是的,我已经阅读了 MMGD 1 和 2)。 b. 请再次阅读我的第一篇帖子,我并不是假设 LVS 会为我创造奇迹。我真正需要的是在 LVS 下工作的第 7 级负载平衡的工作示例。Perdition(www.vergenet.net/linux/perdition)似乎就是这样的一个例子。 - pachanga
很抱歉,我想我可能误解了重点... 我在谷歌上找不到关于“7级负载均衡”的太多信息,而且我也不完全理解应用程序如何编写以利用KTCPVS或Linux虚拟服务器。我想我需要更深入地了解它。很抱歉我无法提供帮助! - Ricket

-1
为什么要将分发逻辑移动到负载均衡器上?它是一个不免费且可能会出现故障的组件。看起来你的客户很清楚他们在哪个区域。他们似乎可以连接到zone<n>.example.com。然后你可以在DNS级别处理负载平衡。

谢谢你的想法,但我不认为它适合我。 首先,我真的不想将这个逻辑硬编码到客户端中。理想情况下,我希望区域切换对客户端完全透明。 其次,在某个区域服务器失败的情况下,我希望负载均衡器将用户重定向到其中一个最少负载的区域服务器,该服务器将在一段时间内扮演缺失区域服务器的角色。同样,这个逻辑也不应该在客户端中。 至于负载均衡器成为可能故障点的问题,我认为可以使用心跳配对第二个负载均衡器来解决。 - pachanga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接