0

我们有一个网络服务,允许固定数量的用户查看每天早上收集和插入的每日位置数据。我们还允许访问历史。

我们的测试环境包括两台负载均衡的web服务器,一台主mysql,两台负载均衡的mysql从服务器。出于开发目的,这可以正常工作,但只有大约 50 个用户同时处理数据。

我们很难规划在用户负载范围内维持正常运行时间所需的服务器架构。我们的限制是众所周知的,包括每天插入的数据量。

考虑到我们需要在不到 10% 的时间内访问历史数据,我们设计系统的最佳架构是什么?

已知情况:

  • 我们的用户设置为 125,000,估计每天有 5,000 到 20,000 活跃,并且不会改变。
  • 我们的服务每天收集大约 5,760,000 条信息记录。(如果我们将所有数据压缩成一个每日表,可以压缩到大约 120,000 条每日记录,我们被告知这是一个很大的不,不“所以规范化它”)
  • 用户可以随心所欲地浏览他们的历史信息,但他们通常只对他们的每日和每周、每月信息感兴趣。
  • 我们不需要非常快的数据检索
  • 用户可以根据需要查看历史数据(想想地下天气,查看 1960 年以来的温度)
  • 我们的数据聚合是非常可预测的。到目前为止,我们拥有长达 5 年的信息,数据库大小约为每年 80GB,包括索引
  • 尽管用户极少访问超过 1 年的任何数据,但我们仍然希望提供该功能。
  • 用户可以选择接收包含每日、每周和每月信息的电子邮件,因此我们还将每天处理一次获得的数据以发送电子邮件。

测试环境:

我们目前有一个大型 ec2 实例,标准 500gb ebs 在所有表上使用 mysql 和 innodb,并有两个小型从属服务器用于读取。
我们包含用户信息的表格将位于单独的服务器中。

  • 让不同的数据库服务器将当前月份的数据保存在一个中,将历史数据保存在另一个中是否可行?还是将其保存在与主动访问的数据相同的服务器的单独表中更好?我们考虑为数月的活动数据(7GB)配备一个单独的小磁盘高内存数据库服务器,当它变成历史数据时,我们将其移至另一台服务器

  • 我们听说过集群,但同时也听说要远离它,除非用尽所有其他选择。

4

2 回答 2

1

您设计一个可操作的数据库是关于如何访问和使用它,而不是需要存储什么,而不是“我们可能需要......”。

关系模型非常适用于即席查询和假设场景。随着负载的增加和数据大小的增加,这些临时的一次性查询变得越来越少,越来越不可行。最终,您在“生产”服务器上根本买不起它们,因为它们不可避免地会干扰生产。

我提到这一点是因为您提到:

我们的服务每天收集大约 5,760,000 条信息记录。(如果我们将所有数据压缩成一个每日表,可以压缩到大约 120,000 条每日记录,我们被告知这是一个很大的不,不“所以规范化它”)

如果您的用户只对 120,000 条摘要记录感兴趣,那么将 570 万行存储在其他地方。它只是在这里占用空间和性能。一个好的、坏的查询可能是 I/O 绑定、CPU 挂钩、DB 缓存粉碎怪物。正是您在生产系统上不想要的。

因此,您需要根据用户查询的内容、他们真正需要的内容以及他们需要的时间来进行设计。如果用户可以提出异步请求:“嗨,我想要基于此条件的历史查询”然后让他们排队,然后在准备好时向他们发送电子邮件,或者安排每天、每周、每月的工作,如合适的。

如果您可以将活动数据保存在 7GB 的 RAM 中,那么这将是一个很大的帮助。在慢速磁盘存储上执行慢速导入操作,每晚将摘要数据发送到基于 RAM 的系统。另外,不要忽视 SSD。SSD 非常非常快。硬盘驱动器是新的磁带驱动器。

正如@BraveNewCurrency 所指出的,20,000 个活跃用户并不是很有意义,对于简单的查询来说也不是很多。超过24小时了吗?它会从 9 飙升到 5 吗?当市场收盘时,它们都会飙升吗?调整您的峰值负载,然后调整一些。

至于数据库大小,如果您在小范围内进行简单的索引查询,并使用适当的统计信息,甚至针对大型表,那么数据库的整体大小几乎没有意义。如果你正在做“在这 20M 行中给我 10 件最大的东西”,那么你就完蛋了。如果这样的查询很常见且很受欢迎,则需要特别注意。从索引中取出一小部分是相当快的。对大型数据集进行大量汇总、计数、平均和排序是毁灭性的。即使有行限制。

如果你这样做:

SELECT ... FROM BIG_O_TABLE ORDER BY NON_INDEXED_COLUMN LIMIT 10

在 20M 行表上,您将对整个 20M 行表进行排序。每一个。单身的。时间。然后得到 10 个最低的行。

因此,您需要专注于向用户提供的活动查询,并围绕它进行设计。如果您要管理多个数据库,请按照程序确保完整性,并始终存档和维护原始原始数据,以便在需要时能够重建数据库,尤其是在数据库出现故障并退出时与对方同步。

于 2013-10-13T04:10:22.200 回答
0

20,000 active daily [users]

Hmm, even if each user has 10 hits per day, we're talking about an average of

20_000 users * 10 hits/day / (24*3600.0 seconds/day) = ~2 hits per second.

Your peak load will be 4x to 10x your average. So maybe you'll have 20 hits per second. What are you worried about again?

于 2013-10-13T01:50:11.820 回答