每个分区键的 Cassandra 大小限制
Cassandra size limit per partition key
我在 cassandra 中有这个 table :
CREATE TABLE adress (
adress_id uuid,
adress_name text,
key1 text,
key2 text,
key3 text,
key4 text,
effective_date timestamp,
value text,
active boolean,
PRIMARY KEY ((adress_id, adress_name), key1, key2, key3, key4, effective_date)
)
据我了解,cassandra会根据分区键(adress_id,adress_name)分配table地址的数据。
当我尝试在它们共享相同的地方插入太多数据时存在风险 (adress_id,adress_name)..
我想在插入数据之前进行检查,检查是这样进行的:
- 我和这对夫妇在 cassandra 中已经有多少数据(adress_id,adress_name),假设它是 5MO。
- 我需要检查我尝试插入的数据大小是否不超过每个分区键的 Cassandra 限制 减去 Cassandra 中的现有数据。
我的问题是如何查询 cassandra 以获得 数据大小 与这对夫妇 (adress_id, adress_name)。
在那之后,Cassandra 中分区键 的 大小限制是多少。
正如 Alex Ott 上面提到的,您应该花更多时间在数据模型上,首先通过不同方式组织数据或人为地将分区分成更多部分(例如,时间-系列数据通常每天将数据拆分到一个单独的分区中,例如)。
计算出分区的现有大小在技术上是可能的,但它永远不会有效。要理解原因,您需要回顾一下 Cassandra 存储数据的方式。单个分区的内容并不总是存储在同一个 sstable(磁盘文件)中——同一个分区的数据可能分布在多个文件中。一个文件可能有几行,另一个文件可能有几行,第三个文件可能删除或修改一些旧行,等等。为了计算出分区的长度,Cassandra 需要读取所有这些数据,将它们合并在一起,并测量结果的大小。 Cassandra not 通常在写入时这样做——它只是将新的更新写入内存(最终是一个新的 sstable),而不先读取旧数据。这就是使 Cassandra 中的写入速度如此之快的原因 - 在每次写入之前读取整个分区的想法会大大减慢它们的速度。
最后,虽然 Cassandra 不能很好地处理巨大的分区,但如果开发人员想要解决这个问题,也没有内在的原因说明它永远做不到。 Cassandra 克隆 Scylla 的开发人员担心这个问题,并正在努力改进它,但即使在 Scylla 中,对巨大分区的处理也并不完美。但最终会的。几乎 - 单个分区(根据定义,存储在单个节点上)的大小总是有一个限制,作为单个磁盘的大小。如果您的数据模型真的被破坏并且您最终可能在单个分区中有 1 TB 的数据,这个限制也可能成为一个严重的问题。
我在 cassandra 中有这个 table :
CREATE TABLE adress (
adress_id uuid,
adress_name text,
key1 text,
key2 text,
key3 text,
key4 text,
effective_date timestamp,
value text,
active boolean,
PRIMARY KEY ((adress_id, adress_name), key1, key2, key3, key4, effective_date)
)
据我了解,cassandra会根据分区键(adress_id,adress_name)分配table地址的数据。
当我尝试在它们共享相同的地方插入太多数据时存在风险 (adress_id,adress_name)..
我想在插入数据之前进行检查,检查是这样进行的:
- 我和这对夫妇在 cassandra 中已经有多少数据(adress_id,adress_name),假设它是 5MO。
- 我需要检查我尝试插入的数据大小是否不超过每个分区键的 Cassandra 限制 减去 Cassandra 中的现有数据。
我的问题是如何查询 cassandra 以获得 数据大小 与这对夫妇 (adress_id, adress_name)。 在那之后,Cassandra 中分区键 的 大小限制是多少。
正如 Alex Ott 上面提到的,您应该花更多时间在数据模型上,首先通过不同方式组织数据或人为地将分区分成更多部分(例如,时间-系列数据通常每天将数据拆分到一个单独的分区中,例如)。
计算出分区的现有大小在技术上是可能的,但它永远不会有效。要理解原因,您需要回顾一下 Cassandra 存储数据的方式。单个分区的内容并不总是存储在同一个 sstable(磁盘文件)中——同一个分区的数据可能分布在多个文件中。一个文件可能有几行,另一个文件可能有几行,第三个文件可能删除或修改一些旧行,等等。为了计算出分区的长度,Cassandra 需要读取所有这些数据,将它们合并在一起,并测量结果的大小。 Cassandra not 通常在写入时这样做——它只是将新的更新写入内存(最终是一个新的 sstable),而不先读取旧数据。这就是使 Cassandra 中的写入速度如此之快的原因 - 在每次写入之前读取整个分区的想法会大大减慢它们的速度。
最后,虽然 Cassandra 不能很好地处理巨大的分区,但如果开发人员想要解决这个问题,也没有内在的原因说明它永远做不到。 Cassandra 克隆 Scylla 的开发人员担心这个问题,并正在努力改进它,但即使在 Scylla 中,对巨大分区的处理也并不完美。但最终会的。几乎 - 单个分区(根据定义,存储在单个节点上)的大小总是有一个限制,作为单个磁盘的大小。如果您的数据模型真的被破坏并且您最终可能在单个分区中有 1 TB 的数据,这个限制也可能成为一个严重的问题。