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

Cassandra源代码分析(一)Table和ColumnFamilyStore

2013年08月19日 ⁄ 综合 ⁄ 共 1932字 ⁄ 字号 评论关闭

1.1   Table

TableCassandra中表示DB对象的顶级描述,这里的Table实际上是一个古老的名词,合理的意思应该是Keyspace,表示的是数据库级别的描述信息。

org.apache.cassandra.db.Table中定义的一些重要的静态对象和实例级别(也就是Keyspace级别)的对象:

    private static Timer flushTimer = new Timer("FLUSH-TIMER");

    private final boolean waitForCommitLog;   

/** Table objects, one per keyspace. 

only one instance should ever exist for any given keyspace. */

private static final Map<String, Table> instances =

new NonBlockingHashMap<String, Table>();

    /* Table name. */

    public final String name;

    /* ColumnFamilyStore per column family */

private final Map<Integer, ColumnFamilyStore> columnFamilyStores =

 new HashMap<Integer, ColumnFamilyStore>();

private final TimerTask flushTask;

其中flushTimer是一个Cassandra节点级别的定时任务调度器;flushTaskKeyspace所对应的一个刷新任务,即将CFS中所对应的Memtable数据存储到磁盘上,一个Keyspace就对应一个flushTaskinstanceskeyspace的名称到Keyspace的映射;name为每一个Keyspace的名称,该名称在配置文件storage-conf.xml中定义;columnFamilyStoresKeyspace级别的实例变量,一个Keyspace对应多个ColumnFamilyStore,该Map<Integer, ColumnFamilyStore>中的key即为cfid,是ColumnFamily名称所对应的数字ID

1.2   ColumnFamilyStore

Cassandra 中一个 Keyspace 可以看作一个二维索引结构:

第一层索引所用的 key (row-key, cf-name) 即用一个 row-key column-family-name 可以定位一个 column familycolumn family column 的集合。

第二层索引所用的 key column-name 即通过一个 column-name 可以在一个 column family 中定位一个 column

Column 是这个数据模型里面最基本的数据单元,它是一个三元组 (name, value, timestamp) 一个 column family 里面,所有的 column 是按照 column-name 排序的。所以可以根据 column-name 快速找到 column

在每一个放置了 column family 的节点上,具有相同的 cf-name column-family 会被保存在一起,称为一个 column family store (CFS)。在一个 CFS 中,各个 column family 是按照 row-key 排序的。所以,在该节点上,首先通过 cf-name 来找到对应的 CFS,然后用 row-key 在这个 CFS 中这个 column family

需要注意的地方是,上面的定位过程中 row-key 被使用了两次。 总结来说,在每个节点本地看来,一个 CFS 相当于数据库的一个表, Column Family 相当于表中的一行, Column 相当于一行中的一个域。

 

  • ColumnFamilyStore 类包含两个主要的域:
  • 一个 Memtable 对象。该对象保存了最近的对该 CFS 中的 Column family 的修改,这些修改还没有被 flush 到磁盘上。
  • 一个 SStableTracker 对象。这是一个 SStableReader 对象的集合,每个 SSTableReader 对象维护了关于磁盘上的 CF 数据的必要信息。

数据文件可以分布在多个目录,每一个ColumnFamily所对应的数据文件也可以分布在任意一个目录中,一个ColumnFamily可能存在多个数据文件。一个数据文件的读取由一个SSTableReader对象负责,在一个ColumnFamily中的多个数据文件的读取由一个SStableTracker对象来统一维护。

抱歉!评论已关闭.