Cassandra UUID 分区键和分区大小
Cassandra UUID partition key and partition size
给定一个 table
CREATE TABLE sensors_by_id (
id uuid,
time timeuuid,
some_text text,
PRIMARY KEY (id, time)
)
当有很多条目时,这个会缩放吗?我不确定,如果 UUID 字段足以作为一个好的分区键,或者是否需要创建一些人工键,如 week_first_day 或类似的东西?
这实际上取决于您将如何插入数据 - 如果您为每次插入真正随机生成 UUID,那么重复的机会 is very low,您将得到所谓的 "skinny rows"(很多分区里面有 1 行)。即使开始重复,每一行也不会那么多...
这可能是分区大小的问题,因为 cassandra 对每个分区的磁盘大小有限制。
好的经验法则是将最大行数保持在 100,000 项以下 并且 磁盘大小保持在 100 MB 以下。
使用该公式很容易计算分区大小
您可以阅读有关数据建模的更多信息here。
因此,在您的情况下,1 000 000 行数 每个分区 的当前模式平均大小 100 some_text 列的 字节为:
Number of Values: (1000000 * (3 - 2 - 0) + 0) = 1000000
Partition Size on Disk: (16 + 0 + (1000000 * 116) + (8 * 1000000))
= 124000016 bytes (118.26 Mb)
因此您可以看到每个分区 118.26 Mb 超出了限制。所以你需要优化你的分区键。
我使用我的开源项目计算了它 - cql-calculator。
给定一个 table
CREATE TABLE sensors_by_id (
id uuid,
time timeuuid,
some_text text,
PRIMARY KEY (id, time)
)
当有很多条目时,这个会缩放吗?我不确定,如果 UUID 字段足以作为一个好的分区键,或者是否需要创建一些人工键,如 week_first_day 或类似的东西?
这实际上取决于您将如何插入数据 - 如果您为每次插入真正随机生成 UUID,那么重复的机会 is very low,您将得到所谓的 "skinny rows"(很多分区里面有 1 行)。即使开始重复,每一行也不会那么多...
这可能是分区大小的问题,因为 cassandra 对每个分区的磁盘大小有限制。
好的经验法则是将最大行数保持在 100,000 项以下 并且 磁盘大小保持在 100 MB 以下。
使用该公式很容易计算分区大小
您可以阅读有关数据建模的更多信息here。
因此,在您的情况下,1 000 000 行数 每个分区 的当前模式平均大小 100 some_text 列的 字节为:
Number of Values: (1000000 * (3 - 2 - 0) + 0) = 1000000
Partition Size on Disk: (16 + 0 + (1000000 * 116) + (8 * 1000000))
= 124000016 bytes (118.26 Mb)
因此您可以看到每个分区 118.26 Mb 超出了限制。所以你需要优化你的分区键。
我使用我的开源项目计算了它 - cql-calculator。