计算Cassandra中表的大小

Ped*_*rdo 10 cassandra

在Jeff Carpenter和Eben Hewitt的"Cassandra The Definitive Guide"(第2版)中,下面的公式用于计算磁盘上表格的大小(模糊部分的道歉):

表大小方程

  • ck:主键列
  • cs:静态列
  • cr:常规列
  • cc:聚类列
  • Nr:行数
  • Nv:它用于计算时间戳的总大小(我没有完全得到这个部分,但是现在我会忽略它).

在这个等式中我有两件事我不明白.

第一:为什么每个常规列都会计算聚类列的大小?我们不应该将它乘以行数吗?在我看来,通过这种方式计算,我们说每个聚类列中的数据都会被复制到每个常规列中,我认为并非如此.

第二:为什么主键列不会乘以分区数?根据我的理解,如果我们有一个带有两个分区的节点,那么我们应该将主键列的大小乘以2,因为我们在该节点中将有两个不同的主键.

Ash*_*lam 12

这是因为Cassandra的版本<3内部结构.

  • 每个不同的分区键值只有一个条目.
  • 对于每个不同的分区键值,静态列只有一个条目
  • 群集密钥有一个空条目
  • 对于一行中的每个列,每个群集键列都有一个条目

我们来举个例子:

CREATE TABLE my_table (
    pk1 int,
    pk2 int,
    ck1 int,
    ck2 int,
    d1 int,
    d2 int,
    s int static,
    PRIMARY KEY ((pk1, pk2), ck1, ck2)
); 
Run Code Online (Sandbox Code Playgroud)

插入一些虚拟数据:

 pk1 | pk2 | ck1 | ck2  | s     | d1     | d2
-----+-----+-----+------+-------+--------+---------
   1 |  10 | 100 | 1000 | 10000 | 100000 | 1000000
   1 |  10 | 100 | 1001 | 10000 | 100001 | 1000001
   2 |  20 | 200 | 2000 | 20000 | 200000 | 2000001
Run Code Online (Sandbox Code Playgroud)

内部结构将是:

             |100:1000:  |100:1000:d1|100:1000:d2|100:1001:  |100:1001:d1|100:1001:d2|  
-----+-------+-----------+-----------+-----------+-----------+-----------+-----------+
1:10 | 10000 |           |  100000   |  1000000  |           |  100001   |  1000001  |


             |200:2000:  |200:2000:d1|200:2000:d2|
-----+-------+-----------+-----------+-----------+ 
2:20 | 20000 |           |  200000   |  2000000  |
Run Code Online (Sandbox Code Playgroud)

所以表的大小将是:

Single Partition Size = (4 + 4 + 4 + 4) + 4 + 2 * ((4 + (4 + 4)) + (4 + (4 + 4))) byte = 68 byte

Estimated Table Size = Single Partition Size * Number Of Partition 
                     = 68 * 2 byte
                     = 136 byte
Run Code Online (Sandbox Code Playgroud)
  • 这里所有的字段类型都是int(4字节)
  • 有4个主键列,1个静态列,2个聚类键列和2个常规列

更多:http://opensourceconnections.com/blog/2013/07/24/understanding-how-cql3-maps-to-cassandras-internal-data-structure/


小智 7

作为作者,我非常感谢您提出的问题和您对材料的参与!

关于原始问题 - 请记住,这不是计算表大小的公式,而是计算单个分区大小的公式.目的是使用此公式与"最坏情况"行数来识别过大的分区.您需要将此等式的结果乘以分区数,以估算表的总数据大小.当然,这并不考虑复制.

还要感谢回答原始问题的人.根据您的反馈,我花了一些时间查看新的(3.0)存储格式,看看是否会影响公式.我同意Aaron Morton的文章是一个有用的资源(上面提供的链接).

该公式的基本方法对于3.0存储格式仍然是合理的.公式的工作方式,你基本上是添加:

  • 分区键和静态列的大小
  • 每行的聚类列的大小,乘以行数
  • 每个单元格的8个字节的元数据

更新3.0存储格式的公式需要重新访问常量.例如,原始等式假定每个单元格有8个字节的元数据来存储时间戳.新格式将单元格上的时间戳视为可选,因为它可以在行级别应用.因此,现在每个单元的元数据量可变,可能低至1-2个字节,具体取决于数据类型.

在阅读了这一反馈并重新阅读本章的这一部分之后,我计划对文本进行更新以增加一些说明以及关于此公式作为近似而非精确值有用的更强有力的警告.有些因素根本没有考虑,例如分布在多个SSTable上的写入以及墓碑.我们实际上计划在今年春天(2017年)进行另一次印刷以纠正一些勘误,所以很快就会寻找这些变化.


小智 7

以下是Artem Chebotko的更新公式:

式

t_avg是每个单元的平均元数据量,它可以根据数据的复杂性而变化,但是8是一个很好的最坏情况估计.