Cassandra源代码分析(一)Table和ColumnFamilyStore
2010-07-28 07:51
260 查看
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就对应一个flushTask;instances是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对象来统一维护。
相关文章推荐
- Cassandra源代码分析(一)Table和ColumnFamilyStore
- How Can i Store photo (image) in column of table
- 在线生产系统执行 alter table add column type default x ;的分析
- 在Android的TableLayout布局中,column和span属性“失效”原因分析与解决
- An explicit value for the identity column in table 'users' can only be specified when a column list
- MappingTableAddColumnNames
- How to calculate ADF table column
- Cassandra 中的column family
- Column store index 列数据如何匹配成行数据?
- leveldb源码分析--SSTable之TableBuilder
- Oracle11g 的 error "ORA-01747: user.table.column, table.column 或列说明无效
- MySql报错原因分析Unknown column ‘xxx’ in ‘where clause’
- "column "x" does not belong to table "y""
- MySQL线程处于Waiting for table flush的分析
- JS实现动态生成html table表格的方法分析
- file_table.c 文件分析 linux1_0\linux\fs\file_table.c
- xen grant table机制分析
- IOS TableView中Cell的重用reuse机制分析
- MariaDB ColumnStore一些限制和BUG总结 推荐