1

我在 cassandra 有这张桌子:

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)分配表地址的数据。

当我尝试在它们共享相同(adress_id,adress_name)的地方插入太多数据时存在风险。

我想在插入数据之前进行检查,检查是这样进行的:

  1. 我和这对夫妇(adress_id,adress_name)在 cassandra 中已经有多少数据,假设它是 5MO。
  2. 我需要检查我尝试插入的数据大小是否不超过每个分区键的 Cassandra 限制减去 cassandra 中的现有数据。

我的问题是如何查询 cassandra 以获取这对夫妇的数据大小(adress_id,adress_name)。之后,Cassandra中分区键的大小限制是多少。

4

1 回答 1

6

正如 Alex Ott 上面提到的,您应该在数据模型上花费更多时间,以避免首先出现巨大分区的可能性,方法是以不同的方式组织数据,或者人为地将分区拆分为更多部分(例如,时间序列数据经常拆分例如,每天将数据放入一个单独的分区中)。

在技​​术上可以计算出分区的现有大小,但它永远不会有效。要了解原因,您需要回忆一下 Cassandra 是如何存储数据的。单个分区的内容并不总是存储在同一个 sstable(磁盘文件)中——同一个分区的数据可能分布在多个文件中。一个文件可能有几行,另一个文件可能有更多行,第三个文件可能删除或修改一些旧行,依此类推。为了计算分区的长度,Cassandra 需要读取所有这些数据,将它们合并在一起,然后测量结果的大小。卡桑德拉没有通常在写入时执行此操作 - 它只是将新的更新写入内存(并最终写入新的 sstable),而不先读取旧数据。这就是 Cassandra 中写入速度如此之快的原因——而您在每次写入之前读取整个分区的想法会大大减慢它们的速度。

最后,虽然 Cassandra 不能很好地处理大分区,但如果开发人员想要解决这个问题,它也没有内在的原因。Cassandra 克隆 Scylla 的开发人员担心这个问题,并正在努力改进它,但即使在 Scylla 中,对巨大分区的处理也并不完美。但最终会的。几乎 - 单个分区的大小(根据定义,存储在单个节点上)作为单个磁盘的大小总是有限制的。如果你的数据模型真的被破坏了,这个限制也可能成为一个严重的问题,并且你最终可能会在单个分区中得到一个 TB。

于 2019-01-08T09:05:21.897 回答