Cassandra源码学习:数据更新

来源:互联网 发布:java编写中文软件 编辑:程序博客网 时间:2024/04/26 22:09


写入流程

cassandra先把数据写入commitlog中,然后把数据写入内存Memtable中,当以下条件之一满足时,Memtable会被写入SStable中

1、达到memtable_throughput_in_mb上限
2、达到memtable_operations_in_millions上限
3、超过上一次写入的时间间隔memtable_flush_after_mins

如果写入的ColumnFamily上有二级索引,还需要更新二级索引(commitlog和Memtable都要更新)

关于数据合并

Memtable中的数据是按row key进行排序的,在cassandra中不允许有相同的row key,如下3次写入:

[html] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. write (k1, c1:v1)  
  2. write (k2, c1:v1 C2:v2)  
  3. write (k1, c1:v4 c3:v3 c2:v2)  
Commitlog存储:
[html] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. k1, c1:v1  
  2. k2, c1:v1 C2:v2  
  3. k1, c1:v4 c3:v3 c2:v2  
Memtable和SSTable中是这样存储的:
[html] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. k1 c1:v4 c2:v2 c3:v3  
  2. k2 c1:v1 c2:v2  

插入重复键的行,被视为一个更新操作,这个更新操作可能会被写入新的SSTable文件中。

关于删除操作

与传统关系数据库不同,在Cassandra中不会立即从磁盘中删除已删除的数据(事实上由于SSTable是文件,是不可变的,没法立即删除),而是采用一种称为墓碑的概念,对于需要删除列,向文件中写入一个墓碑标记。

此时如果不运行定期修复,可删除的列还可以重复出现。如果一个节点下线了,可能没有接收到墓碑标记,为了防止这种数据再次出现,管理员应该运行一个节点修复任务。

gc_grace_seconds参数配置墓碑上标记的数据在删除之前可以保留的时间,默认为10天。

写时提示移交

在配有副本机制的集群中,根据写时一致性策略,需要写入多个副本,如果其中一个副本宕机或者下线,需要保留现场,待宕机结点恢复上线时进行重放。需要保留如下信息:

(1)宕机副本的位置
(2)需要重放的row key
(3)写入的数据

如果协调节点不能重放,会抛出TimedOutException异常。如果节点长时间不能恢复,可能是一个故障,这时应该进行修复。

0 0