现在的位置: 首页 > 综合 > 正文

Cassandra数据模型

2013年09月10日 ⁄ 综合 ⁄ 共 1950字 ⁄ 字号 评论关闭

Cassandra数据模型

一、几个概念

Cluster:集群,一个逻辑上的cassandra实例包含的节点。一个集群可以包含多个keyspace。 
Keyspace:Column Family的名字空间,通常是一个应用一个keyspace。 
Column Family:包含多个column,每个column包括name,value, timestamp。Column Family通过Row key引用。 
Super Column:可以看作其column包含subcolumn。 
Column:包括name,value, timestamp。 

二、Column

Column是数据写入最小单元。它是一个三元组(name, value, timestamp)。 
用Thrift接口的定义如下:
 

struct Column {  
  1: binary name,  
  2: binary value,  
  3: i64 timestamp,  
}  

用JSON格式可以表示为: 

{  
  "name": "emailAddress",  
  "value": "foo@bar.com",  
  "timestamp": 123456789  
}  

三、Column Families 

Column Family是columns的容器。类似于关系数据库中的表。在storage-config.xml文件中定义。如果添加或者更改CF,则需要重新启动cassandra实例。Column Family持有对columns的引用ConcurrentSkipListMap<columnName, IColumn> refcolumns,其中的column是排好序的。CF中的columns的排序可以是ASCII, UTF-8, Long, 或者UUID。 

四、Rows 

在cassandra中,每个CF存储在一个单独的文件中。文件是按照row key排序的,这为了以后便于数据压缩。row key决定了数据应该存储在哪一台机器上面,因此一个row key可能有多个CF与之关联(在内存中以RowMutation结构表示,其结构为(key, Map<cfName, ColumnFamily> modifications)),然而这些CF之间可能并没有逻辑上的关系。当一个key对应多个CF时,thrift接口的查询每次只返回一个CF。Row的内存结构为Row(key,cfName)。 
一个key->column families->column的json格式如下: 

{  
   "mccv":{  
      "Users":{  
         "emailAddress":{"name":"emailAddress", "value":"foo@bar.com"},  
         "webSite":{"name":"webSite", "value":"http://bar.com"}  
      },  
      "Stats":{  
         "visits":{"name":"visits", "value":"243"}  
      }  
   },  
   "user2":{  
      "Users":{  
         "emailAddress":{"name":"emailAddress", "value":"user2@bar.com"},  
         "twitter":{"name":"twitter", "value":"user2"}  
      }  
   }  
}  

其中mccv和user2为row key。mccv这个key关联了两个CF:Users和Stats,但是这并不是说这两个CF之间的数据有联系。 

五、Super Columns 

Super Column相当于是包含了多个subcolumn的column。其内存结构为SuperColumn(byte[] name, ConcurrentSkipListMap<byte[], IColumn> columns),显然是包括了name和columns的集合的映射。 如下JSON所示: 

 

{  
  "mccv": {  
    "Tags": {  
      "cassandra": {  
 "incubator": {"incubator": "http://incubator.apache.org/cassandra/"},  
 "jira": {"jira": "http://issues.apache.org/jira/browse/CASSANDRA"}  
 },  
      "thrift": {  
 "jira": {"jira": "http://issues.apache.org/jira/browse/THRIFT"}  
 }  
    }  
  }  
}  

mccv为row key,Tags为Column Family,cassandra和thrift为Super Column Name。后面的则为column的结构。即要得到数据,需要比Column多一步,即Column Family->SuperColumnName->ColumnName->Column。

抱歉!评论已关闭.