Cassandraでのデータの削除について

削除処理の概要

削除するまでに全ノードにその削除通知が行き渡るには時間がかかるので、tombstoneというdeletion markerをつけて、それを使って他のノードにも伝播させることで、他ノードでも削除マークを付ける。

全てのノードで削除マークがつくまでに時間がかかることから、Cassandraでは、inconsistency を低減するために、

  • Hinted Handoff
  • Read Repair
  • Anti Entropy

を使用している。(Hinted Handoff, Read Repair, Anti Entropyの実装とのリンクはまた後ほど。)

tombstoneを設定した後で、実際に削除するのは、GC_GRACE_IN_SECONDSたったときに行われる。ColumnFamily#removeDeletedが実際の処理。これは本当の削除処理。

(GC_GRACE_IN_SECONDESがたって削除されるまでは、削除されたcolumn, super column, column familyを保持しておく必要がある。しかし、中身は不要なので、tombstoneとして扱い、他の削除されたことについて知らないreplicaを修正するためにtombstoneを使う。)

実装

tombstoneの設定の実装

CassandraServerのremoveメソッドが開始部分で、RowMutation#deleteメソッドで実際にtombstoneの設定処理が行われている。

Compactionの実装

CompactionManagerで削除は行われる。

CompactionIteratorのgetReducedメソッドでColumnFamily#removeDeletedが呼ばれている。getReducedメソッドは、CompationIteratorの親クラスであるReducingIteratorのcomputeNext内で呼ばれている。

ReducingIterator <-- CompactionIterator  
CompactionManager -- CompactionIterator