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