Wisckey 是針對 LSM-Tree 在 SSD 存儲下的優(yōu)化呀打。LSM-Tree 目前應用已經很廣了钉鸯,主要應用在日志系統(tǒng)和KeyValue存儲引擎,比較著名的實現是LevelDB。LSM-Tree 利用了磁盤具有順序讀寫比隨機讀寫快的特點腿倚,提供了可持久化的高性能 KeyValue 存儲囤萤。
LSM-Tree 主要有以下特點:
- 隨機 IO 會轉化為順序 IO昼窗,降低了由于磁盤隨機IO帶來的延遲(latency)
- 每個層級滿了之后,會往更高層級合并文件涛舍,會帶來寫的放大
- 對于新寫入數據訪問友好澄惊,但是訪問一些冷數據的話會造成讀放大
由于 LSM-Tree 存在讀寫放大的問題,首先會造成是性能損耗富雅,還有一個會影響磁盤壽命掸驱。
WiscKey
WiscKey 針對讀寫放大的問題,主要采取了 Key-Value 分離的方案没佑。
在 Key-Value 分離之后毕贼,首先 LSM-Tree 整體會縮小,即使往上層合并 SSTable 文件的時候蛤奢,由于樹的節(jié)點小了鬼癣,造成的寫放大規(guī)模也會相應的降低,那么相應地讀放大問題也會相應減弱啤贩。
在論文中提到的一個例子待秃,假設一個 key 大小為 16-B,value 指針為 12-B痹屹,value 為 1-KB章郁,那么當數據量為 100GB的時候,此時的 LSM-Tree 實際是2GB左右痢掠,能夠輕易的緩存在內存里面驱犹。
挑戰(zhàn)
Key-Value 分離當然也帶來了很多的挑戰(zhàn):
- 并發(fā)范圍查詢(Range Query)
- 垃圾回收(Garbage Collection)
- 數據一致性(Consistency)
下面會繼續(xù)討論 WiscKey 是怎么解決這些問題的
并發(fā)范圍查詢
首先在一般的 HHD 硬盤嘲恍,肯定隨機訪問的性能是不好的,那么對于 SSD 來說雄驹,在并發(fā)的情況下佃牛,隨機讀寫性能也沒有那么差。實際上WiscKey 就是針對 LSM-Tree 在 SSD 上的優(yōu)化医舆。
如上圖俘侠,那么我們控制好對 SSD 數據塊的寫入大小和寫入頻率,理論上隨機讀寫能夠得到接近順序讀寫的性能蔬将。
垃圾回收
WiscKey 用了一種特殊的垃圾回收機制:在 tail 一塊一塊的讀數據爷速,找到有效的數據就插入 head ,無效就拋棄霞怀。雖然這樣能夠較好的收集磁盤空間惫东,但是其實也是存在讀寫放大的問題,需要控制好垃圾回收的時機和頻率毙石。
數據一致性
由于 WiscKey 的 Key 和 Value 是分離的廉沮,很容易造成數據不一致。
WiscKey 提出了相應的解決方案徐矩,其實主要總結分位以下兩種情況:
Key 有效 Value 無效
給用戶返回 Value 不存在即可滞时。但是這里Value無效其實有兩種情況,一是未寫入Value滤灯,二是Value不完整坪稽。后者可以通過一些磁盤校驗位解決問題。
Key 不在 Value 有效
垃圾回收拋棄此 Value即可
參考文章: