在這篇論文之前 — 它所降落的世界
2008 年前後,Facebook 用數萬台伺服器服務數億使用者,而 Inbox Search 必須建立在原本躺在 MySQL 裡的 7TB 訊息資料之上。複寫式關聯式資料庫能給強一致性,但正如 Gray 與 Helland 早就指出的,代價是可擴充性與可用性,而且一旦發生網路分割就沒辦法繼續服務。Amazon 的 Dynamo 已經證明,一個會 gossip 的 consistent hashing 環加上交給客戶端處理衝突,可以在故障中維持可用;但它用 vector clock 偵測衝突,等於每次寫入都得先做一次讀取,在寫入遠多於讀取的場景裡負擔太重。Google 的 Bigtable 則示範了如何給應用一套稀疏、有序、以 column family 組織的資料模型,但它的持久性靠 GFS、協調靠有 Chubby 撐著的 master。Cassandra 正是長在這個縫隙裡:要 Dynamo 的可用性,要 Bigtable 的資料模型,底下不掛任何分散式檔案系統。
術語 — 依本篇論文的用法
- Column family
- 同一個 row key 之下一組具名的欄位集合,也是記憶體與磁碟上的組織單位,因為 Cassandra 為每個 column family 各維護一份記憶體資料結構與一個資料檔。欄位以 column family : column 的慣例存取。
- Super column family
- 巢狀在 column family 裡的 column family,以 column family : super column : column 存取。Inbox Search 就是把訊息中的詞或收件者 id 當作 super column,把個別訊息識別碼當作其中的欄位。
- Coordinator
- 把 key 雜湊到環上,再順時針走到第一個位置較大的節點,那個節點就是 coordinator。它負責自己與前驅節點之間的環上區間,並負責把落在該區間的 key 複製到其他複本。
- Preference list
- 借自 Dynamo 的用語,指負責某個區間的節點集合。Cassandra 會刻意讓一個 key 的 preference list 中的儲存節點跨越多個資料中心,使整座資料中心失效時服務仍不中斷。
- Phi accrual failure detector
- 不輸出上線或下線的布林值,而是輸出連續變化的懷疑程度 Phi 的失效偵測器,其值由 gossip 訊息到達間隔的滑動視窗算出。把門檻調高就是以偵測速度換取更低的誤判機率。
- Scuttlebutt
- Cassandra 用來管理叢集成員、並散播其他系統控制狀態的 anti-entropy gossip 機制,選用它是因為它對 CPU 與 gossip 通道的使用都非常有效率。
- Commit log
- 每個節點上獨佔一顆磁碟的循序持久性日誌,任何寫入都必須先寫進它,才能更新記憶體中的資料結構。日誌在可設定的 128MB 大小換新,並在其標頭位元向量顯示所含的每個 column family 都已落地後被刪除。
- Compaction(壓縮合併)
- 把磁碟上多個不可變更的資料檔整併成較少檔案的背景程序,本質是對已排序檔案做 merge sort,且只合併大小相近的檔案;此外會週期性執行 major compaction,把所有相關檔案壓成一個。
- Bloom filter
- 彙整某個資料檔中所有 key 的精簡摘要,與資料檔一起存放並常駐記憶體;磁碟查找前先問它,不可能含有目標 key 的檔案就完全不會被讀取。