一位同事使用 PHP 框架构建了一个 Web 应用程序,我们可以在其中配置一些对其他系统的 API 调用。它们在夜间运行以将新数据拉入 Postgres 数据库。由于 Postgres 是一个 OLTP 数据库而不是为分析而设计的,所以我开始阅读有关 Redshift 的内容。但我只是想不通所有这些是如何组合在一起的。
哦,对于分析,我们会看看 PowerBI,它可以将 DirectQuery 与 Redshift 结合使用。但在我看来,Postgres 没有这样的东西。
所以对于我的问题,我会将所有内容分为四个部分:
- 应用程序(登录、配置 api 调用的接口(interface))
- 应用程序的用户数据(用户、api 调用的架构)
- 数据(来自 API 的答案供以后分析)
- 数据仓库(分析数据的存储)
Solution | Application | Userdata | Data | Datawarehouse -------- | ----------- | ---------- | ------------- | ---------------- Now | PHP | Postgres | Postgres | 1. | PHP | Postgres | Postgres | Redshift 2. | PHP | Postgres | | Redshift 3. | PHP | Redshift | | Redshift
所以问题是:哪种可能的解决方案是“正确”的?我可以使用我们拥有的基础架构并添加 Redshift。但后来我的存储成本翻了一番。我可以将应用程序数据存储在较小的数据库中,并将来自 API 的数据直接存储到 Redshift 中,或者将 Redshift 用作唯一的数据库。
最佳答案
这两个系统都有不同的后端基础设施,并且用于某些非常特定的目的。虽然在处理少量数据时它们可能可以互换使用,但在涉及大量读/写时会发生巨大变化。
这里我假设当你说你正在使用 Postgres 时,你的大概是行方向。
对于写入批量数据,行数据库是首选,因为它是写入密集型的,而如果您的操作涉及查询多行(分析目的的典型要求),则使用列数据库。最好的组合始终是将事务数据存储在面向行的数据库上,将分析目的所需的一些表迁移到列式数据库并在那里运行分析查询。这听起来可能很荒谬且代价高昂,但如果某些公司不想妥协交易数据或分析数据,这正是他们执行的方式。
如果您的公司是一家涉及繁重(财务)交易的基于产品的公司,并且您还捕获了 user_persona,请将它们分别拆分为面向行和列的架构。
A row DB is write intensive. When application makes bulk transactional write statements, it has to be written on tables without any lag. I'm sure, you'll have multiple master_slave configuration as well, thus the data has to be replicated to slaves as well and that too, at the real time.
现在必须了解分析数据与交易数据有很大不同。交易数据并不庞大——假设它将在订单表中创建一行,并将 user_id
映射到每个下订单的一些基本 order_details
;但分析数据——每次用户登陆应用程序时都会生成屏幕上的点击模式、发送的通知的详细信息等;体积庞大,不能像我们存储交易数据那样存储。
A columnar orientation (as in Amazon RS) is read intensive - a typical requirement for analytical data since a large number of rows will be retrieved for a given user_set - details of all the notifications sent, or all the screens browsed / clicked by the user. A columnar DB is tailor made to suit such requirements.
列式数据库中的批量写入很慢;但由于它现在主要处理分析数据 - 没有实时数据并不重要。分析需要时间和数据,直到 current_date-1
或延迟 n
小时,始终可以引用以绘制用户角色。
对于拥有大量数据集的大公司,需要权衡取舍。我希望您现在可能对如何着手有了一个模糊的想法。
关于php - Redshift 作为替代或补充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42411509/