Cassandra源代码分析(一)Table和ColumnFamilyStore
2014-03-25 16:12
489 查看
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
- 在Android的TableLayout布局中,column和span属性“失效”原因分析与解决
- 在线生产系统执行 alter table add column type default x ;的分析
- ADF(UI)--别忘了<af:table>中<af:column>中的headerClass属性
- "column "x" does not belong to table "y""
- Hibernate – Many-to-Many example – join table + extra column (Annotation)
- @Table(name = "", uniqueConstraints = @UniqueConstraint(columnNames = ""))
- How do I see all foreign keys to a table or column?
- ORA-01779: cannot modify a column which maps to a non-key-preserved table分析
- error : Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in
- 1293 - Incorrect table definition; there can be only oneTIMESTAMP column with CURRENT_TIMESTAMP
- xen grant table机制分析
- 创建主键时报错:ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it mus
- Hive查询报错 Invalid table alias or column reference 'create_time': (possible column names are: _c0, _c1
- Indexing NULL table column values for fast SQL performance
- 83.Examine the data in the CUST_NAME column of the CUSTOMERS table.
- 升级MariaDB ColumnStore 从 1.0.6 到1.0.7
- Column <Column Name> does not belong to table Table
- ORA-01747: user.table.column, table.column 或列说明无效