MMORPG中通常使用哪种数据库?[关闭]


62

人们是否出于某种原因编写自己的数据库?

Answers:


38

我们做到了,希望本Z会比我更好地解释原因,因为他实际上是我们数据库的原始作者。简短的版本是关系数据库在游戏中不是很有用,因为它们不能有效地存储结构化的层次结构数据,这些数据构成了MMO正常操作所需的绝大多数数据。我们选择建立一个自定义对象数据库和一个分布式事务处理系统的一部分,该系统现已投入生产并为我们的两个实时游戏提供动力。

至于您是否应该这样做?可能不是,至少起初不是。我仍然会提倡避免使用SQL,但是“ NoSQL”世界现在有很多其他选择,几年前还没有。

也就是说,大多数MMO都可以在SQL(关系)数据库上运行。我知道Eve在安装在几个多TB RAMSAN之上的SQL Server安装上运行(我一生中可能永远不会拥有这些东西所花的钱)。

编辑:我希望他不会介意我在这里张贴这一点,但是是一个博客条目约在我们给GDC'08我们的数据库演示一些链接和评论。


1
+1我以为大多数人最终都会在那里写自己的数据库。但是NoSQL世界现在正在增长,这很酷。
杰西·多西

5
即使以后您最终大量自定义某些内容,也可能至少有一个数据库可以作为原型。
coderanger 2010年

9
coderanger拥有正确的权利。我为MMO编写了一个自定义数据库。如果我要在当今世界再做一次,我可能会更仔细地研究如何适应现有技术,因为正如他提到的那样,世界比4年前更加活跃。实际上,许多MMO确实可以在SQL上运行,其中有些很好,有些还不太好。这些游戏的最大分片并发性(与最大区域或大陆并发性相对)较低。
Ben Zeigler,2010年

2
“因为它们不能有效地存储结构化的层次结构数据,这些数据构成了MMO正常操作所需的绝大多数数据” –在应用程序开发中比在游戏编程中更是如此。不幸的是,我们束手无策,并且由于NoSQL解决方案的性能(和DBA的可用性)目前无法与RDBMS的性能相提并论,因此我们必须将数据涂抹并弄脏成可用于RDBMS的。
BlueRaja-Danny Pflughoeft

1
几年前可能确实如此,但是现在有许多现成的数据库可以提供所需的性能特征。
coderanger 2011年

35

好的,这个答案更像是一个观察。

全面披露我尚未从事MMORPG。我曾在2009年访问量最高的十大网站之一工作,而我曾在游戏引擎公司工作,认为他们正在制造MMORPG技术(我不知道是否发货)。

如果您看一下已经实现大规模发展的公司(Google,Facebook,Twitter等,我知道他们不是游戏公司,但在这个领域值得研究),我认为有两件事很重要。

  1. 他们从抢便宜,容易起步的东西开始
  2. 最终,他们不得不自己开发很多技术。(有时是硬件)

一个大错误是拿起一些昂贵的交钥匙物品,并期望它可以为您神奇地扩展。那样行不通。扩大规模的关键是适当应对每个新挑战。您需要灵活,易于使用的解决方案,并且可以轻松移入和移出。

所以我对您的建议是,如果您刚起步,就可以轻松应对。


25

基本上,有各种各样的方法,我认为选择它们的依据更多是开发人员的经验以及数据库的属性。一方面,许多MMO正在使用标准的关系数据库-例如。使用/使用Camelot的黑暗时代(还在吗?)MySQL,FreeRealms使用经过修改的Postgresql等。

顺带一提,您会遇到Guild Wars:他们使用SQL Server,但它们将数据作为单个BLOB保留在其中。这意味着他们将获得常规二进制格式的好处以及数据库提供的一些好处。不用说,您可能还会看到这种方法的一些缺点,但是对于曾经使用平面文件的公司而言,它可能仍在进步。

然后可能还有一些地方使用了各种形式化的NoSQL方法,尽管还很早。Farmville 显然基于memcached使用了为此目的而制造的membase。这与MongoDB,CouchDB等共享许多功能。再次使用这些方法,您通常会滚动自己的存储格式,但会获得分发,缓存,冗余等优点。

有些人正在完全使用自己的NoSQL:Cryptic 说他们做了类似的事情,但也说他们没有在生产中使用它。(编辑:但请参阅下面的评论。)

然后,您遇到使用平面文本或二进制文件的人-据我了解,较早的游戏(如Ultima Online,Everquest等)都沿这条路线走了,对于一家拥有游戏开发经验但数据库经验很少的公司来说,这很好用太。

还要注意,您几乎永远不会在某种松散的意义上写自己的数据库-在游戏中,您总是拥有定制数据,而这些数据需要以不适合自己使用的方式来管理内存或磁盘中的数据通用软件。您无法每次都需要一些数据时执行SQL查询,因此无论使用什么后端,都需要在代码中镜像很多信息。


1
如果将它们保留在内存中,则需要在内存中实现数据库,或者在跨区域进行交易时冒着物品重复/丢失的风险(例如)。只要您的所有玩家一直都在同一个内存空间中,“将它们保留在内存中”才有效。

1
虽然这对于在线时间和生命值都是正确的,但在Cryptic的数据库中都不能保证ACID,但对于任务里程碑(杀死5/10狼)或XP奖励(每位玩家每秒仍可能多次出现)则不是这样。

1
如果您可以很好地处理在服务器发生故障的情况下丢失任务进度的用户,那么这些事务就不需要事务语义。就XP奖励而言,这可能意味着失去一个等级,并且当游戏崩溃而您失去等级时,下一步通常是停止游戏。

6
XP非常需要进行交易。首先导致创建CrypticDB的一种特殊攻击(相信我,我写了)是在多个服务器上同时获得XP,并且同步失败是用户可中断的。确实需要处理任何对角色发展至关重要的事情,否则玩家将找到某种利用方式。
本·齐格勒

1
@expiredninja:这是一个非常开放的问题。但是,“ flatfile”仅表示“到磁盘的任意序列化”。例如,游戏开发人员通常会使用fprintf写出每个字段。
Kylotan 2014年

10

在《灼热的海盗》中,我们开始使用MySQL(尽管老实说我更喜欢Postgres),当它开始在负载下崩溃时,我们改用Microsoft SQL Server。不过,老实说,将来我可能不会再走那条路了。大部分PotBS数据在保留之前都已预先序列化,因此数据库中的大部分内容不过是密钥/值存储区的增长。最重要的是,为了在持久层中获得更好的性能,并更好地控制数据在内存中的缓存方式,我们最终编写了位于数据库前面的缓存服务器。

所以Kylotan说的很对,您不会在某种程度上绕开自己的脚步。SQL关系数据库服务器不是为游戏使用数据的方式而设计的。与其假设关系数据库服务器不是数据库的全部,不如说我们真的应该在选择工具之前更多地考虑我们在寻找什么好处。

下次,我将进一步研究BerkleyDB或其他一些NoSQL风格的DB。


10

要注意的另一件事是,如果您拥有(相对)静态的数据集,请不要将其存储在数据库中!没有真正好的理由将您的拼写定义,项目定义,地图等存储在数据库中。除名称外,您很少查询它们。我看到很多人进入游戏开发,将这些东西与持续的玩家数据一起存储,这是完全不同的一类。

您需要一个数据存储,例如文件系统。在开发之外,您不需要ACID,不需要CRUD,也不需要数据库来存储此类数据。在开发内部,您需要一个数据库,但无论如何您都还需要一个VCS,而选择VCS将会为您选择数据库。

(如果您正在玩的游戏中,玩家可以创建自定义咒语,物品或任务,那么该数据与玩家数据属于同一类,并且您确实需要一个数据库。)


5

MMORPG是密集型应用程序,是一项巨大的事业。如果您从游戏开发开始,我强烈建议您做一些较小的事情。

也就是说,您需要从设置中挤出两个最佳性能。显然,您将需要服务器场/配置单元。因为网络通信相对昂贵(并且大多数MMORPG是实时的),所以您可能希望将中央数据库复制到每个游戏服务器(等同于所选数据库中的实时低延迟复制)。

如果您的每台服务器都服务于游戏世界的特定部分(例如《魔兽世界》的作品);类似于分布式分区视图。DPV允许您在不同服务器之间划分数据库的行;根据每个服务器上列的约束。MSSQL和Oracle都足够聪明,只需要与包含WHERE或ON子句中的数据的服务器通信即可。我不确定任何开源产品是否具有DPV。

这一切的最终结果是,无论您使用什么数据库都无关紧要,只需使用一个具有良好名称的数据库:MSSQL,Oracle,MySQL,PostgreSQL。用ANSI SQL编写数据库,然后查看哪个系统运行最佳-这是找出答案的唯一方法。

NoSQL路由也可能是一个好主意,因为它是为高并发性而设计的。Pranny的建议可能会解决问题。


5

我使用过MongoDB(NoSQL),它是一种非常快速的文档存储,可以通过TCP进行访问。试试看!这很棒!

编写自己的数据库是一项艰巨的任务。我建议您首先探索已经存在的东西,如果找不到符合您特定条件的任何东西,请自己建立。哦,别忘了开源。:)


0

我想这很大程度上取决于您需要存储哪种数据以及以哪种格式存储。

我认为大多数人都使用“标准” SQL数据库来存储“动态”数据,例如播放器信息,例如SQL Server,MySQL,PostgreSQL。

但是,“内部”数据(世界状况,内容等)可以以任何形式存储,我的猜测是,大多数公司至少为此部分编写了部分定制的数据库系统,以满足他们的特定需求。


0

嗯,这实际上取决于您的应用程序-这是最重要的。我在工作,我们在那里开发社交RPG,并使用Google App Engine作为后端


0

这个问题已经很老了,但是我关于如何处理它的想法和今天一样有效。

如果您使用的是关系数据库,则需要减少它的负载,因此该想法应会有所帮助。

将所有公共信息存储在每个客户端系统上的本地数据库以及服务器数据库中。

将所有包含项目的表存储在客户端数据库上。当您将鼠标悬停在该武器上以获得统计信息时,客户端无需查看服务器,而是仅检查本地数据库中的统计信息。服务器具有自己的数据库,用于在计算时提取统计信息,并且仅将剩余的损坏和健康状况转发给客户端。

这个想法最糟糕的情况是,如果每个人都能够进入客户数据库,那么每个人都可以看到所有武器的统计信息。不管是什么原因,即使它们更改了值也没关系,服务器上的数据库值就是游戏中的计算内容。


1
一旦将所有这些信息存储在本地,就完全不需要将其存储在数据库中。
乔许
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.