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次写入:
write (k1, c1:v1) write (k2, c1:v1 C2:v2) write (k1, c1:v4 c3:v3 c2:v2)Commitlog存储:
k1, c1:v1 k2, c1:v1 C2:v2 k1, c1:v4 c3:v3 c2:v2Memtable和SSTable中是这样存储的:
k1 c1:v4 c2:v2 c3:v3 k2 c1:v1 c2:v2
插入重复键的行,被视为一个更新操作,这个更新操作可能会被写入新的SSTable文件中。
此时如果不运行定期修复,可删除的列还可以重复出现。如果一个节点下线了,可能没有接收到墓碑标记,为了防止这种数据再次出现,管理员应该运行一个节点修复任务。
gc_grace_seconds参数配置墓碑上标记的数据在删除之前可以保留的时间,默认为10天。
在配有副本机制的集群中,根据写时一致性策略,需要写入多个副本,如果其中一个副本宕机或者下线,需要保留现场,待宕机结点恢复上线时进行重放。需要保留如下信息:
(1)宕机副本的位置
(2)需要重放的row key
(3)写入的数据
如果协调节点不能重放,会抛出TimedOutException异常。如果节点长时间不能恢复,可能是一个故障,这时应该进行修复。