當Ceph 集羣接收到數據存儲的請求時,它被分散到各個 PG 中。然而, CRUSH 首先將數據分解成 一組對象,而後根據對象名稱、複製級別和系統中總的 PG 數目等信息執行散列操做,再將結果生成 PG ID。 PG 是一組對象的邏輯集合,經過複製它到不一樣的 OSD 上來提供存儲系統的可靠性。 根據 Ceph 池的複製級別,每一個 PG 的數據會被複制並分發到 Ceph集羣的多個 OSD上。 能夠將 PG 當作一個邏輯容器,這個容器包含多個對象,同時這個邏輯容器被映射到多個 OSD上。 PG 是保障 Ceph 存儲系統的可伸縮性和性能必不可少的部分。
node
沒有 PG ,在成千上萬個 OSD 上管理和跟蹤數以百萬計的對象的複製和傳播是至關困難的。 沒有 PG 狀況下管理這些對象所消耗的計算資源也是噩夢。 與獨立的管理每個對象不一樣的是,咱們的系統只管理包含大量對象的 PG。 這使得 Ceph 成爲一個更易於管理和更易上手的系統。 每一個 PG 須要必定的系統資源(如 CPU 和內存),由於每一個 PG 須要管理多個對象 。所以應該精心計算集羣中 PG 的數量 。通常來講,增長集羣 PG 的數量可以下降每一個 OSD 上的負載,可是應該以規範的方式進行增長, 建議每一個 OSD上放置 50 - 100個PG。 這是爲了不 PG 佔用 OSD 節點太多的資源。 隨着存儲數據的增長,一樣須要根據集羣規模來調整 PG數, 當在集羣中添加或者刪除一個設備的時候,大部分的 PG 保持不變;CRUSH 管理 PG 在整個集羣內部的分佈。PGP 是用於定位的 PG 的總數,它應該等於 PG 的總數。app
計算正確的 PG 數是構建一個企業級的 Ceph 存儲集羣中相當重要的一步。由於 PG在必定程度上可以提升或者影響存儲性能。
計算 Ceph 集羣中 PG 數的公式以下:
PG 總數= (OSD 總數 100) /最大副本數
結果必須舍入到最接近2的N 次幕的值。好比:若是 Ceph 集羣有 160個 OSD 且副本數是3 ,這樣根據公式計算獲得的 PG 總數是 5333.3 ,所以舍入這個值到最接近的2的N次幕的結果就是 8192個 PG。咱們還應該計算 Ceph 集羣中每個池中的 PG 總數 計算公式以下:
PG 總數= ((OSD 總數 100) /最大副本數) /池數分佈式
一樣使用前面的例子: OSD 總數是 160 ,副本數是3 ,池總數是3。 根據上面這個公式,計算獲得每一個池的 PG 總數應該是 1777.7 ,最後舍入到 2的N次幕獲得結果爲每一個池 2048個PG。平衡每一個池中的 PG 數和每一個 OSD 中的 PG 數對於下降 OSD 的方差、避免速度緩慢的恢復進程是至關重要的。ide
若是你管理一個 Ceph 存儲集羣,有時你可能須要修改池的 PG 和PGP 的值。 在修改PG和 PGP 以前,咱們先來了解一下 PGP 是什麼。PGP 是爲實現定位而設置的 PG ,它的值應該與 PG 的總數(即 pg num) 保持一致。對於Ceph 的一個池而言,若是你增長 PG 的數目(即 pg_num 的值),你還應該調整 pgp_num到一樣的值,這樣集羣纔可以開始再平衡 下文將詳細闡述神祕的再平衡機制。參數 pg_num 定義了 PG 的數量,這些 PG 映射到 OSD 當任意池的 pg_num 增長的時候,這個池的每一個 PG 一分爲二,但它們依然保持跟源 OSD 的映射。直到這個時候,性能
Ceph 依然沒有開始再平衡 此時,當你增長該池的 pgp_num 的值時, PG 纔開始從源 OSD遷移到其餘 OSD ,正式開始再平衡 從這能夠看出, PGP 在集羣再平衡中扮演着重要的角色。如今,讓咱們來學習如何改變 pg_num和 pgp_num:學習
1 )獲取現有的 PG PGP 值:
[root@node140 ~]# ceph osd pool get rbd pg_num
pg_num: 128
[root@node140 ~]# ceph osd pool get rbd pgp_num
pgp_num: 128對象
2 )使用下面的命令能夠檢查池的副本數,找到其中 rep size 的值:
[root@node140 ~]# ceph osd dump | grep size
pool 3 'rbd' replicated size 3 min_size 1 crush_rule 0 object_hash rjenkins pg_num 128 pgp_num 128 autoscale_mode warn last_change 100 flags hashpspool,selfmanaged_snaps stripe_width 0 application rbd
pool 4 'remote_rbd' replicated size 3 min_size 1 crush_rule 0 object_hash rjenkins pg_num 128 pgp_num 128 autoscale_mode warn last_change 112 flags hashpspool,selfmanaged_snaps stripe_width 0 application rbdblog
3 )依據下面的參數使用公式計算新的 PG 的數目:
OSD 總數 =9,池副本數 (rep size) = 2. 池數 =3進程
根據前面的公式,獲得每一個地的 PG 數是 150 ,而後舍入到2的N 次幕 256。ip
4) 修改池的 PG和PGP:
[root@node140 ~]# ceph osd pool set rbd pg_num 256
set pool 3 pg_num to 256
[root@node140 ~]# ceph osd pool set rbd pgp_num 256
set pool 3 pgp_num to 256
5 )一樣,修改 metadata 池和 rbd 池的 PG PGP:
[root@node140 ~]# ceph osd pool set metadata pg_num 256
set pool 3 pg_num to 256
[root@node140 ~]# ceph osd pool set metadata pgp_num 256
set pool 3 pgp_num to 256
註釋:引用《ceph分佈式存儲學習指南》