CephStore Engine KeyValueStore
概述
KeyValueStore 是 Ceph 支援的另一個存儲引擎(第一個是FileStore),它是在 Emporer 版本中Add LevelDB support to ceph cluster backend store Design Summit 上由本人提出并實作了原型系統,在 Firely 版本中實作了與 ObjectStore 的對接。目前已經合并到 Ceph 的 Master 上。
KeyValueStore 相對于 FileStore 是一個輕量級實作,目标是利用其不同 Backend 提供的能力來為 Ceph 的不同應用場景服務。如目前的預設 engine 是 LevelDB,期望來提供高性能的寫性能。
在了解 KeyValueStore 之前可以先了解 ObjectStore 和 FileStore解析Ceph:存儲引擎實作之一–FileStore
主要資料結構

KeyValueStore 主要由三部分組成,一個是繼承 ObjectStore 的 KeyValueStore 類,另一個是 GenericObjectMap(類似于 FileStore 的 DBObjectMap),最後一個是繼承 GenericObjectMap 的 StripObjectMap。GenericObjectMap 是主要用來通路後端 Engine 的實作,它的作用有點類似 VFS,而 Engine 就是各種不同的FileSystem,它抽象出一些基本的方法(read/write)和一些進階接口(rename/clone)等等,首先最初開始設計GenericObjectMap的時候是打算直接利用已經存在的 FileStore 的DBObjectMap,但是在一定的調查後發現 DBObjectMap 缺少一定的擴充性,很難在不破壞現有接口的前提下來實作,是以最後與 Sage 商定直接實作新的 ObjectMap。
那麼什麼是 ObjectMap,正如在上篇 FileStore 文章中所述,ObjectMap 是利用 K/V 接口實作的一個多層次 Map,目的是讓 OSD 最重要的 Object 具備一個獨立和高效查找的 KV 空間,同時這個空間還能使用 no-copy 的 clone。
GenericObjectMap 在提供了一個面向 Object 的通用 KV 空間後,StripObjectMap 繼承了 GenericObjectMap 實作了對 Object Data 的封裝,ObjectStore 有三種類型的資料: Data, attr 和 Omap,後兩者都是單一的 KV 實作,可以直接利用 GenericObjectMap 的原生接口實作,但是 Data 的接口是類似于 Posix 需要具備 Parity Write 的能力,是以簡單的将一個 Object 的 Data 作為一個鍵值對是不合适的,需要做一個 Strip 的工作,将一個 Object 的 Data 根據一定寬度劃分成多個鍵值對,這個工作就是由 StripObjectMap 來完成。
最後 KeyValueStore 類利用 StripObjectMap 來完成了對 ObjectStore 的方法實作。
主要IO 路徑
與 FileStore 的實作類似,KeyValueStore 也會産生一個消息隊列,所有來自上層 PG 産生的 IO 請求都會先放入這個隊列,然後會有多個KeyValueStore 線程作為隊列的消費者擷取請求進行處理,因為 PG 天生的隔離性,目前 KeyValueStore 是利用 PG 作為一個隔離單元,同一時間隻有一個線程處理同一個 PG 的請求。KeyValueStore 線程針對每一個請求會産生一個緩沖空間,因為一個請求作為一個事務會包含多個原子操作,為了保證事務的原子性和隔離性,每一個請求在中間階段并不能寫入到持久層,隻能産生一些操作序列,而可能的副作用就需要被緩沖空間儲存起來作為後續操作的上下文。最後 KeyValueStore 線程會送出這個請求來完成這次事務。
開發方向和适用場景
KeyValueStore 目前仍是 dev 狀态,隻适合用于測試和評估,它由于後端的一緻性(FileStore實際上對接了多個後端)會更具備穩定性,相對于沒有 clone 能力的檔案系統(除了 Btrfs),KeyValueStore提供了高效的 clone 操作,同時 KeyValueStore 的 GenericObjectMap 由于類似于 VFS 中 inode 的作用,但是由于其内置于應用端具備更好的靈活性,實際上提供更加高效的索引作用。目前在 rbd 應用場景中,最新的 KeyValueStore 在 LevelDB 後端下寫性能已經超過 FileStore。