不講CRUSH的Ceph教程是不完整的

2022-10-09 06:33:13 字數 2388 閱讀 7305

前面我們提到了ceph是乙個支援統一儲存架構的分布式儲存服務。簡單介紹了ceph的基本概念和基礎架構包含的元件,其中最重要的就是底層的rados和它的兩類守護程序osd and monitor。上篇文章我們還挖了乙個坑,我們提到了crush。

是的,我們這篇教程就是一篇不完整的ceph教材,因為我們講crush並不涉及其演算法和實現原理,我們講的是ceph整體的定址流程,並藉此深入理解一下ceph中資料的操作流程。

這張就是ceph的定址流程示意圖了,大家可以看到裡面主要分四層,file->objects->pgs->osds。很多同學就要問了,這什麼objects,pgs是什麼新名詞啊,我們先來看一下哈。

file:就是我們想要儲存和訪問的檔案了,這個是面向我們使用者的,是我們直觀操作的物件。

object:這個object就是ceph底層rados所看到的物件,也就是在ceph中儲存的基本單位了。object的大小由rados限定(通常為2m或者4m)。就跟hdfs抽象乙個資料塊一樣,這裡也是為了方便底層儲存的組織管理。當file過大時,需要將file切分成大小統一的objects進行儲存。

pg (placement group):pg是乙個邏輯的概念,它的用途是對object的儲存進行組織和位置的對映,通過它可以更好的分配資料和定位資料。

osd (object storage device):這個前面我們也介紹過了,它就是真正負責資料訪問的服務。

pg和object是一對多的關係,乙個pg裡面組織若干個object,但是乙個object只能被對映到乙個pg中。

pg和osd是多對多的關係,乙個pg會對映到多個osd上(大於等於2,此處即為副本機制),每個osd也會承載大量的pg。

了解了上面一些基本的概念之後,就要到我們的定址流程講解了,通過定址流程圖我們可以看到,ceph中的定址需要經歷三次對映,分別是file->object,object->pg,pg->osd。我們重點提到的crush就是在第三步對映pg->osd出現的。我們依次看一下。

這一步非常簡單,就是將file切分成多個object。每個object都有唯一的id即oid。這個oid是怎樣產生的呢,就是根據檔名稱得到的。

圖中的ino為檔案唯一id(比如filename+timestamp),ono則為切分後某個object的序號(比如0,1,2,3,4,5等),根據該檔案的大小我們就會得到一系列的oid。

注:將檔案切分為大小一致的object可以被rados高效管理,而且可以將對單一file的處理變成並行化處理提高處理效率。

這裡需要做的工作就是將每個object對映到乙個pg中去,實現方式也很簡單就是對oid進行hash然後進行按位與計算得到某乙個pg的id。圖中的mask為pg的數量減1。這裡我們認為得到的pgid是隨機的,這與pg的數量和檔案的數量有關係。在足夠量級的程度上資料是均勻分布的。

最後一次對映就是將object所在的pg對映到實際的儲存位置osd上。這裡應用的就是crush演算法了,通過crush演算法可以通過pgid得到多個osd(跟配置有關)。

因為我們不會過多的討論crush是如何實現的,我們可以換個思考的角度認識一下crush都做了哪些工作。假如我們不用crush用hash是否可以?我們也套用上面的公式hash(pgid) & mask = osdid是否可以實現呢?

假如我們這裡也用hash演算法生成osdid,如果我們的osd的數量發生了改變,那麼mask的值就會改變,我們最終得到的osdid的值就會改變。這就意味著我當前這個pg儲存的位置發生了改變,該pg下的資料都需要遷移到另外乙個osd上去了,這肯定是行不通的。而ceph是支援多副本備份機制的,pg是應該對映到多個osd上去,而通過hash的方式只能得到乙個。所以這裡就需要crush了,crush可以根據集群的osd狀態和儲存策略配置動態得到osdid,從而自動化的實現高可靠性和資料均勻分布。

關於crush的詳細實現還需參考sage weil的**。

現在我們已經對三次對映有了乙個簡單的了解,大家可以看到我們整個過程中我們只知道檔案的名稱和檔案大小等資訊,並沒有去查詢檔案所在位置資訊等等,都是通過計算算出來的。上篇文章中我們提到的monitors(提供元資料服務儲存)實際上只是維護著整個集群中一些服務的狀態資訊也叫做clustermap。至於資料到底是在哪個osd是通過crush演算法計算出來的。所以這裡的元資料服務跟hdfs的namenode就又不一樣了。namenode裡面保持的就是每個block所在的具體位置。那麼ceph是怎樣做到的呢,其實就是因為邏輯層pg和crush演算法。讀懂了ceph的定址流程那麼對於ceph的資料讀寫流程自然就不陌生了。

是時候看看sage weil的**了

參考: ceph官方文件

ceph儲存資料的詳細流程(crush)

OllyDbg完全教程 示例 不完整

不幸的是,您不能通過這種方式除錯ollydbg的外掛程式,外掛程式關聯到ollydbg.exe檔案,windows系統不能在同乙個應用程式裡載入並執行兩個可執行檔案。解碼提示 decoding hints 在某些情況下,分析器不能區分 和資料。讓我們看看下面的例子 const char s 11 0...

含中文的response body不完整

自製的web伺服器通過socket 輸出流回寫響應時,發現response body中只要出現中文,就會短一截。當出現三個中文字元,缺少了 html 這六個字元。每多乙個中文字元,response body就會缺兩個字元,我立馬想到了utf 8編碼下中文字元佔三個位元組這一特點,這可不就是3 1 2...

ps 命令顯示不完整的問題

今天在使用ps命令的時候,無法查詢到指定名字的程序id,仔細查詢才發現ps命令查詢的結果中程序啟動的命令以及引數資訊被截斷了 使用者wanng啟動了乙個程序 wanng qytrunkcross,啟動引數是 config.lua 檔案,執行 ps u wanng 查詢使用者的程序,結果如下 wann...