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