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

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

估算 Amazon Keyspaces 中的行大小

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

本主题详细介绍了如何估计 Amazon Keyspaces 中行的编码大小。在计算账单和限额使用量时,应使用编码行大小。在估算表的预配置吞吐量容量要求时,也可以使用编码后的行大小。

要计算 Amazon Keyspaces 中的编码行大小,可以遵循以下准则。

估计列的编码大小

本节介绍如何估计 Amazon Keyspaces 中列的编码大小。

  • 常规列-对于常规列(即不是主键的列)、聚类列或STATIC列,请根据数据类型使用单元格数据的原始大小并添加所需的元数据。下一节将列出数据类型以及 Amazon Keyspaces 存储数据类型值和元数据方式的一些主要区别。

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

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

    注意

    为了支持高效的查询和内置索引,Amazon Keyspaces 将每个分区键和集群键列的数据值存储两次。

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

    • 1–62 个列:1 个字节

    • 63–124 个列:2 个字节

    • 125–186 个列:3 个字节

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

根据数据类型估计数据值的编码大小

本节介绍如何估计 Amazon Keyspaces 中不同数据类型的编码大小。

  • 字符串类型 — Cassandra ASCII TEXT、和VARCHAR字符串数据类型都使用UTF带有 -8 二进制编码的 Unicode 存储在 Amazon Keyspaces 中。Amazon Keyspaces 中字符串的大小等于 UTF -8 编码字节的数量。

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

  • Blob 类型 — Amazon Keyspaces BLOB 中的 A 以该值的原始字节长度存储。

  • 布尔类型-值或Boolean值的大小Null为 1 字节。

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

  • 用户定义的类型-用户定义的类型 (UDT) 无论其内容如何,都需要 3 个字节的元数据。对于每个UDT元素,Amazon Keyspaces 需要额外提供 1 字节的元数据。

    要计算 a 的编码大小UDT,请从 a 的字段field valuefield name和开始:UDT

    • 字段名-顶级字段的每个名称UDT都使用标识符存储。标识符的存储值取决于顶层字段的总数UDT,可以在 1 到 3 个字节之间变化:

      • 1—62 个字段:1 个字节

      • 63—124 个字段:2 个字节

      • 125— 最大字段数:3 个字节

    • 字段值-存储顶级字段值所需的字节UDT取决于存储的数据类型:

      • 标量数据类型-存储所需的字节与存储在常规列中的相同数据类型所需的字节相同。

      • F rozen UDT — 对于每个冻结的嵌套 UDTUDT,嵌套的大小与CQL二进制协议中的大小相同。对于嵌套的UDT,每个字段(包括空字段)存储 4 个字节,存储字段的值是字段值的CQL二进制协议序列化格式。

      • 冰雪奇缘系列

        • LISTand SET— 对于嵌套的冻结LISTSET,为集合的每个元素存储 4 个字节,再加上集合值的CQL二进制协议序列化格式。

        • MAP— 对于嵌套的冻结MAP,每个键值对都有以下存储要求:

          • 为每个密钥分配 4 个字节,然后添加密钥的CQL二进制协议序列化格式。

          • 为每个值分配 4 个字节,然后添加该值的CQL二进制协议序列化格式。

  • FROZEN关键字 — 对于嵌套在冻结集合中的冻结集合,Amazon Keyspaces 不需要任何额外的字节来存储元数据。

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

考虑一下 Amazon Keyspaces 功能对行大小的影响

本节显示 Amazon Keyspaces 中的功能如何影响行的编码大小。

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

选择正确的公式来计算一行的编码大小

本节显示了不同的公式,您可以使用这些公式来估计 Amazon Keyspaces 中一行数据的存储或容量吞吐量需求。

根据您的目标,可以根据以下公式之一估算出一行数据的总编码大小:

  • 吞吐容量-要估计一行的编码大小以评估所需容量read/write request units (RRUs/WRUs) or read/write capacity units (RCUs/WCUs):

    total encoded size of row = partition key columns + clustering columns + regular columns
  • 存储大小-要估计行的编码大小以预测BillableTableSizeInBytes,请添加该行存储所需的元数据:

    total encoded size of row = partition key columns + clustering columns + regular columns + row metadata (100 bytes)
重要

所有列元数据(例如列 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