您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關Ceph中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 的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 的方法實現。
struct OpWQ定義了操作隊列
op_tp定義了線程池
與FileStore 的實現類似,KeyValueStore 也會產生一個消息隊列,所有來自上層PG 產生的IO 請求都會先放入這個隊列,然后會有多個KeyValueStore 線程作為隊列的消費者獲取請求進行處理,因為PG 天生的隔離性,目前KeyValueStore 是利用PG 作為一個隔離單元,同一時間只有一個線程處理同一個PG 的請求。KeyValueStore 線程針對每一個請求會產生一個緩沖空間,因為一個請求作為一個事務會包含多個原子操作,為了保證事務的原子性和隔離性,每一個請求在中間階段并不能寫入到持久層,只能產生一些操作序列,而可能的副作用就需要被緩沖空間保存起來作為后續操作的上下文。最后KeyValueStore 線程會提交這個請求來完成這次事務。</font
KeyValueStore.h中相關定義如下
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)
感謝各位的閱讀!關于“Ceph中KeyValueStore有什么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。