2015-04-01 111 views
6

有沒有一種方法可以控制SSTable的最大大小,例如100 MB,這樣當CF實際上有超過100MB的數據時,Cassandra會創建下一個SSTable?Cassandra控制SSTable大小

回答

6

不幸的是,答案並不那麼簡單,您的SSTables的大小將受到您的壓實策略的影響,並且沒有直接的方法來控制您的最大sstable大小。

當memtables作爲SSTables刷新到磁盤時,最初創建SSTables。這些表的大小最初取決於您的memtable設置和堆的大小(memtable_total_space_in_mb是一個大影響者)。通常這些SSTable非常小。作爲名爲compaction的過程的一部分,SSTables合併在一起。

如果你使用尺寸分層壓實策略,你有機會擁有非常大的SSTables。當至少有min_threshold(默認4個)大小相同的sstables組合成一個文件,使數據失效併合並密鑰時,STCS會將SSTables組合成小型壓縮。這有可能在一段時間後創建非常大的SSTables。

使用整平壓實策略有一個sstable_size_in_mb選項,該選項控制SSTables的目標大小。一般情況下,SSTables將小於或等於此大小,除非您擁有包含大量數據的分區鍵('寬行')。

我還沒有用Date-Tiered Compaction策略做過很多實驗,但是它的工作原理類似於STCS,因爲它合併了大小相同的文件,但它按時間順序將數據保存在一起,並且具有停止壓縮的配置舊數據(max_sstable_age_days)這可能很有趣。

關鍵是要找到最適合您數據的壓縮策略,然後調整最適合您的數據模型/環境的屬性。

您可以閱讀關於壓縮here的配置設置的更多信息,並閱讀this guide以幫助您瞭解STCS或LCS是否適合您。

+0

還應該補充一點:在SSTable大小方面有一個令人滿意的介質,你不希望你的SSTables太小,因爲它會創建大量的讀取數據,因爲它使得它更容易行在SSTables之間傳播。您的sstable應該多大程度上取決於您的環境和您的要求,因此調整和測試最適合您的最佳方案可能會很好。 – 2015-04-01 13:58:46

+0

感謝您的信息。我在哪裏指定'sstable_size_in_mb'?我試圖把它放在conf/cassandra.yaml中的'sstable_size_in_mb:40',但cassandra啓動失敗,出現錯誤 org.apache.cassandra.exceptions.ConfigurationException:無效的yaml。請從您的cassandra.yaml – RRM 2015-04-01 14:17:47

+1

@RMadhav中移除屬性[sstable_size_in_mb],很可能您的表仍在使用SizeTieredCompactionStrategy。此選項僅受LeveledCompactionStrategy支持,您可以使用以下CQL命令更改壓縮策略:ALTER TABLE tablename WITH compaction = {'class':'LeveledCompactionStrategy','sstable_size_in_mb':40}。我建議使用160MB的默認sstable大小,因爲這是cassandra團隊發現的最理想和經驗豐富的發言,擁有許多微小的SSTables不利於讀取性能。 – 2015-04-01 14:20:32