本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
估算 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 中,使用单个
INSERT
或UPDATE
语句最多可修改 225 个常规列。有关更多信息,请参阅 Amazon Keyspaces 服务限额。
根据数据类型估计数据值的编码大小
本节介绍如何估计 Amazon Keyspaces 中不同数据类型的编码大小。
字符串类型 — Cassandra
ASCII
TEXT
、和VARCHAR
字符串数据类型都使用UTF带有 -8 二进制编码的 Unicode 存储在 Amazon Keyspaces 中。Amazon Keyspaces 中字符串的大小等于 UTF -8 编码字节的数量。数字类型 — Cassandra
INT
BIGINT
、SMALLINT
、和TINYINT
数据类型作为长度可变的数据值存储在 Amazon Keyspaces 中,最多包含 38 位有效数字。系统会删减开头和结尾的 0。其中任何一种数据类型的大小约为每两个有效数字 1 个字节 + 1 个字节。Blob 类型 — Amazon Keyspaces
BLOB
中的 A 以该值的原始字节长度存储。布尔类型-值或
Boolean
值的大小Null
为 1 字节。集合类型-存储集合数据类型(如
LIST
或MAP
需要 3 字节的元数据)的列,无论其内容如何。LIST
或MAP
的大小为(列 ID)+ 总和(嵌套元素的大小)+(3 个字节)。空LIST
或MAP
的大小为(列 ID)+(3 个字节)。每个单个LIST
或MAP
元素还需要 1 个字节的元数据。用户定义的类型-用户定义的类型 (UDT) 无论其内容如何,都需要 3 个字节的元数据。对于每个UDT元素,Amazon Keyspaces 需要额外提供 1 字节的元数据。
要计算 a 的编码大小UDT,请从 a 的字段
field value
的field 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— 对于嵌套的冻结
LIST
或SET
,为集合的每个元素存储 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);
要估算此写入操作所需的总字节数,可以按照以下步骤操作。
通过将存储在一个分区键列中的数据类型的字节和元数据字节相加,计算该列的大小。针对所有分区键列重复此操作。
计算分区键第一列 (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
计算分区键第二列 (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
将两列相加,得出分区键列的估算总大小:
8 bytes + 8 bytes = 16 bytes for the partition key columns
通过将存储在一个聚类列中的数据类型的字节和元数据字节相加,计算该列的大小。针对所有聚类列重复此操作。
计算聚类列第一列 (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
计算聚类列第二列 (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
将两列相加,得出聚类列的估算总大小:
6 bytes + 6 bytes = 12 bytes for the clustering columns
加上常规列的大小。在此示例中,我们只有一个列用于存储一个个位数整数,这需要 2 个字节,另外列 ID 还需要 1 个字节。
最后,要获得编码后的总行大小,请将所有列的字节数相加。要估算存储的计费大小,请为行元数据添加额外 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。