zoukankan      html  css  js  c++  java
  • Cassandra 的数据存储结构——本质是SortedMap<RowKey, SortedMap<ColumnKey, ColumnValue>>

    Cassandra 的数据存储结构

    Cassandra 的数据模型是基于列族(Column Family)的四维或五维模型。它借鉴了 Amazon 的 Dynamo 和 Google's BigTable 的数据结构和功能特点,采用 Memtable 和 SSTable 的方式进行存储。在 Cassandra 写入数据之前,需要先记录日志 ( CommitLog ),然后数据开始写入到 Column Family 对应的 Memtable 中,Memtable 是一种按照 key 排序数据的内存结构,在满足一定条件时,再把 Memtable 的数据批量的刷新到磁盘上,存储为 SSTable 。

    图 1. Cassandra 的数据模型图:

    1. Cassandra 的数据模型的基本概念:
    2. Cluster : Cassandra 的节点实例,它可以包含多个 Keyspace
    3. Keyspace : 用于存放 ColumnFamily 的容器,相当于关系数据库中的 Schema 或 database——类似mongodb里的namespace use xxx;
    4. ColumnFamily : 用于存放 Column 的容器,类似关系数据库中的 table 的概念
    5. SuperColumn :它是一个特列殊的 Column, 它的 Value 值可以包函多个 Column
    6. Columns:Cassandra 的最基本单位。由 name , value , timestamp 组成

    下面是关于数据模型实例分析 :

    图 2. 数据模型实例分析

    图 2. 数据模型实例分析

    说明:

    (1) column family插入数据的方法

    (2) Super column family插入数据的方法

    从上图可以看出,SCF能够支持5维数据空间(分别为:keyspace,column family,super key, key, column name)

    下面摘自:http://www.justinablog.com/archives/882 可以看到,和上文的描述是一致的!

    列(Column)

    如果你对“列”的理解来自于关系型数据库,那么很容易产生和我之前一样的误解,以为Cassandra是把关系型数据库的行列进行了某种倒置而得到 的设计。其实不是这样的,Cassandra的列是一组键值对,它的结构如下图所示(事实上,这个数据结构是Cassandra 0.7.0,最新的2.0.3版本中ByteBuffer替代了byte[],long型的日期时间替代了IClock):

    09125500_v5Xx

    使用JSON描述的列结构:

    {
        "name": "email",
        "value: "me@example.com",
        "timestamp": 1274654183103300
    }

    超级列(Super Column)的结构:

    09125501_4lo3

    复合键(Composite Keys)

    有时我们会遇到不同省份可能有同样的城市名称,或不同的城市有重名的街道,这时使用单一的城市名称或街道名称来作为Key就会无法识别。 Cassandra允许你使用Key1:Key2的结构来存储一对值作为Key,一个常见的例子是使 用<userid:lastupdate>这样的结构来存储用户ID及最后登录时间。下面是一个例子:

    HotelByCity (CF) Key: city:state {
        key: Phoenix:AZ {AZC_043: -, AZS_011: -}
        key: San Francisco:CA {CAS_021: -}
        key: New York:NY {NYN_042: -}
    }

    最后让我们来巩固一下Cassandra和关系型数据库的区别吧:

    • 没有查询语言:No SQL (Structured Query Language);
    • 没有外键约束:关系型数据库的最重要特征;
    • 双重簇索引:在关系型数据库中,每个表只能指定一个簇索引,其它的索引查询都会导致全表扫描,但在Cassandra中,我们可以有第二级的簇索引;
    • 排序是在设计时决策:Cassandra不支持Order By,排序是需要设计时考虑,而不是像在关系型数据库查询时刻使用Order By;
    • 无数据结构约定:这是Cassandra最大的优势,在关系型数据库中,我们设计数据库结构时总是慎之又慎,但在Cassandra中不需要预先约定数据结构。

    本文参考自《Cassandra: The Definitive Guide》

    Cassandra数据模型

    Colum / Colum Family, SuperColum / SuperColum Family

    Column是数据增量最底层(也就是最小)的部分。它是一个包含名称(name)、值(value)和时间戳(timestamp)的三重元组。

    下面是一个用JSON格式表示的column:

    {  // 这是一个Column

    name: "emailAddress", 

    value: "arin@example.com",

    timestamp: 123456789  

    }       

    需要注意的是,name和value都是二进制的(技术上指byte[]),并且可以是任意长度。

    与HBase相比,除了Colum/Colum Family外,Cassandra还支持SuperColum/SuperColum Family。

    SuperColum与Colum的区别就是,标准Column的value是一个“字符串”,而 SuperColumn的value是一个包含多个Column的map,另一个细微的差别是:SuperColumn没有时间戳。

    { // 这是一个SuperColumn 

    name: "homeAddress",

    // 无限数量的Column   

    value: { 

    street: {name: "street", value: "1234 x street", timestamp: 123456789},

    city: {name: "city", value: "san francisco", timestamp: 123456789}, 

    zip: {name: "zip", value: "94107", timestamp: 123456789},

    }

    }

    Column Family(CF)是某个特定Key的Colum集合,是一个行结构类型,每个CF物理上被存放在单独的文件中。从概念上看,CF像数据库中的Table。

    SuperColum Family概念上和Column Family(CF)相似,只不过它是Super Colum的集合。

    Colum排序

    不同于数据库可以通过Order by定义排序规则,Cassandra取出的数据顺序是总是一定的,数据保存时已经按照定义的规则存放,所以取出来的顺序已经确定了。另外,Cassandra按照column name而不是column value来进行排序。

    Cassandra可以通过Colum Family的CompareWith属性配置Colume值的排序,在SuperColum中,则是通过SuperColum Family的CompareSubcolumnsWith属性配置Colum的排序。

    Cassandra提供了以下一些选:BytesType,UTF8Type,LexicalUUIDType,TimeUUIDType,AsciiType, Column name识别成为不同的类型,以此来达到灵活排序的目的。

  • 相关阅读:
    A1052. Linked List Sorting (25)
    A1032. Sharing (25)
    A1022. Digital Library (30)
    A1071. Speech Patterns (25)
    A1054. The Dominant Color (20)
    A1060. Are They Equal (25)
    A1063. Set Similarity (25)
    电子码表
    矩阵键盘
    对象追踪、临时对象追踪、绝对坐标与相对坐标
  • 原文地址:https://www.cnblogs.com/bonelee/p/6278657.html
Copyright © 2011-2022 走看看