ceph pg pool


Pool 對應 PG PGP數量的計算公式:  官方計算地址

Total PGs = ((Total_number_of_OSD * Target PGs per OSD) / max_replication_count) / pool_count

Target PGs per OSD 通常被設置為 100

創建POOL

通常在創建pool之前,需要覆蓋默認的pg_num,官方推薦:

  • 若少於5個OSD, 設置pg_num為128。
  • 5~10個OSD,設置pg_num為512。
  • 10~50個OSD,設置pg_num為4096。
  • 超過50個OSD,可以參考pgcalc計算
語法格式:ceph osd pool create [pool-name] [pg_num]

例如:[ceph@cephnode01 my-cluster]$ ceph osd pool create pool01 64

  

Pool是ceph存儲數據時的邏輯分區,它起到namespace的作用。其他分布式存儲系統,比如Mogilefs、Couchbase、Swift都有pool的概念,只是叫法不同。每個pool包含一定數量的PG,PG里的對象被映射到不同的OSD上,因此pool是分布到整個集群的。

  pool有兩種方法增強數據的可用性,一種是副本(replicas),另一種是EC(erasure coding 糾錯碼)。從Firefly版本起,EC功能引入。在EC里,數據被打散成碎片,加密,然后進行分布式存儲。ceph由於其分布式能力,處理EC非常成功。pool在創建時可以設置這兩種方法之一,但不能同時設置兩者。

pool默認的副本數量是3,我們可以自己控制副本的數量。ceph的復制能力非常靈活,可以在任何時候更改這個參數:

 語法格式: ceph osd pool set {Pool-name} size {num}
 例如:  ceph osd pool set firstpool size 2

   在數據寫往pool時,遵循CRUSH的規則集,也就是說,寫往哪個位置以及副本數量,受規則集影響。這個規則集是pool的重要功能。比如我們可以通過規則集,定義一個pool使用SSD存儲,另一個pool使用SATA存儲。

  pool也支持snapshot功能。可以運行ceph osd pool mksnap命令創建pool的快照,並且在必要的時候恢復它。還可以設置pool的擁有者屬性,從而進行訪問控制。

創建ceph pool的命令如下,它的參數包括pool名字、PG和PGP的數量:

$ ceph osd pool create mytest 128 128
pool 'mytest' created

查看pool有幾種方式,比如:

復制代碼
$ rados lspools
data
metadata
rbd
mytest

$rados df

  pool name category KB objects clones degraded unfound rd rd KB wr wr KB
  data - 0 0 0 0 0 0 0 0 0
  metadata - 0 0 0 0 0 0 0 0 0
  mytest - 2 4 2 0 0 0 0 5 3
  rbd - 0 0 0 0 0 0 0 0 0
  total used 15830040 4
  total avail 109934580

$ ceph osd lspools
0 data,1 metadata,2 rbd,3 mytest,

$ ceph osd dump |grep pool
pool 0 'data' replicated size 3 min_size 2 crush_ruleset 0 object_hash rjenkins pg_num 128 pgp_num 128 last_change 43 flags hashpspool crash_replay_interval 45 stripe_width 0
pool 1 'metadata' replicated size 3 min_size 2 crush_ruleset 0 object_hash rjenkins pg_num 128 pgp_num 128 last_change 41 flags hashpspool stripe_width 0
pool 2 'rbd' replicated size 3 min_size 2 crush_ruleset 0 object_hash rjenkins pg_num 128 pgp_num 128 last_change 45 flags hashpspool stripe_width 0
pool 3 'mytest' replicated size 3 min_size 2 crush_ruleset 0 object_hash rjenkins pg_num 128 pgp_num 128 last_change 58 flags hashpspool stripe_width 0
復制代碼

毫無疑問ceph osd dump輸出的信息最詳盡,包括pool ID、副本數量、CRUSH規則集、PG和PGP數量等。

可以調整剛創建的pool的副本數量:

復制代碼
root@ceph002:/etc/ceph# ceph osd pool set mytest size 2
set pool 3 size to 2

root@ceph002:/etc/ceph# ceph osd dump | grep pool pool 0 'data' replicated size 3 min_size 2 crush_ruleset 0 object_hash rjenkins pg_num 64 pgp_num 64 last_change 1 flags hashpspool crash_replay_interval 45 stripe_width 0 pool 1 'metadata' replicated size 3 min_size 2 crush_ruleset 0 object_hash rjenkins pg_num 64 pgp_num 64 last_change 1 flags hashpspool stripe_width 0 pool 2 'rbd' replicated size 3 min_size 2 crush_ruleset 0 object_hash rjenkins pg_num 64 pgp_num 64 last_change 1 flags hashpspool stripe_width 0 pool 3 'mytest' replicated size 2 min_size 2 crush_ruleset 0 object_hash rjenkins pg_num 128 pgp_num 128 last_change 15 flags hashpspool stripe_width 0 root@ceph002:/etc/ceph#
復制代碼

如下命令演示ceph的snapshot功能。我們往pool里寫入一個對象,然后獲取pool的快照,接着刪除對象,最后從快照里恢復數據。

復制代碼
# 寫入一個文件
$ rados -p mytest put testfile /etc/hosts

# 查看這個文件
$ rados -p mytest ls
testfile

# 創建pool的快照
$ rados mksnap snapshot001 -p mytest
created pool mytest snap snapshot001

# 查看pool的快照
$ rados lssnap -p mytest
1 snapshot001 2015.11.30 09:50:38
1 snaps

# 刪除文件
$ rados -p mytest rm testfile

# 從快照里回滾文件
$ rados rollback -p mytest testfile snapshot001
rolled back pool mytest to snapshot snapshot001

# 確認結果
$ rados -p mytest ls
testfile
復制代碼

刪除pool會同步刪除所有快照。在刪除pool后,需要刪除pool的CRUSH規則集,假如你手工創建過它們。同樣也需刪除這個pool的授權用戶。

$ ceph osd pool delete mytest mytest --yes-i-really-really-mean-it
pool 'mytest' removed


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM