PostgreSQL和MySQL的可伸缩性限制


43

我听说诸如MySQL或PostgreSQL之类的非分片关系数据库的性能“突破”了10 TB。

我怀疑这样的限制确实存在,因为Netezza,Greenplum或Vertica等都不会提出这样的限制,但是我想问一下这里是否有人提及量化这些限制的任何研究论文或正式案例研究。

Answers:


52

您的问题没有简单的答案,但是这里有几点需要考虑。

首先,规模并不是唯一要担心的事情。您对数据所做的就是。如果您有500个表和30 TB的数据,并且您正在执行简单的OLTP,报告很少,那么我认为您不会有太多问题。PostgreSQL上有32TB数据库。但是,与此同时,性能将有所下降,因为它必须在所有设备上都命中磁盘。同样,如果您有50TB的if数据,但是通常有大约100GB的数据命中,那么您可以构建具有足够RAM的服务器以将那部分db保留在内存中,那么您就很聪明了。

另一方面,如果您尝试从1TB数据中提取该模式(最常用的值),则无论使用什么系统都无所谓,无论是否使用分片,这都会很痛苦。(编辑:分片实际上可能会使这个问题更严重。

您将在MySQL和PostgreSQL上使用巨大的数据库遇到的主要问题涉及以下事实:它们都不支持查询内并行性。换句话说,查询由单个线程作为单个块运行,并且不能分解成多个部分并单独运行。当对大量数据运行大型分析查询时,这通常是一个问题。这是Postgres-XC和Green Plum进行救援的地方,因为它们将存储与执行分开,并且可以在协调员级别执行此操作。请注意,Postgres-XC和Green Plum本质上在内部使用分片,但是协调器在全局范围内强制执行所有一致性。

使用查询内并行性,您可以分解查询,让不同的处理器/磁​​盘I / O通道运行查询的一部分,并报告要组合的结果集的各个部分,然后传递回应用程序。同样,这通常对分析而不是事务处理负载最有帮助。

第二件事是某些系统(例如Vertica或Greenplum)将信息列存储在一起。从OLTP的角度来看,这使系统更难使用,并且降低了那里的性能,但是却大大提高了大型分析工作负载的性能。因此,这是特定于工作负载的折衷方案。

因此,答案是,一旦大小超过1-2 TB,您可能会发现自己在系统和工作负载之间面临许多折衷。同样,这是特定于数据库,工作集的大小等的。但是,在这一点上,您确实必须使用雪花系统,即那些针对您的工作负载而定制的系统。

当然,这意味着限制通常是不可量化的。

编辑:我现在使用9TB数据库,该数据库处理PostgreSQL中的决策支持和事务处理工作负载的混合。最大的挑战是,如果您有涉及数据集大部分的问题,则必须等待一段时间才能找到答案。

但是,在仔细注意基本原理(包括索引,自动清空,它们如何在低水平上工作等)和足够的计算资源之后,这些都是完全可管理的(我估计在Pg的30TB范围内可以很好地管理)。

Edit2:一旦达到100TB,什么方法有效取决于您的数据集。我现在正在开发一个不会扩展到该范围的文件,因为它将首先达到PostgreSQL中每个表的32TB限制。


2
似乎Postgres 9.6将会获得一些查询内并行性增强功能(并行seq扫描,并行连接)。
a_horse_with_no_name

1
我认为,要使其真正有用,还需要发布几个版本。
克里斯·特拉弗斯

@ChrisTravers是否存在另一个更好地支持这种情况的数据库?也许不一定是RDBMS?谢谢
konung

1
@konung我不知道是老实。我认为值得在一定规模上使用MapReduce引擎,因为这有助于塑造您对数据的看法。在很大的范围内,您确实必须知道自己在做什么。像Teradata和Postgres-XL这样的解决方案可以提供帮助,但是它们都是需要清楚了解您正在做的事情的解决方案(并且您随时可以在此基础上基于任何RDBMS构建自己的解决方案)。
克里斯·特拉弗斯

1
我推荐与Mongo一起玩游戏的一个原因是,尽管(可能甚至是)它的伸缩性不太好,但它确实教会了您在达到这一点时如何考虑联邦数据和MapReduce。
克里斯·特拉弗斯
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.