我有一张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将根据分区键(address\u id,address\u name)分发表address的数据。
当我试图插入太多共享相同数据(地址\标识、地址\名称)时,会有风险。。
我想在插入数据之前进行检查,检查过程如下:
我在Cassandra有多少关于这对夫妇的数据(地址id,地址name),假设是5mo。
我需要检查我试图插入的数据的大小是否超过每个分区键的cassandra限制减去cassandra中的现有数据。
我的问题是如何查询cassandra以获得这对夫妇的数据大小(address\u id,address\u name)。之后,在cassandra中分区键的大小限制是多少。
1条答案
按热度按时间tkclm6bt1#
正如alex ott在上面提到的,您应该在数据模型上花费更多的时间,以避免首先出现巨大分区的可能性,方法是以不同的方式组织数据,或者通过人为地将分区拆分为更多的部分(例如,时间序列数据通常每天将数据拆分为单独的分区)。
从技术上讲,计算分区的现有大小是可能的,但它永远不会有效。要理解原因,您需要回想一下cassandra是如何存储数据的。单个分区的内容并不总是存储在同一个sstable(磁盘文件)中—同一分区的数据可能分布在多个文件中。一个文件可能有几行,另一个文件可能有更多的行,第三个文件可能删除或修改一些旧的行,依此类推。为了计算分区的长度,cassandra需要读取所有这些数据,将它们合并在一起,并测量结果的大小。cassandra通常不会在写操作中执行此操作—它只是将新的更新写入内存(并最终写入一个新的sstable),而不首先读取旧数据。这就是为什么在cassandra中写的速度如此之快,而您在每次写之前读取整个分区的想法将大大降低它们的速度。
最后,虽然cassandra不能很好地处理巨大的分区,但是如果开发人员想要解决这个问题,它就没有内在的理由永远不能做到。cassandra克隆版scylla a的开发人员担心这个问题,并正在努力改进它,但即使在scylla中,对巨大分区的处理也不是完美的。但最终会的。几乎-单个分区(根据定义,存储在单个节点上)的大小与单个磁盘的大小总是有限制的。如果您的数据模型真的被破坏了,并且您可以在单个分区中得到一个TB的数据,那么这个限制也可能成为一个严重的问题。