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。
Columns
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。
分享到:
相关推荐
关于Cassandra数据模型的简单介绍
解Cassandra数据模型
Cassandra对象数据模型的安装包中文安装说明 以及使用例子一步到位哦
java导出cassandra数据
Cassandra分布式模型与源代码分析 分析了Cassandra的分布式模型
本文是Cassandra数据模型设计第一篇(全两篇),该系列文章包含了eBay使用Cassandra数据模型设计的一些实践。其中一些最佳实践我们是通过社区学到的,有些对我们来说也是新知识,还有一些仍然具有争议性,可能在要...
CASSANDRA分布式模型与源代码分析文茂V0.7 - CASSANDRA-SHAWN.doc
NULL 博文链接:https://cjcrobin.iteye.com/blog/1955984
它最初由Facebook开发,用于储存收件箱等简单格式数据,集GoogleBigTable的数据模型与Amazon Dynamo的完全分布式的架构于一身Facebook于2008将 Cassandra 开源,此后,由于Cassandra良好的可扩展性,被Digg、Twitter...
以Amazon专有的完全分布式的Dynamo为基础,结合了Google BigTable基于列族(Column Family)的数据模型。P2P去中心化的存储。很多方面都可以称之为Dynamo 2.0。 功能 Cassandra的主要特点就是它不是一个数据库,...
存储数据(cassandra)
它最初由Facebook开发,用于储存收件箱等简单格式数据,集GoogleBigTable的数据模型与Amazon Dynamo的完全分布式的架构于一身Facebook于2008将 Cassandra 开源,此后,由于Cassandra良好的可扩展性,被Digg、Twitter...