使用写入分片在 Amazon Keyspaces 中均匀分配工作负载 - Amazon Keyspaces(针对 Apache Cassandra)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用写入分片在 Amazon Keyspaces 中均匀分配工作负载

在 Amazon Keyspaces 中的分区之间更好地分配写入的一种方式是扩展空间。可以通过多种不同的方式执行此操作。您可以添加一个附加分区键列,向其写入随机数字以在分区之间分配行。或者,您可以使用根据您正在查询的内容计算的数字。

使用复合分区键和随机值进行分片

跨分区更均匀地分配负载的一种策略是添加您将随机数字写入到的其他分区键列。然后跨更大型的空间随机化写入。

例如,请考虑以下表,该表具有一个代表日期的分区键。

CREATE TABLE IF NOT EXISTS tracker.blogs ( publish_date date, title string, description int, PRIMARY KEY (publish_date));

要跨分区更均匀地分配此表,您可以包含一个shard存储随机数的附加分区键列。例如:

CREATE TABLE IF NOT EXISTS tracker.blogs ( publish_date date, shard int, title string, description int, PRIMARY KEY (publish_date, shard));

在插入数据时,您可以1200列选择介于 shard 和 之间的随机数。这将生成复合分区键值,如 (2020-07-09, 1)(2020-07-09, 2)等,直到 (2020-07-09, 200)。由于随机化分区键,因此将跨多个分区均匀分布每天对表的写入。这将提高并行度和总体吞吐量。

但是,要读取指定日期的所有行,您必须查询所有分片的行,然后合并结果。例如,您将首先为分区键值 发出 SELECT 语句(2020-07-09, 1)。然后,为 发出另一个SELECT语句(2020-07-09, 2),以此类推,直至 (2020-07-09, 200)。最后,您的应用程序必须合并所有这些SELECT语句的结果。

使用复合分区键和计算值进行分片

随机化策略可以显著提高写入吞吐量。但是,难以读取特定行,因为您不知道在写入行时哪个值被写入到 shard 列中。为了更轻松地读取单个行,您可以使用其他策略。使用可根据查询内容计算出的数字,而不是使用随机数在分区之间分配行。

请考虑上述示例,其中表在分区键中使用当天日期。现在,假设每行都有一个可访问title的列,并且除了日期之外,您通常需要按标题查找行。在应用程序将行写入表中之前,它可以根据标题计算哈希值并使用它填充shard列。此计算可能生成一个介于 1 和 200 之间、分发甚是均匀的数字 (类似于随机策略所生成的数字)。

简单的计算可能已足够,例如,标题中字符的 UTF-8 代码点值的积,取模 200,+ 1。然后,复合分区键值将是日期和计算结果的组合。

通过此策略,写入将在分区键值之间均匀分布,从而在物理分区之间均匀分布。您可以轻松为特定行和日期执行SELECT语句,因为您可以计算特定值的分区键title值。

要读取指定日期的所有行,您仍必须SELECT每个(2020-07-09, N)键 (其中 N 为 1–200),然后您的应用程序必须合并所有结果。好处是避免了一个“热点”分区键值占用所有工作负载。