数据参考:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/dml/manage_dml_intro_c.html#concept_ds_g2s_y1w_zj
为了管理Cassandra上的数据,了解Casssandra是如何写入和读取数据、hint机制、一致性和非一致性是等数据库特性非常有必要的。在Cassandra中,一致性指的是如何使一行数据在所有的副本更新到最新数据保持同步。
对于数据的存储和检索,Cassandra提供了客户端工具和应用程序编程接口(API)。
一、复制的作用
Cassandra通过它的数据复制策略提供了高可用性的数据写入。Cassandra复制数据到多个节点以保证可靠性和容错。关系型数据库,另一方面,采用典型的表结构来保证数据的复制最小化。关系型的数据库服务器需要做额外的工作以保证整个表的数据完整性。在Cassandra中,维护表的完整性并不是个问题。Cassandra中的表是没有关联关系的。通常,在写入上,Cassandra比关系型数据库的性能要好。
二、关于写入路径
当一个写入发生时,Cassandra把数据写在内存结构——memtable中,同时也会追加写到磁盘的commit log文件中,提供配置的持久性。
commit log文件接收到每个发送到Cassandra节点的写入请求,并且这些持久的请求即使发生硬件故障也能生效。
一个表使用的最多,memtable就会越大。Cassandra会动态分配合适的内存给memtable或者你也可以管理内存。当memtable的大小(包括索引)超过一个可配置的阈值,会被放到一个队列中等待被写入到磁盘中。你可以通过修改配置文件cassandra.yaml中的参数memtable_flush_queue_size配置队列的长度。如果数据超过了队列的大小,Cassandra会阻塞写入。memtable数据写入到磁盘的 SSTables文件会使用顺序I/O。当memtable写入到SSTable后,commit log文件中的对应数据会被清除。
每个表会维护Memtable和SSTables。SSTables是只读不可改变的,当memtable写入数据后不能再写入了。通常,一行存储在多个SSTable文件中。
对于每一个SSTable,Cassandra在内存结构中存储这些东西:
•主键的indexA集合,每一行在数据文件中的开始位置。
•索引的summaryA子集合。默认一个主键有128个。
三、Cassandra是如何存储数据的
在memtable中,数据是有序组织的。
为了更高效,在内存中或SSTable,Cassandra不会重复column的名字。例如,当下面的写请求发生时:
write (k1, c1:v1)
write (k2, c1:v1 C2:v2)
write (k1, c1:v4 c3:v3 c2:v2)
在memtable中, Cassandra存储数据的形式为:
k1 c1:v4 c2:v2 c3:v3
k2 c1:v1 c2:v2
在磁盘的commit log文件中, Cassandra存储数据的形式为:
k1, c1:v1
k2, c1:v1 C2:v2
k1, c1:v4 c3:v3 c2:v2
在磁盘上的SSTable文件中, Cassandra在刷新memtable后存储数据,形式为:
k1 c1:v4 c2:v2 c3:v3
k2 c1:v1 c2:v2
四、关于索引的更新
为了更新一个索引,Cassandra在commit log中追加数据,更新memtable,更新索引。当向一个表写入数据时,有索引需要比没索引做更多的工作Cassandra1.2之后更新的过程进行了提升。在高负载情况下采用同步锁以防止并发问题的需要已被删除。
当column更新的时候,对应的索引也被更新。如果旧的值仍然在memtable中,典型的表现是更新一小部分数据集合,Cassandra会移除索引项。否则,旧的条目会被压紧。如果读数据的时候发现一个旧的索引在它被压紧前,读取线程会使之无效。
和关系型数据库一样,建立索引并且保持同步更新不是一件轻松的事,所以应当避免没必要的索引。