使用 Amazon Keyspaces 中的行 - Amazon Keyspaces(Apache Cassandra 兼容)
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

使用 Amazon Keyspaces 中的行

本节详细介绍如何使用 Amazon Keyspaces(Apache Cassandra 兼容)中的行。表是 Amazon Keyspaces 中的主要数据结构,而表中的数据则按列和行进行组织。

计算 Amazon Keyspaces 中的行大小

Amazon Keyspaces 提供完全托管式存储,可提供个位数毫秒级的读取和写入性能,还能在多个 Amazon 可用区中持久存储数据。Amazon Keyspaces 将元数据附加到所有行和主键列,以支持高效的数据访问和高可用性。

本节详细介绍如何估算 Amazon Keyspaces 中的编码行大小。在计算账单和限额使用量时,应使用编码行大小。在计算表的预置吞吐容量需求时,也应使用编码行大小。要计算 Amazon Keyspaces 中的编码行大小,可以遵循以下准则。

  • 对于常规列(即不是主键的列)、聚类列或 STATIC 列,根据数据类型使用单元格数据的原始大小并加上所需的元数据。有关 Amazon Keyspaces 中支持的数据类型的更多信息,请参阅数据类型。下面列出了 Amazon Keyspaces 存储数据类型值和元数据的方式的一些主要区别。

  • 每个列名称所需的空间使用列标识符进行存储,并添加到存储在列中的每个数据值。列标识符的存储值取决于表中列的总数:

    • 1–62 个列:1 个字节

    • 63–124 个列:2 个字节

    • 125–186 个列:3 个字节

    每增加 62 个列,添加 1 个字节。请注意,在 Amazon Keyspaces 中,使用单个 INSERTUPDATE 语句最多可修改 225 个常规列。有关更多信息,请参阅Amazon Keyspaces 服务限额

  • 分区键最多可包含 2048 个字节的数据。分区键中的每个键列最多需要 3 个字节的元数据。计算行大小时,应假设每个分区键列使用全部 3 个字节的元数据。

  • 聚类列最多可存储 850 个字节的数据。除了数据值的大小外,每个聚类列还要求元数据占数据值大小的 20%。计算行大小时,应为每 5 个字节的聚类列数据值添加 1 个字节的元数据。

  • Amazon Keyspaces 将每个分区键和聚类键列的数据值存储两次。额外的开销用于高效查询和内置索引。

  • Cassandra ASCIITEXTVARCHAR 字符串数据类型均使用采用 UTF-8 二进制编码的统一码存储在 Amazon Keyspaces 中。Amazon Keyspaces 中的字符串大小等于 UTF-8 编码的字节数。

  • Cassandra INTBIGINTSMALLINTTINYINT 数据类型以长度可变的数据值(最多可包含 38 位有效数字)的形式存储在 Amazon Keyspaces 中。系统会删减开头和结尾的 0。其中任何一种数据类型的大小约为每两个有效数字 1 个字节 + 1 个字节。

  • Amazon Keyspaces 中的 BLOB 以该值的原始字节长度进行存储。

  • Null 值或 Boolean 值的大小为 1 个字节。

  • 存储集合数据类型(例如 LISTMAP)的列需要 3 个字节的元数据,无论其内容如何。LISTMAP 的大小为(列 ID)+ 总和(嵌套元素的大小)+(3 个字节)。空 LISTMAP 的大小为(列 ID)+(3 个字节)。每个单个 LISTMAP 元素还需要 1 个字节的元数据。

  • STATIC 列数据不计入 1MB 的最大行大小。要计算静态列的数据大小,请参阅计算 Amazon Keyspaces 中每个逻辑分区的静态列大小

  • 启用该功能后,系统会为每行中的每个列存储客户端时间戳。这些时间戳大约占用 20-40 字节(取决于您的数据),并会增加该行的存储和吞吐量成本。有关更多信息,请参阅客户端时间戳在 Amazon Keyspaces 中的工作原理

  • 在行元数据的每行大小上增加 100 个字节。

编码数据行的总大小基于以下公式:

partition key columns + clustering columns + regular columns + row metadata = total encoded size of row
重要

所有列元数据(例如列 ID、分区键元数据、聚类列元数据以及客户端时间戳和行元数据)均计入 1MB 的最大行大小。

考虑以下表示例,其中所有列均为整数类型。此表包含两个分区键列、两个聚类列和一个常规列。由于此表包含五列,因此列名称标识符所需的空间为 1 个字节。

CREATE TABLE mykeyspace.mytable(pk_col1 int, pk_col2 int, ck_col1 int, ck_col2 int, reg_col1 int, primary key((pk_col1, pk_col2),ck_col1, ck_col2));

在此示例中,我们在向表中写入一行时计算数据的大小,如以下语句所示:

INSERT INTO mykeyspace.mytable (pk_col1, pk_col2, ck_col1, ck_col2, reg_col1) values(1,2,3,4,5);

要估算此写入操作所需的总字节数,可以按照以下步骤操作。

  1. 通过将存储在一个分区键列中的数据类型的字节和元数据字节相加,计算该列的大小。针对所有分区键列重复此操作。

    1. 计算分区键第一列 (pk_col1) 的大小:

      (2 bytes for the integer data type) x 2 + 1 byte for the column id + 3 bytes for partition key metadata = 8 bytes
    2. 计算分区键第二列 (pk_col2) 的大小:

      (2 bytes for the integer data type) x 2 + 1 byte for the column id + 3 bytes for partition key metadata = 8 bytes
    3. 将两列相加,得出分区键列的估算总大小:

      8 bytes + 8 bytes = 16 bytes for the partition key columns
  2. 通过将存储在一个聚类列中的数据类型的字节和元数据字节相加,计算该列的大小。针对所有聚类列重复此操作。

    1. 计算聚类列第一列 (ck_col1) 的大小:

      (2 bytes for the integer data type) x 2 + 20% of the data value (2 bytes) for clustering column metadata + 1 byte for the column id = 6 bytes
    2. 计算聚类列第二列 (ck_col2) 的大小:

      (2 bytes for the integer data type) x 2 + 20% of the data value (2 bytes) for clustering column metadata + 1 byte for the column id = 6 bytes
    3. 将两列相加,得出聚类列的估算总大小:

      6 bytes + 6 bytes = 12 bytes for the clustering columns
  3. 加上常规列的大小。在此示例中,我们只有一个列用于存储一个个位数整数,这需要 2 个字节,另外列 ID 还需要 1 个字节。

  4. 最后,要获得编码行总大小,请将所有列的字节相加,再加上行元数据所需的 100 个字节:

    16 bytes for the partition key columns + 12 bytes for clustering columns + 3 bytes for the regular column + 100 bytes for row metadata = 131 bytes.

要了解如何使用 Amazon CloudWatch 监控无服务器资源,请参阅使用亚马逊监控亚马逊密钥空间 CloudWatch