Amazon Redshift 架构设计

Amazon Redshift schema design

我们正在考虑使用 Amazon Redshift 来实施我们的数据仓库,我想要一些关于如何在 Redshift 中正确设计模式的建议。

我对 Redshift 完全陌生。过去,当我使用 "traditional" 数据仓库时,我习惯于创建 "Source"、"Stage"、"Final" 等模式,以根据需要对所有数据库对象进行分组数据处于什么阶段。

默认情况下,Redshift 中的数据库只有一个模式,名为 PUBLIC。那么,我想问那些使用过 Redshift 的人,我上面概述的方法在这里适用吗?如果没有,我会喜欢一些建议。

谢谢。

一个 Redshift 集群中可以有多个数据库,但我会坚持使用一个。你是正确的,模式(本质上是名称空间)是划分事物的好方法。您可以跨模式查询,但不能跨数据库查询。

我会避免使用 public 模式,因为管理某些权限可能很困难(拒绝某人访问 public 比阻止他们创建 table 更容易例如)。

为了获得最佳效果(如果您有时间),请预先了解权限系统。您希望 create groups that have access to schemas or tables 和 add/remove 组中的用户控制他们可以做什么。一旦你开始这样做,它就变得非常容易管理。

根据我使用 Redshift 的经验,我可以自信地断言以下几点:

  1. 多模式:您应该创建多模式并相应地创建table。进行缩放时,您可以更轻松地确定 table 的确切位置。比方说,您有 3 个模式,名为 productionaggregatesrough。现在,您知道 table production 将包含不应更改的 tables(主要是 OLTP 数据)- 例如user, order, transactions table秒。 Table aggregates 将在原始 table 上构建聚合数据 - 例如 number of orders placed per user per day per category。最后,rough 将包含任何不包含业务逻辑但某些临时工作需要的 table - 让我们说检查电影的类型10 万用户的列表,在 excel 文件中与您共享。只需在 rough 模式中创建一个 table,执行您的操作并删除 table。现在您可以根据 table 是原始的、聚合的还是临时的 table 清楚地知道在哪里可以找到它们。

  2. Public schema:忘了它的存在吧。任何前面没有模式名称的 table 都会在那里创建。杂乱无章 - 在那里存储任何重要数据毫无意义。

  3. 跨模式连接:这里没有停止。您可以根据需要从任意多个架构中加入任意多个 table。事实上,您最好创建维度 tables 并稍后加入 PK,而不是将所有信息保存在一个 table.
  4. 中。

花一些时间设计架构和底层 table 结构。当您扩展时,您可以更轻松地根据访问控制更好地对事物进行分类。如果我遗漏了一些明显的要点,请告诉我。

除了其他回复之外,这里还有一些提高架构性能的建议。

第一:使用COPY命令自动压缩编码

使用 COPY 命令提高 Amazon Redshift 的性能。它将数据导入 Redshift 数据库。 COPY 命令非常聪明。它会自动为其上传的数据选择最合适的编码设置。你不必考虑它。但是,它只对第一次将数据上传到空 table.

因此,请确保在首次上传数据时使用重要的数据集,Redshift 可以评估这些数据集以最佳方式设置列编码。上传几行测试数据会使 Redshift 感到困惑,不知道如何最好地优化压缩以处理实际工作负载。

第二:使用最佳分发方式和密钥

分布方式决定了数据在节点间的分布方式。在 table 级别应用分发样式会告诉 Redshift 您希望如何分发 table 和密钥。因此,如何指定分布样式对于 Redshift 的良好查询性能非常重要。您选择的样式可能会影响数据存储和集群的要求。它还会影响 COPY 命令执行所花费的时间。

我建议将分布样式设置为所有 table 尺寸较小的。对于大维度,将维度和相关事实分布在它们的连接列上。为了优化第二个大维度,采用存储命中并分配 ALL。您甚至可以将维度列设计到事实中。

第三:使用最佳排序键

Redshift 数据库在 table 中维护数据,如果指定,则使用排序键列的排列。因为它在每个分区中排序;每个集群节点都以预定义的顺序维护其分区。 (在设计您的 Redshift 架构时,还要考虑对预算的影响。Redshift 按存储数据量和节点数计算 priced。)

排序键显着优化了 Amazon Redshift 性能。您可以通过多种方式做到这一点。首先,使用数据过滤。如果 where 子句过滤排序键列,它会跳过整个数据块。这是因为 Redshift 以块的形式保存数据。每个区块头记录最小和最大排序键值。过滤超出该范围的内容,可能会跳过整个块。

或者,当连接两个 table 时,按它们的连接键排序,数据按匹配顺序读取。此外,您可以合并连接而无需单独的排序步骤。使用此方法将大维度连接到大事实 table 很容易,因为两者都不适合散列 table.