Ceph源碼分析-KeyValueStore

KeyValueStore 是 Ceph 支持的另外一個存儲引擎(第一個是FileStore),它是在 Emporer 版本中Add LevelDB support to ceph cluster backend store Design Summit 上由本人提出並實現了原型系統,在 Firely 版本中實現了與 ObjectStore 的對接。目前已經合併到 Ceph 的 Master 上。 php

KeyValueStore 相對於 FileStore 是一個輕量級實現,目標是利用其不一樣 Backend 提供的能力來爲 Ceph 的不一樣應用場景服務。如目前的默認 engine 是 LevelDB,指望來提供高性能的寫性能。 後端

主要數據結構

 

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 的方法實現。 ui

struct OpWQ定義了操做隊列 spa

op_tp定義了線程池
線程

主要 IO 路徑

與FileStore 的實現相似,KeyValueStore 也會產生一個消息隊列,全部來自上層PG 產生的IO 請求都會先放入這個隊列,而後會有多個KeyValueStore 線程做爲隊列的消費者獲取請求進行處理,由於PG 天生的隔離性,目前KeyValueStore 是利用PG 做爲一個隔離單元,同一時間只有一個線程處理同一個PG 的請求。KeyValueStore 線程針對每個請求會產生一個緩衝空間,由於一個請求做爲一個事務會包含多個原子操做,爲了保證事務的原子性和隔離性,每個請求在中間階段並不能寫入到持久層,只能產生一些操做序列,而可能的反作用就須要被緩衝空間保存起來做爲後續操做的上下文。最後KeyValueStore 線程會提交這個請求來完成此次事務。</font 設計

KeyValueStore.h中相關定義以下 code

struct Op {
 utime_t start;
 uint64_t op;
 list<Transaction*> tls;
 Context *ondisk, *onreadable, *onreadable_sync;
 uint64_t ops, bytes;
 TrackedOpRef osd_op;
 };
 struct OpWQ : public ThreadPool::WorkQueue<OpSequencer>

消息處理請求控制 繼承

unsigned KeyValueStore::_do_transaction(Transaction& transaction,                                        BufferTransaction &t,                                        ThreadPool::TPHandle *handle)
相關文章
相關標籤/搜索