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

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

使用写分片在 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(对于 )shardcolumn. 这会产生复合分区键值,如(2020-07-09, 1)(2020-07-09, 2),以此类推,直至(2020-07-09, 200). 由于随机化分区键,因此将跨多个分区均匀分布每天对表的写入。这将提高并行度和总体吞吐量。

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

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

随机化策略可以显著提高写入吞吐量。但难以读取特定行,因为不知道将哪个值写入shard列中写入该行时。要使各行的读取变得简单,可使用其他策略。不是使用随机数在分区间分发行,而是使用可根据查询内容计算出的数字。

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

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

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

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