(怎么能/应该怎么做)我实现了一个可以扩展到数万个请求/秒的数据库?

时间:2009-02-17 23:07:13

标签: mysql database scaling cluster-computing tokyo-cabinet

按上面几万个请求/秒,我想看到60,000 - > +90,000个请求/秒。

我的设置包含以下内容:

用户--->网络应用 - >消息队列 - >解析器 - >数据库?

我应该提一下,解析器当前可以使用COPY解析/填充大约18750条记录/秒,所以我们在这方面受到限制,直到我们开始添加更多解析器 - 这对我来说不是一个大问题。

我的系统需要能够尽可能快地批量上传尽可能多的记录。同一个系统(或者根据你如何处理它可能会有所不同)应该能够响应分析类型查询,例如:

wonq = "select sum(amount) from actions where player = '@player' and " +
       "(type = 'award' or type = 'return') and hand = hand_num"
lostq = "select sum(amount) from actions where player = 'player' and " +
        "type != 'award' and type != 'return' and hand = hand_num"

..... 10-15千次(PER USER)因为他们被锁定到另一张桌子。毋庸置疑,我们暂时将这些结果分页为10页。

我看过以下内容:(假设这些都在同一台服务器上)

  • mysql(reg。运行rdbms) - 能够进入15-20万个请求/秒范围;在当前条件下,如果我们尝试扩展这一点,我们每次需要扩展时都需要一个单独的主机/数据库 - 这是不可行的

  • couchdb(面向文档的数据库) - 没有突破700个请求/秒;我真的希望这能挽救我们的屁股 - 不是偶然的机会!

  • vertica(以柱状为导向的数据库) - 达到60000请求/秒,封闭源,非常昂贵;这仍然是一个选择,但我个人根本不喜欢它

  • tokyocabinet(基于散列的数据库) - 目前的重量为45,000次插入/秒和66,000次/秒;昨天,当我写这篇文章的时候,我使用的是基于FFI的适配器,每秒执行5555次请求;这是迄今为止我见过的最快最棒的数据库!!

  • 赤土陶器 - (vm集群)目前正在与jmaglev一起评估(不能等到磁悬浮本身出来) - 这是最慢的!

也许我只是在解决这个问题,但我总是听说RDBMS一切都很慢 - 所以我听说过这些超快系统在哪里?

测试条件 ::

就这样ppl知道我的开发盒上的规格是:

dual 3.2ghz intel, 1 gig ram
mysql mysql.cnf的编辑是:

key_buffer = 400M               # was 16M
innodb_log_file_size = 100M     # non existent before
innodb_buffer_pool_size = 200M  # non existent before

更新 ::

事实证明,兵马俑可能在我们的应用程序结构中占有一席之地,但它不会很快取代我们的数据库,因为它的速度非常糟糕且堆利用率很低。

另一方面,我很高兴看到tokyocabinet的NON-FFI红宝石图书馆(意思是暴君/内阁)超级快,现在就是第一名。

8 个答案:

答案 0 :(得分:6)

对于疯狂的大扩展性,你需要专注于两件事:

  • 分片:将数据集拆分为不重叠的组。有一种简单,快速的方法从请求映射到服务器。 (播放器以a-f开头,服务器1; g-q,服务器2 ...等等......)
  • 缓存:使用Memcache记住一些非常常见的选择查询的输出,因此您不必经常访问磁盘。

答案 1 :(得分:1)

游戏中的大玩家就是甲骨文,但这还不错。

如果你想要便宜,那么你将不得不用不同的价格付出代价:

  • 通过在多个实例之间分配数据库并分配负载。
  • 潜在的缓存结果可以减少实际的数据库访问。

答案 2 :(得分:0)

用户--->网络应用 - >消息队列 - >解析器 - >数据库?

您需要什么消息队列? 这通常是一个很大的性能问题。

答案 3 :(得分:0)

ojrac说道,分片和缓存。

另一个选择是退一步,找出用较少的查询来完成工作!从你给出的小信息中我不禁想到“必须有更好的方法”。从示例中您可以轻松获得一些摘要表(带有可选的缓存)。

Hypertable等为某些数据访问模式提供了更好的性能,但您的声音非常适合典型的数据库。

是的,CouchDB的速度令人失望。

答案 4 :(得分:0)

你尝试过postgresql吗?它应该比mysql快。但无论如何,你需要平衡多个服务器(拆分数据库)的负载。你可以有多个数据库(例如每个客户端),然后是一个集中的数据库,它们将与那些小数据库同步......

答案 5 :(得分:0)

你试过redis吗?他们承诺速度为110000 SET /秒,81000 GETs /秒。它是一个高级键值数据库,支持列表和集合。

答案 6 :(得分:0)

我怀疑任何系统都会为您提供所需的开箱即用性能。您可能会开始在您所使用的计算机上达到硬限制(几乎任何写密集型数据库都会很快达到I / O限制)。可能需要进行一些分析,但磁盘几乎总是瓶颈。更多RAM将有助于使用固态磁盘。

但是,无论您使用哪个实际数据库,都可能需要某种群集。您可以对数据本身进行分片,或者使用MySQL,设置读取从属服务器会在节点之间分配负载,并且应该为您提供所需的吞吐量。

另外:MongoDB太棒了。也许值得一瞧。

答案 7 :(得分:0)

在写入量大的应用程序中持久快速存储数据的典型方法是使用仅附加日志。如果正确部署了s.t.日志文件位于其自己的旋转磁盘上,每次写入/追加操作的磁盘搜索时间最小化。

可以更新元数据,以便在每次写入后知道某些主键的偏移量。

有一个mysql存储引擎,这是你想要使用mysql。另一个选项是像fleetdb这样的新的nosql数据库之一。

您是否尝试过使用SSD?

有很多选择可以解决这个问题,但它们可能需要一些体力劳动。