5

我是 MMO 游戏的开发人员,目前我们在我的公司面临一些可扩展性问题,我认为这些问题可以通过游戏世界的适当集群来解决。

我真的不想重新发明轮子,这就是为什么我认为 Linux 虚拟服务器可能是一个不错的选择,尤其是使用一些 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

4 回答 4

10

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

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

可扩展性——我假设你的内存、CPU 资源和网络带宽都用完了。

  • 应用程序级别 - 您的应用程序逻辑接收应用程序数据包并相应地路由。

  • 服务级别 - 您的系统框架(某种前端服务)接收数据包并通过模块 - 执行路由(想想自定义 apache 模块,甚至网络驱动程序模块 - 就像编写网络过滤器)

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

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

如果响应时间很重要,那么您需要一个内核/主管状态解决方案,它将为您节省一些上下文切换,但请注意,您需要不惜一切代价限制跃点,并且最好由更少、更大的机器提供服务,并且您的可扩展性将始终受到限制。使用 KTCPVS 是有风险的,它已经很老了,而且没有主动更新。如果你认为它对你很有用,否则考虑编写类似于网络过滤器的东西,只要它在系统状态下运行。

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

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

最后的想法 -

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

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

(b) 尝试在您的游戏客户端而不是您的服务器中匹配路由逻辑。将带有区域和 IP 地址的小表格简单地下载到客户端将允许您放弃上述所有内容。

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

希望这会有所帮助,抱歉,我不能更具体地了解 KTCPVS。

于 2009-08-12T20:33:22.510 回答
2

您还没有指定瓶颈在哪里。网络流量?磁盘IO?CPU 周期?

假设您的意思是第 7 层负载均衡器并且没有足够的 CPU 能力,我认为 LVS 不是最佳选择。我已经用 LVS 完成了 Web 服务器负载平衡,它工作简单,并不复杂。

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

于 2009-08-12T16:19:49.903 回答
0

此类事件中最大的问题是当玩家靠近边界时会发生什么。显然,他们需要能够看到并相互交互,但他们在不同的服务器上。所以你需要一些漂亮的服务器间通信,有时只是将消息复制到两个服务器。当有人靠近“角落”时,情况会变得更加复杂,然后您必须处理 4 台服务器!

《大型多人游戏开发》这本书有一章是关于“共享服务器边界的陷阱”的,其中详细介绍了这个问题。

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

于 2009-08-10T14:07:44.957 回答
-1

为什么要将分配逻辑移至负载均衡器?它是一个不是免费的并且可能会损坏的组件。您的客户似乎很清楚他们所在的区域。似乎他们可以很好地连接到zone<n>.example.com. 然后,您将在 DNS 级别处理负载平衡。

于 2009-08-12T13:32:48.530 回答