6

伙计们,我是一个社交游戏的开发者,游戏已经有 70 万玩家,每天大约有 7 千新玩家注册,大约 5 千玩家不断在线。

数据库服务器运行在一个非常强大的硬件上:16 核 CPU、24 Gb RAM、RAID-10,BBU 建立在 4 个 SAS 磁盘上。我正在使用 Percona 服务器(已修补 MySQL-5.1),目前 InnoDB 缓冲池为 18Gb(尽管根据 innotop 只有几个可用的可用缓冲区)。数据库服务器运行良好(2k QPS,iostat %util 为 10-15%,vmstat 中几乎总是 0 个进程处于“b”状态,loadavg 为 5-6)。但是有时(每隔几分钟)我会收到大约 10-100 个慢查询(每个可能持续大约 5-6 秒)。

MySQL 数据库中有一张 InnoDB 大表,占用空间最多。它有大约 3 亿行,大小约为 20 Gb。当然,这个表正在逐渐增长......我开始担心它会对数据库的整体性能产生负面影响。在最近的将来,我将不得不对此做点什么,但我不确定到底是什么。

基本上问题归结为是分片还是简单地添加更多 RAM。当然,后者更简单。看起来我最多可以添加 256 Gb RAM。但问题是我是否应该投入更多时间来实施分片,因为它更具可扩展性?

4

3 回答 3

1

如果您需要拥有所有 300m+ 行,则分片似乎是合理的。现在改变可能会很痛苦,但是当你的桌子越来越大时,会有一个点,没有多少内存可以解决你的问题。对于如此大量的数据,可能值得使用像 couch db 这样的东西,因为您可以存储数据文档而不是行,即 1 个文档可以包含单个用户的所有记录。

于 2011-03-26T23:36:26.213 回答
0

在我看来,您的主数据库表可以使用一些规范化。您的所有信息是否都属于该一张表,或者您可以将其拆分为较小的表吗?规范化现在可能会对性能造成很小的影响,但是随着表的增长,访问一个巨大的、单一的表所涉及的额外处理将不堪重负。

于 2011-03-27T12:18:15.963 回答
0
I'm getting about 10-100 slow queries(where each may last about 5-6 seconds).

引用评论:Database is properly normalized. The database has many tables, one of them is really huge and has nothing to do with normalization. 当我读到这篇文章时,我会说这与您的查询有关..与您的硬件无关..一般公司会梦想您拥有的那种服务器!

如果您编写错误的查询,那么无论您的表是否规范化,它都会很慢。也许您对此有所了解,它几乎是一个带有答案的类似问题(数据库很慢,诸如此类)。

还想过存档一些东西吗?例如,从 ID 1 开始的那 3 亿个中,那个 ID 仍然被使用吗?如果不是,为什么不将其存档到其他数据库或表(我会推荐数据库)。我也相信并不是每天都有 70 万用户登录(如果你得到尊重!但我不相信)。

您还说“此表包含玩家特定物品”是哪种特定物品?

另一个问题,你能发布一些你的“慢”查询吗?

您还考虑过一些数据的缓存系统吗?可能每月更换一次,比如装备其他游戏的东西?

于 2011-03-28T18:36:27.440 回答