了解Cassandra的存储开销

问题描述 投票:6回答:1

我一直在阅读卡桑德拉文档的this section,发现有点令人费解了以下内容:

确定塔顶的:

regular_total_column_size = column_name_size + column_value_size + 15

计数器 - expiring_total_column_size = column_name_size + column_value_size + 23

在卡桑德拉每一列招15个字节的开销。由于表的每一行可以有不同的列名以及列的不同数量,元数据被存储为每一列。对于计数器列和到期列,您应该添加一个额外的8个字节(23个字节总数)。

我的方式解释上述的CQL3定义的架构,例如:

CREATE TABLE mykeyspace.mytable(
  id text,
  report_id text,
  subset_id text,
  report_date timestamp,
  start_date timestamp,
  end_date timestamp,
  subset_descr text,
  x int,
  y double,
  z int,
  PRIMARY KEY (id, report_id, subset_id)
);

是,每行将包含列名中的元数据,例如,字符串report_datestart_dateend_date等,以及它们的类型与数据一起。然而,这不是我清楚这是什么意思,在表的每一行可以有不同的列名。这听起来我错了上面给出的模式是完全静态的,即,卡珊德拉2.0肯定会抱怨,如果我尝试写:

INSERT INTO mykeyspace.mytable (id, report_id , subset_id, x, y, z, w) 
VALUES ( 'asd','qwe','rty',100,1.234,12, 123.123);

Bad Request: Unknown identifier w

现在,它看起来对我来说列名是固定的给这个表架构,因此元数据不应该需要每每一行存储。我猜测,无论是文档中的措辞已经过时了(这是一样的卡珊德拉1.2),或者我在这里工作的一些误解核心理念。

任何人都可以澄清?底线:我担心我的专栏或没有名称的长度是多少?

我们一直在打它的安全和使用单个字符的名称在可能的情况(所以上面列实际上是irsdrdsdesd,...),但它是如此非人可读取,然后是混乱跟...共事。

cassandra cql cql3 cassandra-2.0
1个回答
9
投票

搞清楚什么是在这样的情况下怎么回事,最简单的方法是检查你的数据的sstable2json(卡桑德拉/箱)表示。这将告诉你什么是最终实际被保存在磁盘上。

这是适合自己情况的例子

 [
 {"key": "4b6579","columns": [
       ["rid1:ssid1:","",1401469033325000],
       ["rid1:ssid1:end_date","2004-10-03 00:00:00-0700",1401469033325000],
       ["rid1:ssid1:report_date","2004-10-03 00:00:00-0700",1401469033325000],
       ["rid1:ssid1:start_date","2004-10-03 00:00:00-0700",1401469033325000], 
       ["rid1:ssid1:subset_descr","descr",1401469033325000],
       ["rid1:ssid1:x","1",1401469033325000], 
       ["rid1:ssid1:y","5.5",1401469033325000],
       ["rid1:ssid1:z","1",1401469033325000],
       ["rid2:ssid2:","",1401469938599000],
       ["rid2:ssid2:end_date", "2004-10-03 00:00:00-0700",1401469938599000],
       ["rid2:ssid2:report_date","2004-10-03 00:00:00-0700",1401469938599000],
       ["rid2:ssid2:start_date","2004-10-03 00:00:00-0700",1401469938599000], 
       ["rid2:ssid2:subset_descr","descr",1401469938599000],
       ["rid2:ssid2:x","1",1401469938599000],
       ["rid2:ssid2:y","5.5",1401469938599000],
       ["rid2:ssid2:z","1",1401469938599000]
 }
 ]

分区键的值是每个分区(每个的SSTable),你可以在上面看到保存一次,在这种情况下,列名称并不重要,因为在所有它是隐含给出的表格。对于聚类列的列名也不存在,因为与C *你不能没有指定密钥的所有部分插入。

请告诉我虽然离开确实有列名,这是需要柜面局部更新到行由因此它可以保存没有的行信息的其余部分。你能想象一个更新单列场连胜,以表明这是场C *目前使用的列名,但也有门票,将其更改为一个较小的表示。 https://issues.apache.org/jira/browse/CASSANDRA-4175

产生这种

cqlsh
CREATE TABLE mykeyspace.mytable(   id text,   report_id text,   subset_id text,   report_date timestamp,   start_date timestamp,   end_date timestamp,   subset_descr text,   x int,   y double,   z int,   PRIMARY KEY (id, report_id, subset_id) );
INSERT INTO mykeyspace.mytable (id, report_id , subset_id , report_date , start_date , end_date , subset_descr ,x, y, z) VALUES ( 'Key', 'rid1','ssid1', '2004-10-03','2004-10-03','2004-10-03','descr',1,5.5,1);
INSERT INTO mykeyspace.mytable (id, report_id , subset_id , report_date , start_date , end_date , subset_descr ,x, y, z) VALUES ( 'Key', 'rid2','ssid2', '2004-10-03','2004-10-03','2004-10-03','descr',1,5.5,1);
exit;
nodetool flush
bin/sstable2json $DATA_DIR/mytable/mykeyspace-mytable-jb-1-Data.db 
© www.soinside.com 2019 - 2024. All rights reserved.