在這篇論文之前 — 它所降落的世界
1996 年,B-tree 是所有商用系統預設的磁碟索引;而在隨機鍵值上做一次 B-tree 插入,需要沿目錄層往下搜尋、再寫回被弄髒的 leaf,大約是 De + 1 次隨機頁 I/O,這種規模的索引其有效深度 De 通常是 2。Gray 與 Putzolu 的 Five Minute Rule 則定下了另一條路的經濟學:以 1995 年的價格,只有當一頁被引用的頻率高於大約每 60 秒一次時,買記憶體把它留住才划算——這個門檻已從 1987 年的五分鐘降下來,一部分因為記憶體變便宜,一部分因為大量生產的廉價磁碟出現。累積 20 天、共 576,000,000 筆的 Acct-ID 串接 Timestamp 索引佔 9.2 GBytes,攤在約 230 萬個 leaf page 上,任一頁平均每 2300 秒才因插入被碰一次,遠低於值得緩衝的門檻,也就是說每次插入真的都要跑兩趟磁碟。同一時期,Sagas、ConTracts 與 Escrow 這類長時間執行的 activity flow 系統,在很長的期間內產生龐大的日誌記錄,傳統上用來追蹤活躍日誌的記憶體常駐結構已經放不下。先前也有延後定位的設計——Time-Split B-tree、MD/OD R-tree、Differential File——但它們一律把那個小而新的元件當成磁碟常駐,這正是它們都沒能降低插入成本的原因。
術語 — 依本篇論文的用法
- LSM-tree
- 由兩個以上大小遞增的樹狀元件 C0 到 CK 組成的磁碟索引,其中 C0 常駐記憶體、其餘常駐磁碟,索引項透過 rolling merge 逐層往外遷移。
- C0 component
- 最小且常駐記憶體的元件,以零 I/O 成本吸收所有插入。因為它從不落到磁碟,不必是 B-tree;論文建議用 (2-3) tree 或 AVL tree。
- C1 component
- 常駐磁碟的較大元件。它有類似 B-tree 的目錄,但節點 100% 填滿,且 root 以下的節點序列被緊密塞進連續的 multi-page block,以有效使用磁碟臂。
- Rolling merge(滾動式合併)
- 持續在背景進行的程序:一個概念上的游標以量化的 merge step 繞行兩個相鄰元件相同的鍵值範圍,把項目往外推,走到最大鍵值後再繞回最小鍵值。
- Multi-page block
- 一段連續的頁面大小節點,論文設想約 256 KBytes,以單一單位讀寫,讓尋道時間與旋轉延遲攤提到約 64 個頁面上。
- Emptying block 與 filling block
- 每一層夾在合併游標兩側的一對緩衝區:emptying block 存放游標尚未走到的舊節點,filling block 累積合併輸出,填得夠滿後寫到磁碟上的新位置。
- Batch-merge 參數 M
- rolling merge 期間平均併入每個單頁 C1 leaf 節點的 C0 項目數,等於 (Sp/Se) 乘上 S0/(S0+S1)。它是 LSM-tree 勝過 B-tree 的兩個因子中「批次」的那一半。
- 資料溫度(H/S)
- 每 MByte 儲存資料每秒的頁面存取次數。低於冰點 Tf = COSTd/COSTP 時成本由容量決定;高於沸點 Tb = COSTm/COSTP 時就該常駐記憶體;LSM-tree 的作用就是降低索引的有效溫度。
- Continuum Structure
- 論文為「會把新插入項目立即放到它在既有項目中最終排序位置」的存取方法所取的名字。B-tree、SB-tree、Bounded Disorder file 與 extendible hashing 都屬此類,因此每筆插入都至少要兩次 I/O。