对Cassandra删除机制和墓碑清理的学习笔记
删除机制
Cassandra的删除机制,实际上是一个插入操作,即不是真正的执行一个delete语句,而是执行一个update语句改变某个列的值。Cassandra采用在删除时,会执行一个update语句,在对应值上放置一个墓碑(tombstone),标识该列已经删除。等到执行合并(compact)时,就利用这些墓碑来删除SSTable中的相应的数据。
而采用这种墓碑机制的原因在于:
Cassandra会将同一份数据存放到多个副本不同的节点上,如果某个节点A收到了删除指令,删除了本地的记录,并尝试将删除逻辑传递给包含该记录副本的其他节点B,如果对应节点B并没有进行相应,即该节点无法将数据立即删除,且该节点上仍然拥有删除前的数据。如果在节点B重新恢复到集群中之前,其他节点上的该数据已经被清除,则节点B上的该数据会被认为是新的记录,进行同步。就会导致删除操作并不能生效,这种记录被称为僵尸(zombie)。
为了避免上面提到的数据的出现,采用墓碑机制,且给墓碑一定的存活时间。目的是让无响应的节点有时间恢复和正常处理逻辑删除。
墓碑清除
而墓碑何时可以被清除,即上面提到的存活时间结束后,进行清除。
Cassandra提供了gc_grace_seconds
的配置项来标记,该配置项默认值为864000秒,即Cassandra会默认保存墓碑的时间为10天,10天后,该墓碑信息将在compact时,