分布式数据库用例

Distributed database use cases

目前我有一个 mysql 数据库,我每年收集的数据是 5 太字节。我会一直保存我的数据,我不认为我想很早就删除一些东西。 我问自己是否应该使用分布式数据库,因为我的数据每年都会增长。 5 年后我将拥有 25 Terabyte 没有索引。 (只是计算了我每天保存的原始数据)

我有 5 个 table 并且大多数查询是对多个 table 的连接。 我需要在特定时间戳访问多行中的 1-2 列。

分布式数据库会比单个 mysql 数据库更受欢迎吗?

分区会很困难,因为我所有的 table 都是高度连接的。

我知道这取决于查询和数据库 table 设计,我也可以有一个分布式 mysql 数据库。 我只想知道什么时候应该考虑分布式数据库。 这会是一个用例吗?或者 mysql 可以处理这个大型数据集吗?

编辑:

如此宽泛的问题,实在无法给出具体的答案。

一般来说,我建议只有在你能证明你有问题时才担心性能;如果您担心,最好设置一个测试平台,用有代表性的数据填充它,然后看看会发生什么。

"Can MySQL handle 5 - 25 TB of data?" 是的。不,取决于。如果 - 如您所说 - 您没有索引,您的查询可能会在达到 5TB 之前减慢很长时间。如果它是 5TB/年的高度可索引数据,那可能没问题。

这个问题最常见的解决方案是为所有 "regular" 工作保留一个 "transactional" 数据库,并为报告保留一个数据仓库,使用常规 Extract/Transform/Load 作业来移动数据,并将其存档。数据仓库通常有一个为查询而优化的模式,通常完全不同于原始模式。

如果您想让所有内容在逻辑上保持一致,您可以使用 sharding 和聚类 - MySQL 的开箱即用功能。

但是,我不会推出自己的 "distributed database" 解决方案。这比你想象的要难得多。

你的问题是关于 "distributed",但我看到需要先回答更严肃的问题。

"Highly indexed 5TB" 会变慢。索引是 BTree。向索引添加新行意味着在该项目所属的树中定位块,然后读取-修改-写入该块。但是...

  • 如果索引是AUTO_INCREMENTTIMESTAMP(或类似的东西),那么被修改的块是'always'在'end' B树。所以几乎所有的读写都是可缓存的。也就是说,更新这样的索引是非常低的开销。

  • 如果索引是 'random',例如 UUID、GUID、md5 等,则要更新的块 很少 在缓存中找到.也就是说,为这一行更新这个索引可能会花费一对 IOP。即使使用 SSD,您也可能跟不上。 (假设您没有几 TB 的 RAM。)

  • 如果索引介于顺序和随机之间(比如,某种"name"),那么BTree中可能有数千个"hot spots",这些可能可缓存。

底线:如果你不能避免随机索引,你的项目就注定要失败。

下一期...查询。如果您需要扫描 5TB 的 SELECT,那 需要时间。如果这是一种数据仓库类型的应用程序,并且您需要汇总上个月的数据,那么构建和维护汇总表将非常重要。此外,这可以避免 'Fact' table 上某些索引的需要,从而可能消除我对索引的担忧。

"See the historical data" -- 查看单独的行?还是只看摘要信息? (同样,如果它像 DW,很少需要查看旧数据点。)如果总结就足够了,那么 25TB 中的大部分都可以避免。

你有在线25TB的机器吗?如果没有,那可能会迫使您拥有多台机器。但是随后您将遇到 运行 查询的复杂性。

5TB 是根据 INT = 4 字节等估算的?如果使用 InnoDB,您需要乘以 2 到 3 才能获得实际占用空间。此外,如果你以后需要修改一个table,这样的操作可能需要将table复制过来,这样就需要双倍的磁盘space。您的 25TB 变得更像是 100TB 的存储空间。

PARTITIONing 有效用例很少,所以在了解更多之前我不想讨论它。

"Sharding"(跨机器拆分)可能是您所说的 "distributed"。有多个table,你需要好好想想如何拆分数据,这样JOINs才能继续工作。

5TB 很大 -- 尽你所能缩小它 -- 使用更小的数据类型、规范化等。但不要 "over-normalize",你可能会以糟糕的性能结束。 (我们需要查看查询!)

许多 方向来获取多 TB 数据库。我们确实需要更多关于您的 table 和查询的信息,然后才能更加具体。