百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

如何避免 PostgreSQL RDS 的陷阱一份大数据解决方案的实践指南

toyiye 2024-06-21 12:23 10 浏览 0 评论

【CSDN 编者按】在本文作者将分享为什么最初选择了 Postgres RDS 作为我们的大数据解决方案,以及在使用过程中遇到的一些问题和挑战。文章还将分析 Postgres RDS 的优点和缺点,以及它与其他数据库产品的比较。最后,总结最终放弃 Postgres RDS 的原因,以及转向新的技术栈和架构。如果你也在考虑使用 Postgres RDS 作为你的大数据解决方案,那么这篇文章可能会对你有所帮助。

链接:https://medium.com/@mkremer_75412/why-postgres-rds-didnt-work-for-us-and-why-it-won-t-work-for-you-if-you-re-implementing-a-big-6c4fff5a8644

者 | Max Kremer
译者 | 明明如月 责编 | 郑丽媛
出品 | CSDN(ID:CSDNnews)

我们的初创公司主要业务是通过统计归因模型评估营销成效,这需要收集大量的在线用户行为数据,包括每次点击、每次字段输入和每项操作。这些数据存储在 PostgreSQL 数据库中,用户通过我们的界面运行仪表板和报告,这些数据量很大,给我带来很多技术挑战。我们开发的是一款多租户的 SaaS 应用,能够实现数据的按租户隔离,支持数百个租户的数据摄取和存储,这就要求系统具备良好的可扩展性和高性能。起初,我们选择了 AWS RDS 托管的 PostgreSQL 作为解决方案。

主要问题:EBS 的吞吐量难以衡量

在 EBS 上,准确衡量吞吐量几乎是不可能的。AWS 提供的是延迟和 IOPS 指标,但这些都不足以衡量吞吐量。例如,当你需要扫描一个大型时间序列表(如 2000 万行,大小约 10GB)时,无论出于何种原因,你都需要一个准确的吞吐量指标来判断扫描整个表所需的时间。

IOPS 的爆发和限制——滑坡效应

如前所述,类似的查询很快会耗尽 IO 信用。面对需要更多 IOPS 的情况,一个直接的解决方案是增加存储容量,以便将基线 IOPS 从3000提高到 10000。然而,这会导致备份成本增加,因为你需要为整个卷支付费用,而不仅仅是已使用的部分。这样一来,成本增加了,但性能提升却有限,从而引发了成本和性能的雪球效应。

此外,我们还尝试增加实例大小,以便获得更多的缓存内存。如果能将所有数据都载入内存,理论上可以让数据库运行得更快。虽然 PostgreSQL v10 带来的更大并行化功能充满诱惑,但遗憾的是,由于 IO 的限制,我们实际收益不大。

关于测量吞吐量问题的更多细节,可以参见下面的链接:https://www.datadoghq.com/blog/aws-ebs-latency-and-iops-the-surprising-truth/

Aurora 迁移

因此,我们决定迁移到 Aurora,它相比于传统 PostgreSQL,承诺提供 5 至 7 倍的性能提升,这一点对我们有非常强的吸引力。这些性能提升指标基于 pgbench 测试结果,在测试 PostgreSQL 性能时确实有效。如果你运营一个 OLTP 系统,并期望在有大量并行客户端的情况下测量事务速度(或延迟),pgbench 是一个很好的工具。但对于那些处理大数据集和进行数据挖掘操作的场景,pgbench 并不是一个理想的性能评估指标。这会带来是成本的上升。
关于 IOPS 和计费 IOPS 的讨论详见:
https://forums.aws.amazon.com/message.jspa?messageID=835303#835303

我们面临的最大挑战仍然是无法准确测量吞吐量。简单地通过计算扫描数据量与所需时间的比率(使用 track_io_timing)来进行评估时,我们意识到在处理大数据集时的性能远不如预期的 SSD 速度,实际上更接近于传统硬盘的速度。

更令人挫败的是,我们不得不花费大量时间来处理技术支持问题。尽管支持团队非常专业且乐于助人,问题的解决最终总是归结于调整查询或修改数据库配置。我真心希望能直接得到“考虑到你的工作负载,这项服务可能不适合你”的直接建议,但最终我们还是自己找到了解决方案。

解决方案:搭建自有基础设施

对我们而言,解决方案非常明确:放弃使用托管数据库服务,转而在 EC2 上自行搭建基础设施。

我们通过选择等级较低的 EC2 实例来实现这一点,之前我们在 RDS 上使用的是 4XL 规格的实例,现在主要使用 xl 和 2xl 规格。

关键策略是利用 WAL-G(https://github.com/wal-g/wal-g)来分离主节点上的读写工作负载和实时更新的备份副本。

写入节点的速度可以稍慢,因为其主要任务是数据摄取,而 EBS 的性能对此已经足够。但我们通过使用 ZFS 对 EBS 进行压缩,实现了双倍的吞吐量。

对于读取节点,我们采用了配备临时 NVMe 驱动器的配置,并通过 ZFS 进一步提升了性能。

其结果显而易见:

  • 费用从 $11,000 降至 $2,100(这是我们完全摆脱 RDS 依赖后第一个月的预估)。

  • 原本需要数小时甚至无法完成的查询,现在只需几秒钟。

  • 我们可以使用 Unix 实例上的命令行工具(例如 zpool iostat)来准确测量吞吐量。

结论

虽然只需要单击按钮就可以启动一个实例,不必担心备份和恢复的便利性很诱人,但无论是从金钱还是性能的角度来看,这种便利是有代价的。如果你追求处理 TB 级或 GB 级数据的速度,那么使用裸机服务器是最佳选择,若不可行,则选择配备 NVMe 驱动器的 EC2 实例是第二选择。

本文引发广大网友的热议,下面是几个非常有代表性的观点:

  • 作者的经验是有价值的,但不一定适用于所有的场景和需求。Postgres RDS 可能对于一些 OLTP 系统或者小型数据集合是一个合适的选择,但对于大规模的数据分析或者数据挖掘任务,可能需要更高效的解决方案。

  • 作者没有充分利用 Postgres 的一些特性和优化方法,比如索引,分区,物化视图,压缩,异步提交等。这些技术可以提高 Postgres 的性能和可扩展性,减少 IO 压力和成本。

  • 作者没有考虑使用其他的数据库或者数据仓库,比如 Redshift,Snowflake,BigQuery,ClickHouse 等。这些产品都是专门为大数据分析而设计的,提供了更快的查询速度,更低的存储成本,更灵活的扩展能力。

  • 作者的迁移过程是有风险的,可能导致数据丢失,不一致,或者不可用。在迁移之前,应该做好充分的测试,备份,和监控,以确保数据的完整性和安全性。

你是否有更多不同的看法,欢迎在评论区留言讨论。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码