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

1.1   Table

Table是Cassandra中表示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节点级别的定时任务调度器;flushTask是Keyspace所对应的一个刷新任务,即将CFS中所对应的Memtable数据存储到磁盘上,一个Keyspace就对应一个flushTaskinstances是keyspace的名称到Keyspace的映射;name为每一个Keyspace的名称,该名称在配置文件storage-conf.xml中定义;columnFamilyStores是Keyspace级别的实例变量,一个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 family。column 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对象来统一维护。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值