2015-01-14

關於Cassandra的compaction


以下為最近研究Compaction時的一些心得,有錯歡迎指正

Compaction做什麼?
Compaction指的是將數個 SSTable合併成一個SSTable的動作,並且在合併的同時會merges keys, combines columns, discards tombstones and creates a new index in the merged SSTable.


Compaction的種類
一般將Compaction分成 minor compaction與major compaction兩種

Major compaction
當一個column family在做Major compaction時,會將這個column family的所有的SSTable合併成一個


Minor compaction
Minor compaction是指 Cassandra 在 runtime 時,經由compaction strategy判斷而做的compaction,這類的compaction通常一次只會處理部份的SSTable


Major compaction 與 Minor compaction的定義真的是如此嗎?
cassandra 官方似乎沒有很明確的定義 minor compaction。但在 Datastax的這份nodetool compact 文件中指出:"You can specify a keyspace for compaction. If you do not specify a keyspace, the nodetool command uses the current keyspace. You can specify one or more tables for compaction. If you do not specify a table(s), compaction of all tables in the keyspace occurs. This is called a major compaction. If you do specify a table(s), compaction of the specified table(s) occurs. This is called a minor compaction. " 這說法其實是有問題的,實際去追source code (0.8~2.1版)會發現,不管有沒有指定 column family,nodetool compact最後都是用ColumnFamilyStore.forceMajorCompaction() 這個method,而實際操作確實不管有沒有指定column family,nodetool compact完之後,column family的SSTable都會被合併成一個。因此本文件以行為來區分Major與Minor,至少到2.1版為止的行為都可以解釋得通(不過更之後的版本可能未必還是如此)

Cassandra一定要Major compaction才會清除tombstone嗎?
早期cassandra (<0.6版) 確實是如此,因此會需要定期執行 nodetool compact,但是後來minor compact也可以清除 tombstone了 ( CASSANDRA-1074 )


Compaction是怎麼發生的?
Compaction會自動發生(稱為 autoCompaction),也可以手動強制執行。


AutoCompaction

根據column family的 compaction options 來決定是否觸發,基本上 autoCompaction只會觸發 minor compaction。關於compaction options 請自行參考適合你的cassandra column family設定文件


Force compaction
透過 nodetool compact 的指令或是JMX可以觸發強制 compaction。強制compaction會觸發 major compaction


做過手動 compaction 之後,autoCompaction就不會再做了嗎?
錯,只要沒特地把 compaction關掉,不然auto compaction還是會持續被執行。這個問題在網路上有不少人在詢問,主要應該是因為Datastax的幾篇舊的tuning文件( 0.81.0 )有以下這樣的敘述:"once you run a major compaction, automatic minor compactions are no longer triggered frequently forcing you to manually run major compactions on a routine basis. So while read performance will be good immediately following a major compaction, it will continually degrade until the next major compaction is manually invoked. ",這段文字其實是指當做過手動 major compaction之後,column family的SSTable會被合併成一個,這個新的SSTable會是一個相對很大的檔案,而SizeTieredCompactionStrategy的觸發條件是當有幾個接近大小的SSTable存在時,才會做minor compaction將這幾個同大小的SSTable做compaction,因此這個相對較大的SSTable在SizeTieredCompactionStrategy的運作下,可能很難再發生minor compaction,導致管理者未來只能透過major compaction才有機會對這個SSTable做compaction。(可能是因為這段話造成太多誤會,Datastax在 1.1版文件 裡也修改了描述方式) (在cassandra 1.2之後提供了 sstablesplit 的指令可以將這類的大 SSTable檔案切成數個小檔)


Major compaction只會做用在 SizeTieredCompactionStrategy 或 DateTieredCompactionStrategy 這兩種strategy嗎?
是的,Major compaction只會作用在這兩種strategy的column family,對LeveledCompactionStrategy執行major compaction不會有任何反應

要怎麼關掉autoCompaction
  • ColumnFamily的JMX method disableAutoCompaction() 可用來在runtime時暫時關掉autoCompaction,但是並沒有enable的method,所以只有重啟node才能回復。
  • 1.x版的Cassandra,將SizeTieredCompactionStrategy的 min_compaction_threshold跟max_compaction_threshold 都設成0可以讓該column family不再做autoCompaction
  • 2.x版的column family的Compaction options有個 enable的選項可以控制是否啟用autoCompaction



沒有留言 :

張貼留言