使用数据库的分布式C ++游戏服务器


11

我的基于C ++回合的游戏服务器(使用数据库)不能抵御当前平均客户端(玩家)数量,因此我想将其扩展到多个(超过一个)数量的计算机和数据库,而所有客户端仍将保留在其中一个游戏世界(服务器必须相互通信并使用多个数据库)。

是否有一些教程/书籍/通用标准解释了如何以最佳方式做到这一点?

Answers:


8

“保留在单个游戏世界中”的MMO术语是单个碎片在线EVE是唯一尝试将每个玩家塞入单个碎片的大型MMO。

幸运的是,他们发表了一篇非常有趣的文章,介绍了如何进行。


(来源:gamasutra.com

坏消息。您一般无法在线应用EVE的技术。他们的解决方案绝对适合其特定类型和实现。
注意:对于EVE Online的所有超级单片网络,它们都使用一个数据库。他们无法为分布式数据库设计可扩展,一致,适度实时的解决方案。

无论哪种方式,阅读它们的工作方式都应该有助于您设计自己的解决方案。但是要当心,您正在尝试解决一个非常困难的问题。

建议不要先分发您的游戏服务器,而是先探索其他途径。

  • 配置您的游戏服务器。
    • 优化服务器代码,以在出现问题时降低CPU负担。
    • 优化客户端和服务器之间的通信协议,以减少网络聊天。
  • 优化游戏玩家服务器与数据库的通信。
    • 运行查询优化器,然后进行适当的更改。
    • 将数据库交互减少到最低限度
  • 将数据库移动到另一台计算机上。
    这通常会帮助很多人。如果可能的话,将数据库保留在相同的本地网络上,但这应该可以帮助您的游戏服务器在服务器硬件上唯一运行时更加有趣。

您如何定义“主要”?厌恶王国使用单个碎片。每个人共享相同的Farmville分片。星际迷航(Star Trek Online)和冠军在线(Champions Online)均使用单碎片模型,但使用实例区域。

除了使用SQL数据库,您还可以使用为MongoDB等集群和分片设计的noSQL解决方案。
菲利普

1
@JoeWreschnig网页游戏不是实时游戏,要容易得多……我不确定《星际迷航》和《冠军在线》有多少玩家……
o0'。

4

您的第一步应该是将游戏服务器的直接数据库访问分离,并使用针对特定用途的中间件为服务器准备数据(即XML,JSON)。它们将能够处理任何数量的数据库,更重要的是能够为您提供特定于应用程序的缓存选项。高速缓存所有内容,仅在必要时才打开数据库。进行大量访存,很少(而不是许多)小型查询来实现您的方案中的最佳性能。

您选择的数据库还可能允许您操作集群,从而可以轻松扩展可用的数据库资源并更快地提供结果,但这是一个主题,需要很多经验,并且需要专门的数据库管理员来设置和维护-并且也不太适合独立预算。


1
在您考虑到他希望多台服务器访问一个数据集之前,这一切听起来都不错-这意味着,如果没有进一步的协调,应用程序端缓存将不同步,从而导致最好的游戏错误和最坏的数据丢失。我不会反对您所说的任何事情,但是原始发帖人还需要在继续之前考虑跨服务器一致性问题。
Kylotan'3

中间件是一个数据隧道,一方面负责缓存数据,还负责提供数据。但是,它仅向服务器提供数据(从不向客户端提供数据),并且服务器在启动时会缓存所有与游戏相关的主数据。因此,可以随时连接许多数据源和许多数据请求者。我从事的MMO相当有效地使用了该方案。
Konrad K.

这根本无法解释您如何解决跨服务器一致性问题。在某些时候,服务器需要同步的数据彼此之间,或者你有比赛的条件,这表现为随机断开,重复的球员,上当的物品,丢失的任务,等等

数据永远不会重复-始终只有一台服务器负责某个对象,并且在需要时,它将该对象传递给另一台服务器。对象是客户端连接,还包括播放器控制对象。但是,这是通过主服务器完成的,并且在服务器之间存在争议。因此,我们要处理两种数据-数据库信息(与我的原始文章相关)和在运行时创建并在多服务器mmo中传递的游戏对象。这些都不应该陷入竞争状态或在应用程序级别上重复。
Konrad K.

3

关于游戏服务器:一种常见的策略是使用多个服务器,其中每个服务器管理游戏世界的一部分。每个用户通常只需要了解周围发生的事情,因此按地区划分世界是有意义的。不幸的是,当您拥有一个没有边界的开放世界,而不是一个由封闭区域和玩家之间传送的世界组成的世界时,情况变得更加复杂。当您拥有开放的世界时,您需要一种无缝地在区域之间转移玩家的方法,以及一种同步服务器之间边界附近区域的方法。那是一个棘手的问题。

关于数据库: SQL数据库通常伸缩性很差。它们不是为分发而设计的。但是目前,NoSQL数据库(例如MongoDB或Cassandra)出现了一个相当新的趋势,该数据库被设计为分布在多个服务器上。通过添加更多服务器,它们使添加容量变得更加容易。那么为什么不将所有大型游戏切换到它们呢?因为:

  1. SQL数据库存在40多年,而NoSQL数据库仅存在几年。尚无足够的专有技术来最有效地使用它们,并且它们的发展正在迅速发展。市场上有很多竞争产品和完全不兼容的产品,并且没有迹象表明它们中的哪些可以生存,哪些将在几年内淘汰和停产。与NoSQL数据库的未知风险相比,大多数大型企业更喜欢SQL的已知缺点。
  2. 它们的工作方式与SQL数据库完全不同,需要重新考虑您的整个持久性策略。这可能会导致整个软件体系结构发生巨大变化。

因此,当您的项目已经非常进展时,切换到另一个数据库解决方案可能会带来很大的风险,并且会花费大量时间和精力。


0

否。这是一个尚未解决的极其困难的领域。


可能有一些“模板”(不是“ C ++设计模式”)解决方案吗?有很多MMORPG。–
Slav

2
大多数MMO都有数据库的绝对灾难作为后盾。

特别是,MMO对其数据持久性通常具有非常不同的方法,这些方法对于其自己的游戏设计通常可以接受,但不适用于其他游戏设计。由于游戏设计是最重要的部分,因此如果没有一个,就无法充分指定数据持久性和分发策略。(这可以解释为:“问一个更具体的问题,告诉我们您拥有什么样的数据,它多久更改一次,以及为什么您想在多个服务器上分布一个世界”。)
Kylotan

0

我知道这很旧,但是....

实际上,有两个领域需要重点关注。

您需要将应用程序分布在多个服务器上。您需要将数据库分布在多个服务器上。

而且,您都需要冗余。

为此有一些开源解决方案。Farmville是使用MemSQL / Couchbase的一个很好的例子。


1
在多个服务器之间分布数据库无疑是一个已解决的问题。不幸的是,对于在线游戏而言,将其数据库访问量保持在最低限度并不是通常的重要要求。相比之下,在多个服务器之间分配实际游戏玩法仍然不是解决的问题。
Kylotan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.