溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

ceph-pg哈希的示例分析

發(fā)布時間:2021-12-17 09:32:10 來源:億速云 閱讀:162 作者:小新 欄目:云計算

小編給大家分享一下ceph-pg哈希的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

序言

ceph簡介

Ceph 是一個統(tǒng)一的分布式存儲系統(tǒng),設(shè)計初衷是提供較好的性能、可靠性和可擴(kuò)展性。底層的rados分布式存儲是ceph的精華所在,ceph以rados為基礎(chǔ)在上層封裝了對象、塊、文件存儲接口??蛻舳丝梢酝ㄟ^ceph提供的librados庫直連rados集群,待存對象通過計算獲取指定機(jī)器,然后將數(shù)據(jù)發(fā)送到該機(jī)器上存儲。因為都是通過計算的方式,所以rados不需要維護(hù)一個中心table來存儲對象所在的位置,這種計算型的方式不僅快速,而且能夠節(jié)省節(jié)點的資源。 下圖為ceph的總體框架圖:

ceph-pg哈希的示例分析

數(shù)據(jù)如何映射

Ceph對集群中所有存儲資源進(jìn)行池化管理,對象通過計算直接映射到底層的osd中,為了更好的管理和映射數(shù)據(jù),ceph有如下的概念。 - object: 用戶需要存儲的對象,可以是文檔、視頻、音頻等等文件,用戶在存儲的時候需要指定唯一的對象名。 - pool:資源池,這是一個虛擬概念,一個集群可以分出多個pool,也可以使用單個pool,但是必須有一個pool。 用戶可以針對不同的pool指定不同的CRUSH規(guī)則,也可以針對不同的pool指定不同的數(shù)據(jù)冗余策略。 - pg:全稱 placement groups, 一個pool對應(yīng)多個pg, 通過hash對象會存儲到pool中的特定pg中。在創(chuàng)建pool的時候就要把pg數(shù)量規(guī)劃好。pg數(shù)量只可以增大不可以縮小。 - osd:最終的數(shù)據(jù)都是存儲在特定的osd上,一般情況下一個osd會管理一塊磁盤。

對象的映射邏輯架構(gòu)如下:

ceph-pg哈希的示例分析

pg哈希算法

pg哈希算法代碼:

/* 
x: 對象key值
b: pg 數(shù)
bmask: 掩碼
*/
static inline int ceph_stable_mod(int x, int b, int bmask)
{
    if ((x & bmask) < b)
        return x & bmask;
    else
        return x & (bmask >> 1);
}

object通過hash對應(yīng)到不同的pg中,ceph使用掩碼的方式來代替取模操作。例如PG數(shù)目對應(yīng)的最高比特位為n,則其掩碼為2^n -1, 將某個對象映射到PG時,直接使用 object & (2^n -1)即可。這種直接與的方式其實就是取object二進(jìn)制的后 n 位作為pg number,這種方式不僅高效,而且運算速度快。 可能有人會問這個n是怎么來的,其實n就是PG數(shù)二進(jìn)制表示中1最高位的1。ceph中如果設(shè)置PG數(shù)目為a,那么程序會得到一個最小的n,使 a <= 2^n,例如:(a=12, n=4), (a=16, n=4), (a=17, n=5),以此類推。 但是這種方案存在一個潛在的問題,如果運維人員設(shè)置的PG數(shù)是2的冪次方的話,那么這種方案比較完美。如果PG數(shù)目不是2的冪次方的話這種映射會產(chǎn)生空穴,即將某些對象映射到一些實際上不存在的PG上。如下圖所示:

ceph-pg哈希的示例分析

上圖中如果如果PG數(shù)目為14,但是n=4,直接hash的話會產(chǎn)生 0~15 共計16中不同的結(jié)果,但是12 ~ 15這4個PG是不存在的,為了解決這個問題ceph做了降級方案。因為 n 為PG數(shù)的最高位,因此可以得到如下的方程式。

2^(n-1) < PG數(shù) <= 2^n

由此可得 [0,2^(n-1)]內(nèi)PG一定是存在的,可以通過 object & 2^(n-1) 來將那些實際上不存在的PG重新映射到這個小的區(qū)間內(nèi),如下圖所示:

ceph-pg哈希的示例分析

如上圖所示,ceph會將映射出不存在的PG重新映射到前面存在的區(qū)間中。所以如果ceph集群設(shè)置的PG數(shù)目不是2的冪次方的話,可能會造成中間某一段的PG所承載的數(shù)據(jù)高于其它PG,例如:PG數(shù)為12時會造成4,5,6,7四個PG所承載的對象數(shù)是其它PG的兩倍,所以集群在穩(wěn)定時PG數(shù)最好的2的冪次方。

PG擴(kuò)容

在現(xiàn)實使用中如果需要進(jìn)行擴(kuò)容,在pg雙倍擴(kuò)容的情況下可以一步步的擴(kuò)容以減少一步到位的擴(kuò)容帶來的數(shù)據(jù)遷移影響。 例如: 將 pg 數(shù)從 8 擴(kuò)容到 16 ,如果直接擴(kuò)容到16會遷移 1/2 的數(shù)據(jù),這種情況下集群內(nèi)部數(shù)據(jù)遷移可能會影響用戶的使用,管理員可以采取 8 -> 12 -> 16這樣的擴(kuò)容方式。 根據(jù)上述圖的描述,從8 -> 12 會遷移集群內(nèi)部 1/4 的數(shù)據(jù),也就是將pg數(shù)為 0~3 的數(shù)據(jù)遷移到 8~11 中,而 4~7 的數(shù)據(jù)是不會遷移的(因為重新hash它還是落到 4~7 這個區(qū)間),數(shù)據(jù)遷移完成后可以再將 pg 數(shù)從 12 ~16,這種情況下還是會遷移 1/4 的數(shù)據(jù)(將pg為 4~7 的數(shù)據(jù)遷移到 12~15 中),這樣分兩步遷移數(shù)據(jù)總的數(shù)據(jù)遷移量是一樣的,都是 1/2,但是分步遷移的話可以緩解一段時間內(nèi)的數(shù)據(jù)遷移量。

如果不是進(jìn)行雙倍擴(kuò)容的話情況可能就比較復(fù)雜了,也可以采取這種通過增長遷移時間來換取短時間內(nèi)少遷移數(shù)據(jù)的方案。

直接取模的弊端

可能有人會問為什么不使用簡單的取模呢,因為這種方式在擴(kuò)容的時候遷移的數(shù)據(jù)量無法控制。

設(shè): pg 數(shù)為 a,需要將 pg 數(shù)擴(kuò)容至 b, a 和 b 的最小公倍數(shù)為 d,某個對象的key值為 q

由此可以得到如下兩個方程式:
ca + e = q, e < a, q < d;
ub + v = q, v < b, q < d;

因為最小公倍數(shù)為 d, 如果 c != 0 && u != 0, 所以 ca != ub, 所以 e != v

當(dāng) c == u == 0的情況下, e == v,
所以需要遷移數(shù)據(jù)比例為: (d-a)/d

由此可以得到直接取模的方式無法控制遷移的數(shù)據(jù)量,例如 pg 數(shù)從 8 -> 12,直接取模的話需要遷移 (24 - 8) / 24 = 2/3 的數(shù)據(jù)。

以上是“ceph-pg哈希的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI