MongoDB vs. Cassandra角逐時間序列數(shù)據(jù)處理
MongoDB與Cassandra是兩個***人氣的NoSQL數(shù)據(jù)庫,MongoDB更是NoSQL領域當之無愧的人氣王,而Cassandra則常年霸占著列存儲領域的***,相比之下備受關注的HBase卻因眾多原因一直屈居次席。近日MyDrive Soulutions運營和架構總監(jiān)分享了這兩個人氣NoSQL數(shù)據(jù)庫在其公司的實踐,并給出了相關對比,以下為譯文:

使用Cassandra替換MongoDB來管理時間序列后的飛躍
使用場景
MyDrive擁有一個基于AWS托管的數(shù)據(jù)處理平臺,由Resque工作者負責。作為一個遠程信息處理公司,我們需要處理非常多的時間序列數(shù)據(jù),初始我們采用了MongoDB。作為初期方案,MongoDB最初定義就是臨時性的選擇。
MongoDB表現(xiàn)的也是相當不錯,然而不同大小負載處理時間的不可預測性帶來了很多困擾,同時也讓數(shù)據(jù)處理管道的優(yōu)化變得非常困難?;贛ongoDB的設計(大部分的關系型數(shù)據(jù)庫同樣如此),返回30個文檔與返回300個文檔的作業(yè)將觸發(fā)不同的I/O負載,而返回30個文檔的作業(yè)肯定要比300個的快。當然不管是30還300,處理的速度都不是很快,即使使用了非常好的索引及非常合適的實例。
此后,我們不得不對MongoDB實例進行一定的縱向擴展;當然如果長期如此,將帶來非常多的額外開銷。
解決方案
從開始,目標就被鎖定在Cassandra上,因為AboutUs 5.0之后的版本都使用了Cassandra。它已經(jīng)向我們證明了強大的可靠性、可見性以及彈性。這些特色在整合了橫向擴展之后,讓Cassandra成為一個當之無愧的殺手級數(shù)據(jù)存儲。
一般情況的數(shù)據(jù)流為寫入數(shù)據(jù)>>讀回>>修改>>寫入>>再讀取,這些操作被不同用戶執(zhí)行。雖然這不是Cassandra的設計理念,但是Cassandra卻非常適合我們的查詢方式。
Cassandra確實非常適合時間序列數(shù)據(jù),因為可以周期性的將時間序列數(shù)據(jù)寫入1列,然后通過部分字符串對比來查詢一定時間范圍內(nèi)的數(shù)據(jù)。這樣的話使用列就比使用行更加的高效,而加載單行可以讓你獲得巨大的I/O性能。然后Cassandra必須至少讀取一個數(shù)據(jù),而隨著數(shù)據(jù)持久化到磁盤的進行,所有剩余的數(shù)據(jù)都將被讀取。
我們使用時間戳作為ID的前半部分,這樣的話就可以做任何時間段的范圍查詢——每行都體現(xiàn)出了一條數(shù)據(jù),而列則體現(xiàn)了時間序列數(shù)據(jù)的一個周期。這樣所有數(shù)據(jù)都可以通過鍵及起止時間查詢。
鑒于我們工作負載的類型,使用MongoDB時,寫操作的數(shù)量會嚴重影響到讀的性能,而使用Cassandra就不會有這種情況發(fā)生。
前后對比
上面的突變顯示大半年的性能,藍線表示的是受數(shù)據(jù)存儲性能影響的部分。很明顯在做MongoDB優(yōu)化及橫向擴展硬件時性能的落差很大,然而這些對Cassandra毫無影響。
我們階段化的關閉了MongoDB,開始是停止了對其寫入,***停止了在MongoDB上的讀操作(在圖片上使用了紅色箭頭標注),不過圖片上沒有顯示的是在過渡到Cassandra后加入了大量的批處理作業(yè)。