使用Linux Virtual Server在MMO游戏中对区域进行负载均衡

时间:2009-08-08 14:01:48

标签: linux virtualization cluster-computing mmo

我是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

4 个答案:

答案 0 :(得分:9)

为了解决您的问题,我们需要了解您是否需要音量或响应,但很难同时获得两者。

第7层负载均衡 - 基于数据的应用程序级别平衡,因此需要将网络数据包的数据内容路由到端点。您可以通过在应用程序级别,服务级别或内核级别实现路由来实现卷(更多用户)。

可伸缩性 - 我假设您的内存,CPU资源和网络带宽不足。

  • 应用程序级别 - 您的应用程序逻辑会收到一个应用程序数据包并进行相应的路由。

  • 服务级别 - 您的系统框架(某种类型的前端服务)接收数据包并通过模块执行路由(考虑自定义apache模块,甚至是网络驱动程序模块 - 比如编写网络过滤器)< / p>

  • 内核级别 - 在网络数据包级别执行路由。

越接近金属,你的反应就越好。我建议使用专用的linux服务器预先执行路由 - 去本机,而不是虚拟。为WAN使用多个或组合网络适配器,为每个端点使用专用适配器(一个+ wan,每个连接的应用服务器各一个)

如果响应时间很重要,那么你需要一个内核/管理员状态解决方案,它会为你节省一些上下文切换,但要注意你需要不惜一切代价限制跳数,并且可以更少,更大的机器和你的服务器更好地服务可扩展性总是有限的。使用KTCPVS存在风险,它很老,没有主动更新。如果您判断它对您有用,那么只要它在系统状态下运行,就考虑写一些类似于网络过滤器的东西。

如果音量很重要但响应时间是次要的,请实现在问题/用户状态下运行的C ++内置的自定义内置高速套接字开关。它是最容易维护的,并且将提供最佳的可扩展性。

您需要构建一些原型来确定最适合您需求的原型。

最后的想法 -

在执行上述任何操作之前,请先确保您已优化游戏设计。你可能知道大部分内容,我在这里列出的是为了所有人的利益。

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

(b)尝试在您的游戏客户端而不是服务器中使用路由逻辑。只需将一个带有区域和IP地址的小表下载到客户端,就可以放弃以上所有内容。

(c)尝试将区域可见性限制为客户,他们应该只知道他们的区域和相邻区域(如果您实施上面的b点)

希望这会有所帮助,对不起,我对KTCPVS不能更具体。

答案 1 :(得分:2)

您尚未指定瓶颈所在。网络流量?磁盘IO? CPU周期?

假设您的意思是第7层负载均衡器并且没有足够的CPU功率,我认为LVS不是最佳选择。我已经使用LVS完成了Web服务器负载平衡,它可以直接使用并且不是很复杂。

但我认为以这种方式负载均衡MMORP需要LVS中的大量额外代码,使用分布在某个多核服务器上的多线程应用程序进行负载平衡可能更容易。但这不是完全可扩展的,这只能让您在不禁止成本增加的情况下使用16个内核。

答案 2 :(得分:0)

像这样的最大问题是当球员接近边界时会发生什么。显然,他们需要能够看到彼此并互相交流,但他们在不同的服务器上。所以你需要一些非常奇特的服务器间通信,有时只是将消息复制到两个服务器。当有人靠近“角落”时,它会变得更加复杂,然后你必须处理4台服务器!

本书Massively Multiplayer Game Development有一章“共享服务器边界的陷阱”,详细介绍了这个问题。

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

答案 3 :(得分:-1)

为什么要将分配逻辑移动到负载均衡器?它是一个不自由的组件,可以破解。看来你的客户非常清楚他们所在的区域。似乎他们可以很好地连接到zone<n>.example.com。然后,您将在DNS级别处理负载平衡。