2012-01-18 54 views
7

所以我研究卡桑德拉並試圖獲得該架構的理解,我是從維基閱讀以下頁面: http://wiki.apache.org/cassandra/MemtableSSTable卡桑德拉SSTables和壓實

所以,在這裏按照工作流程,您發送請求更新你的表,這個請求被寫入到一個CommitLog中,然後被寫入一個名爲Memtable的內存表(在系統失敗的情況下可以從Commitlog重建)。一旦Memtable達到一定的大小,它將整個Memtable刷新到光盤上的SSTable,它不再只能在壓縮過程中被合併。當你達到可配置數量的SSTables時,你可以進行壓縮,它基本上將結果合併,釋放磁盤空間並創建一個新的和改進的最新SSTable。如果我在這裏理解了任何錯誤,請糾正我。

現在我有幾個關於壓實的問題。首先,這項手術有多昂貴?如果我在光盤上有兩個SSTable時要求進行壓縮,這是否會令人望而卻步,還是我會更好地服務,等到半夜使用量下降? 如果我有多個(但很小)的SSTables與幾個但非常大的SSTables相比更好嗎?有很多非壓縮SSTables會影響讀取性能嗎?併發性如何處理這個問題:如果我從這些SSTables讀取數據,那麼有人做了一個將新的Memtable刷新到磁盤的插入操作,從而導致壓縮?

任何有關此信息和經驗的信息都會很棒!

回答

12

試圖回答每一個問題:

首先,多麼昂貴的是這個操作?

壓縮必須複製它正在壓縮的SSTables中的所有內容(減去墓碑或覆蓋中的任何湮滅)。然而,這比起初看起來要便宜,因爲壓縮使用純粹的順序IO,這在旋轉盤上很好而且快速。

如果我要求的,每當我們有盤上,兩個SSTables壓實,這會不會望而卻步,或者我會得到更好的服務等到半夜的時候使用是跌?

這將意味着您的寫入會明顯成本更高;想象每次寫入都會導致一個新的SSTable;因此每一次寫入都必須緊湊纔會寫入所有寫入的內容。寫N個項目的成本是N^2。

一個更好的主意是採用壓縮策略,就像Acunu的Doubling Array使用的那樣:將每個SSTable(又名數組)存儲在一個「級別」中,並在每個級別有兩個數組時將其壓縮,將輸出數組提升爲下一個級別。這可以顯示爲每寫緩衝到O((log N)/ B)個連續IO,同時將陣列數限制爲O(log N)。

該方案在Castle,一個Cassandra的(開源)存儲引擎中實現。欲瞭解更多信息,請參見這裏:

NB我的Acunu

工作

是壓實,如果我有多個(但小)SSTables VS有什麼更好的一些但非常大的SSTables?

用較小的SSTables進行壓縮將需要較少的時間,但您將不得不做更多的時間。它的馬匹爲課程,真的。的SSTable數&大小不影響讀取性能,但是(參見下一個問題)

是否有很多非壓縮SSTables的影響讀取性能?

對於點讀,不是非常多:卡桑德拉(和城堡)有布隆過濾器,以避免在尋找SSTables當它知道密鑰不會在那裏,並在找到正確的價值可以提前終止(通過使用值和SSTables上的時間戳)。

但是,對於get_slice查詢,您無法儘早終止,因此您將不得不訪問可能在您的行中包含值的每個SSTable - 因此,如果您有很多,您的get_slices將會變慢。

get_range_slices的情況更糟,您無法使用bloom過濾器,並且每次調用都必須訪問每個SSTable。這些通話的性能與您擁有的SSTables數量成反比。

更重要的是,有數千個SSTables,布隆過濾器假陽性率(〜1%)會開始受到傷害,因爲對於每個查找,您都必須查看10個不包含該值的SSTables!

如何併發工作,這樣的:我從這些SSTables讀什麼如果,然後有人做這刷新了新的memTable到磁盤上,這反過來又導致壓實插入?

在Cassandra中,一旦SSTables在內存中沒有更多引用(由垃圾收集器決定),系統就會刪除它。所以閱讀並不需要擔心,舊的SSTables將會被懶散地清除。

感謝

湯姆

+0

謝謝!只是一些澄清的問題:當你說「想象每個寫作創建一個新的SST」時,你的意思是在假設的情況下,你有一個非常大的寫,是否正確?其次,你能否澄清爲什麼閱讀不需要擔心SSTable消失?我的意思是,如果我必須閱讀N個SSTables,我已經閱讀了其中的一半,然後在完成之前刪除了其餘部分,這不會是一個問題嗎? – 2012-01-19 00:28:37

+0

>當你說「想象每個寫作創建一個新的SSTable」時,你的意思是在假設的情況下,你有一個非常大的寫,是否正確? 我只是這樣做來簡化數學。實際上你會有一批(B)寫入創建一個新的SSTable,但我認爲這只是N(N^2/B)爲N次寫入,或者O(N/B)爲每次寫入(這是真的很大,比起O((log N)/ B) – 2012-01-19 18:06:14

+0

>其次,你能否澄清爲什麼讀不需要擔心SSTables消失? 在Castle中我們引用了每個SSTable的計數;在讀的開始操作,我們調整每個SSTable上的引用計數,以防止它們消失。當引用計數變爲零時(無論是作爲合併的結果,還是讀取結束時),表格實際上都被刪除了。我猜想Cassandra可以做類似的事情,但通過使用垃圾回收器。 – 2012-01-19 18:06:29