TombStoneが出てこなくて、ついTotemと言ってしまった私です。
今回はTombStoneで死んだ話をします。
状況
Apache SparkでCassandraに向けて、1000万件程のデータ を流し込む処理を実行していたのですが、途中で処理が完全に止まってしまい死にました。
何故に
何ぞ?と思い、 cqlsh
でQuery投げてみましたが、何を投げても以下のようなエラーが。
cassandra.ReadFailure: code=1300 [Replica(s) failed to execute read] message="Operation failed - received 0 responses and 1 failures" info={'required_responses': 1, 'received_responses': 0, 'failures': 1, 'consistency': 'ONE'}
ほげ〜〜〜〜となって調べてみると、こんな記事が。
You are exceeding the tombstone_failure_threshold. It defaults to 100'000.
いやいや、そんなTombStoneが10万もおっ立てるほど削除処理回してへんで、となっておもむろに nodetool cfstats hoge.fuga
を実行したところ完全にTombStoneが10万超えてました・・・
なんでやねん
この記事読んで知ったんですが、columnのnullでもTombStoneって立つんですね・・・
たしかにテーブル内のデータを見ると、nullのデータがちらほらあって色々と納得。
どうすんねん
とりあえずTombStoneを掃除するために、Compactionの設定を変えることにしました。
Tableの WITH COMPACTION
をこんな感じに。
'tombstone_compaction_interval': '60' :TombStoneのCompaction間隔秒数(デフォルトは1日) 'tombstone_threshold': '0.01' :Compaction実行のしきい値となる、すべての列とTombStoneが含まれた列の比率
上限値も変えようかなとは思ったんですが、それやっちゃうと上限値の最適値を探る作業が入っちゃうので面倒だなと思いCompaction設定をいじりました。
まとめ
TombStoneで死ぬこともあるので気を付けよう。
参考資料
Cassandra導入事例と現場視点での苦労したポイント cassandra summit2014jpn
Null bindings on prepared statements and undesired tombstone creation