通过 PostgreSQL 数据库聚合大型(数十亿行)数据集
Posted
技术标签:
【中文标题】通过 PostgreSQL 数据库聚合大型(数十亿行)数据集【英文标题】:Aggregation of large (bilions of rows) datasets over PostgreSQL database 【发布时间】:2015-05-14 10:18:34 【问题描述】:我正在努力寻找聚合大量数据的正确方法。 考虑到平均预期传入负载约为每秒 200(峰值 500)新行的数据库,我们将在前三个月内达到 10 亿行。期望数据至少保存 10 年。表几乎是静态的,没有更新,没有删除,只有插入。 期望 PostgreSQL 服务器(具有适当的硬件和配置)会管理如此大量的数据以进行查询,这是真的吗?还是个坏主意?
现在的要求是每个客户都能够为他的交易生成汇总报告(可能是数千万甚至数亿,取决于他的标准),包括最近添加的那些。
我能想到一些理论方法,例如视图、物化视图、直接查询、使用触发器对另一个表进行预计算。每一个都有其影响,积极的,消极的。例如,我什至无法想象刷新物化视图。
有没有人有过此类任务的经验?任何见解都会受到赞赏。甚至基础设施提示、第三方工具,任何有用的东西。我现在最关心的是要创建的软件解决方案,而不是硬件扩展。
干杯。
【问题讨论】:
以每秒 200 条记录的速度,您将在 10 年内拥有 630 亿行。 10 年后,你真的会关心交易级别的粒度吗?至少您需要使用partitioning 来分离您的数据,630 亿行在单个分区中是无法管理的。这样,您的分区大小将是 c.535m 行,虽然仍然很多,但比单个分区更容易管理。 接下来您要考虑一个 OLAP 环境。如果您可能需要在相当高的规模级别上报告,那么将数据存储在高级别,将其与您的分区结合起来,例如,假设您的数据按时间顺序插入,按月分区您的数据,然后一旦分区完成(在下月初),将上个月的摘要添加到仓库中。如果您需要多达第二个准确的报告,您可以组合来自您的仓库的查询以获取历史数据,并仅获取最新数据的最新分区。 我同意,分区是必须的。划分为最近和历史部分是我们得到的第一个想法。现在我们正在讨论在我们的数据库之上使用 Solr 并将所有描述的报告移动到 Solr 并简化数据库角色以用作为 Solr 提供源数据的普通存储的可能性。不幸的是,我们还没有太多类似 Solr 的解决方案的经验。 您真的需要保留单个交易,还是只对汇总感兴趣?您能否在每次 INSERT 后增量更新一些预先计算的聚合值,然后丢弃底层记录? 好吧...有一个叫做PipelineDB的东西,基于Postgres,它处理连续聚合,虽然我不能告诉你更多关于它的信息。 【参考方案1】:您应该为您的表使用分区。例如,按月将您的表拆分为多个表。 Partitioning 是 Postgresql 中的一个私有继承案例。
【讨论】:
以上是关于通过 PostgreSQL 数据库聚合大型(数十亿行)数据集的主要内容,如果未能解决你的问题,请参考以下文章
通过将字段存储为字节而不是数十亿文档的字符串,将在 Lucene 索引中优化多少空间和处理