6.0 pool 說明
(1) pool 是 ceph 存儲數據時的邏輯分區,它起到 namespace 的作用。其他分布式存儲系統,比如 Mogilefs、Couchbase、Swift 都有 pool
的概念,只是叫法不同。每個 pool 包含一定數量的 PG,PG 里的對象被映射到不同的OSD上,因此 pool 是分布到整個集群的。除了隔離數據,我們
也可以分別對不同的 POOL 設置不同的優化策略,比如副本數、數據清洗次數、數據塊及對象大小等。
(2) pg_num 和 pgp_num
1) 創建 pool 操作: ceph osd create pool ${pool-name} ${pg_num} ${pgp_num}
2) 這里強制選擇 pg_num 和 pgp_num,因為 ceph 集群不能自動計算 pg 數量。
3) 官方建議的 pg 使用數量
小於 5 個 osd 設置 pg_num 為 128
5 到 10 個 osd 設置 pg_num 為 512
10 到 50 個 osd 設置 pg_num 為 1024
如果超過 50 個 osd 你需要自己明白權衡點,並且能自行計算 pg_num 的數量,pg_num 通用計算方法如下:
(OSDs * 100)
Total PGs = ------------
pool size
例如: 60 個 osd,3 個副本
(60 * 100)
----------- = 2000
3
2^11 > 2000 < 2^10,所以 60 個 osd,副本數為 3 時,pg_num 設置為 2048,pgp_num 默認和 pg_num 保持一致。
6.1 列出存儲池
[root@ceph-deploy ~]# ceph osd lspools
1 device_health_metrics
2 cephfs_data
3 cephfs_metadata
6.2 創建存儲池
(1) 命令格式
# ceph osd pool create {pool-name} {pg-num} [{pgp-num}]
(2) 命令舉例
[root@ceph-deploy ~]# ceph osd pool create rbd-pool 64 64
[root@ceph-deploy ~]# ceph osd lspools
1 device_health_metrics
2 cephfs_data
3 cephfs_metadata
4 rbd-pool
6.3 設置存儲池配額
(1) 命令格式
# ceph osd pool set-quota {pool-name} [max_objects {obj-count}] [max_bytes {bytes}]
(2) 命令舉例
[root@ceph-deploy ~]# ceph osd pool set-quota rbd-pool max_objects 10000
[root@ceph-deploy ~]# ceph osd dump | grep rbd-pool
pool 4 'rbd-pool' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 64 pgp_num 64
autoscale_mode on last_change 378 flags hashpspool max_objects 10000 stripe_width 0
6.4 刪除存儲池
(1) 命令格式
# ceph osd pool delete {pool-name} [{pool-name} --yes-i-really-really-mean-it]
(2) 命令舉例
[root@ceph-deploy ~]# ceph osd pool delete rbd-pool rbd-pool --yes-i-really-really-mean-it
報錯:
Error EPERM: pool deletion is disabled; you must first set the mon_allow_pool_delete config option to true before
you can destroy a pool
解決辦法:
1) 在 ceph-deploy 節點修改 ceph.conf 配置文件
[root@ceph-deploy ~]# cd /root/my-cluster/
[root@ceph-deploy my-cluster]# cat >> ceph.conf << EOF
[mon]
mon_allow_pool_delete = true
EOF
2) 推送修改的 ceph.conf 文件到所有節點(覆蓋舊的/etc/ceph/ceph.conf)
[root@ceph-deploy my-cluster]# ceph-deploy --overwrite-conf config push ceph-deploy ceph-node01 ceph-node02 \
ceph-node03
3) 在安裝 ceph-mon 服務的節點上重啟 ceph-mon 服務
# 在ceph-node01、ceph-node02、ceph-node03節點上操作
# systemctl restart ceph-mon.target
4) 查看 ceph-mon 狀態
[root@ceph-deploy my-cluster]# ceph mon stat
e1: 3 mons at {
ceph-node01=[v2:172.16.1.31:3300/0,v1:172.16.1.31:6789/0],
ceph-node02=[v2:172.16.1.32:3300/0,v1:172.16.1.32:6789/0],
ceph-node03=[v2:172.16.1.33:3300/0,v1:172.16.1.33:6789/0]
}, election epoch 34, leader 0 ceph-node01, quorum 0,1,2 ceph-node01,ceph-node02,ceph-node03
5) 刪除指定存儲池成功
[root@ceph-deploy my-cluster]# ceph osd pool delete rbd-pool rbd-pool --yes-i-really-really-mean-it
pool 'rbd-pool' removed
6.5 重命名存儲池
(1) 命令格式
# ceph osd pool rename {current-pool-name} {new-pool-name}
(2) 命令舉例
[root@ceph-deploy ~]# ceph osd pool rename cephfs_data cephfs_data_lc
[root@ceph-deploy ~]# ceph osd pool rename cephfs_metadata cephfs_metadata_lc
[root@ceph-deploy ~]# ceph osd lspools
1 device_health_metrics
2 cephfs_data_lc
3 cephfs_metadata_lc
[root@ceph-deploy ~]# ceph fs ls
name: cephfs, metadata pool: cephfs_metadata_lc, data pools: [cephfs_data_lc ]
6.6 查看存儲池統計信息
# 顯示整個集群的所有磁盤利用率信息,包含池信息
[root@ceph-deploy ~]# ceph df
--- RAW STORAGE ---
CLASS SIZE AVAIL USED RAW USED %RAW USED
hdd 120 GiB 110 GiB 3.8 GiB 9.8 GiB 8.18
TOTAL 120 GiB 110 GiB 3.8 GiB 9.8 GiB 8.18
--- POOLS ---
POOL ID PGS STORED OBJECTS USED %USED MAX AVAIL
device_health_metrics 1 1 0 B 0 0 B 0 34 GiB
cephfs_data_lc 2 64 1.2 GiB 302 3.5 GiB 3.30 34 GiB
cephfs_metadata_lc 3 16 263 KiB 23 2.3 MiB 0 34 GiB
# 顯示池的利用率統計信息
[root@ceph-deploy ~]# rados df
6.7 給存儲池做快照
(1) 命令格式
# ceph osd pool mksnap {pool-name} {snap-name}
(2) 命令舉例
[root@ceph-deploy ~]# ceph osd pool mksnap cephfs_data_lc cephfs_data_lc_snap
[root@ceph-deploy ~]# ceph osd dump | grep cephfs_data_lc
[root@ceph-deploy ~]# rados lssnap -p cephfs_data_lc
1cephfs_data_lc_snap2021.12.22 14:01:15
1 snaps
6.8 刪除存儲池的快照
(1) 命令格式
# ceph osd pool rmsnap {pool-name} {snap-name}
(2) 命令舉例
[root@ceph-deploy ~]# ceph osd pool rmsnap cephfs_data_lc cephfs_data_lc_snap
removed pool cephfs_data_lc snap cephfs_data_lc_snap
[root@ceph-deploy ~]# rados lssnap -p cephfs_data_lc
0 snaps
6.9 獲取存儲池選項值
(1) 命令格式
# ceph osd pool get {pool-name} {key}
(2) 命令舉例
# 查看可以使用的 key
[root@ceph-deploy ~]# ceph osd pool get cephfs_data_lc ?
# 查看存儲池的副本數
[root@ceph-deploy ~]# ceph osd pool get cephfs_data_lc size
size: 3
[root@ceph-deploy ~]# ceph osd dump | grep 'replicated size'
6.10 調整存儲池選項值
(1) 命令格式
# ceph osd pool set {pool-name} {key} {value}
size # 設置存儲池中的對象副本數,詳情參見設置對象副本數,僅適用於副本存儲池。
min_size # 設置 I/O 需要的最小副本數,詳情參見設置對象副本數,僅適用於副本存儲池。
pg_num # 計算數據分布時的有效 PG 數,只能大於當前 PG 數。
pgp_num # 計算數據分布時使用的有效 PGP 數量,小於等於存儲池的 PG 數。
hashpspool # 給指定存儲池設置/取消 HASHPSPOOL 標志。
target_max_bytes # 達到 max_bytes 閥值時會觸發 Ceph 沖洗或驅逐對象。
target_max_objects # 達到 max_objects 閥值時會觸發 Ceph 沖洗或驅逐對象。
scrub_min_interval # 在負載低時,洗刷存儲池的最小間隔秒數,如果是 0,就按照配置文件里的 osd_scrub_min_interval 。
scrub_max_interval # 不管集群負載如何,都要洗刷存儲池的最大間隔秒數,如果是 0,就按照配置文件里的 osd_scrub_max_interval 。
deep_scrub_interval # "深度"洗刷存儲池的間隔秒數,如果是 0,就按照配置文件里的 osd_deep_scrub_interval 。
(2) 命令舉例(更改存儲池的副本數)
# 更改前存儲池實際最大可用容量
[root@ceph-deploy ~]# ceph df
--- RAW STORAGE ---
CLASS SIZE AVAIL USED RAW USED %RAW USED
hdd 120 GiB 110 GiB 3.8 GiB 9.8 GiB 8.18
TOTAL 120 GiB 110 GiB 3.8 GiB 9.8 GiB 8.18
--- POOLS ---
POOL ID PGS STORED OBJECTS USED %USED MAX AVAIL
device_health_metrics 1 1 0 B 0 0 B 0 34 GiB
cephfs_data_lc 2 64 1.2 GiB 302 3.5 GiB 3.30 34 GiB
cephfs_metadata_lc 3 16 263 KiB 23 2.3 MiB 0 34 GiB
# 更改存儲池的副本數由 3 變為 2
[root@ceph-deploy ~]# ceph osd pool get cephfs_data_lc size
size: 3
[root@ceph-deploy ~]# ceph osd pool set cephfs_data_lc size 2
set pool 2 size to 2
[root@ceph-deploy ~]# ceph osd pool get cephfs_data_lc size
size: 2
# 更改后存儲池實際最大可用容量
[root@ceph-deploy ~]# ceph df
--- RAW STORAGE ---
CLASS SIZE AVAIL USED RAW USED %RAW USED
hdd 120 GiB 111 GiB 2.6 GiB 8.6 GiB 7.20
TOTAL 120 GiB 111 GiB 2.6 GiB 8.6 GiB 7.20
--- POOLS ---
POOL ID PGS STORED OBJECTS USED %USED MAX AVAIL
device_health_metrics 1 1 0 B 0 0 B 0 35 GiB
cephfs_data_lc 2 64 1.2 GiB 302 2.3 GiB 2.21 52 GiB
cephfs_metadata_lc 3 16 263 KiB 23 2.3 MiB 0 35 GiB
注:
cephfs_data_lc 存儲池的實際可用容量由 34GiB(總容量 120GiB 減去集群占用容量后除以 3 副本數) 變為 52GiB(總容量 120GiB 減去集
群占用容量后除以 2 副本數),自己手動計算的結果和 ceph 集群計算的結果相差不多。多個存儲池對 ceph 集群存儲容量是共享的。
6.11 pool快照的使用
(1) 將測試文件導入至存儲池中,並指定一個新的 object 名字
# 格式
# rados -p {pool-name} put {object-name} {file-name}
[root@ceph-deploy ~]# rados -p cephfs_data_lc put testobject /etc/hosts
(2) 查看 pool 中的 object 文件
[root@ceph-deploy ~]# rados -p cephfs_data_lc ls | grep 'testobject'
testobject
(3) 創建 pool 快照
[root@ceph-deploy ~]# ceph osd pool mksnap cephfs_data_lc cephfs_data_lc_snap
created pool cephfs_data_lc snap cephfs_data_lc_snap
(4) 查看 pool 快照
[root@ceph-deploy ~]# rados lssnap -p cephfs_data_lc
3cephfs_data_lc_snap2021.12.22 15:57:05
1 snaps
(5) 刪除 object 對象
[root@ceph-deploy ~]# rados -p cephfs_data_lc rm testobject
(6) 再次查看 pool 下的對象
[root@ceph-deploy ~]# rados -p cephfs_data_lc ls | grep 'testobject'
testobject
[root@ceph-deploy ~]# rados -p cephfs_data_lc rm testobject
error removing cephfs_data_lc>testobject: (2) No such file or directory
注:
根據上面輸出可以看出,雖然確實已經刪除對象文件,但是這個池中還是有這個 object 文件存在,實際上已經不再占存儲空間
了,相當於是一個緩存的輸出,主要原因是被打了快照的對象文件在快照被刪除之前被刪除了,即使后面快照被刪除后還會存在。
(7) 指定 pool 快照中的對象文件進行回滾
[root@ceph-deploy ~]# rados rollback -p cephfs_data_lc testobject cephfs_data_lc_snap
rolled back pool cephfs_data_lc to snapshot cephfs_data_lc_snap
[root@ceph-deploy ~]# rados -p cephfs_data_lc ls | grep 'testobject'
testobject
注:
根據 ls 輸出顯示看不出什么,所以我們來再刪除測試一下
(8) 刪除 object 測試
[root@ceph-deploy ~]# rados -p cephfs_data_lc rm testobject
[root@ceph-deploy ~]#
注:
可見已經可以正常刪除,即代表文件通過快照已恢復,代表快照回滾恢復功能正常,到這里快照測試也就結束了
(9) 刪除快照
[root@ceph-deploy ~]# ceph osd pool rmsnap cephfs_data_lc cephfs_data_lc_snap
removed pool cephfs_data_lc snap cephfs_data_lc_snap
[root@ceph-deploy ~]# rados lssnap -p cephfs_data_lc
0 snaps
[root@ceph-deploy ~]# rados -p cephfs_data_lc ls | grep 'testobject'
testobject
[root@ceph-deploy ~]# rados -p cephfs_data_lc rm testobject
error removing cephfs_data_lc>testobject: (2) No such file or directory
(10) 結論
1) Pool 池的快照相對來說是有局限性的,沒辦法直接恢復快照里邊全部 object 對象文件,只能一個個來恢復,這樣的設計效果可能是因為如
果 pool 池直接整體恢復,會導致整個 ceph 集群數據混亂,畢竟集群中數據是分布式存放的。
2) ceph 支持對整個 pool 創建快照,作用於這個 pool 的所有對象。
3) ceph 有兩種 pool 模式
Pool Snapshot,創建一個新的pool時,默認也是這種模式。
Self Managed Snapsoht,用戶管理的 snapshot,這個用戶指的是 librbd,也就是說如果在 pool 中創建了 rbd 實例就自動轉化為這種模式。
注意: 這兩種模式是相互排斥,只能使用其中一個,因此,如果 pool 中曾經創建了 rbd 對象(即使當前刪除了所有的image實例)就不能再對這個
pool 做快照了,反之,如果對一個 pool 做了快照,就不能創建 rbd image 了。
7 用戶管理
Ceph 把數據以對象的形式存於各存儲池中。Ceph 用戶必須具有訪問存儲池的權限才能夠讀寫數據。另外,Ceph 用戶必須具有執行權限才能夠使用 Ceph 的管理命令。
7.1 查看用戶信息
1 查看所有用戶信息
[root@ceph-deploy ~]# ceph auth list
2 獲取所有用戶的key與權限相關信息
[root@ceph-deploy ~]# ceph auth get client.admin
exported keyring for client.admin
[client.admin]
key = AQArL5JhBEiAKRAAymBtomUPKP6M/BSI17oXyg==
caps mds = "allow *"
caps mgr = "allow *"
caps mon = "allow *"
caps osd = "allow *"
3 如果只需要某個用戶的key信息,可以使用pring-key子命令
[root@ceph-deploy ~]# ceph auth print-key client.admin
AQArL5JhBEiAKRAAymBtomUPKP6M/BSI17oXyg==
7.2 添加用戶
# ceph auth add client.john mon 'allow r' osd 'allow rw pool=liverpool'
# ceph auth get-or-create client.paul mon 'allow r' osd 'allow rw pool=liverpool'
# ceph auth get-or-create client.george mon 'allow r' osd 'allow rw pool=liverpool' -o george.keyring
# ceph auth get-or-create-key client.ringo mon 'allow r' osd 'allow rw pool=liverpool' -o ringo.key
7.3 修改用戶權限
# ceph auth caps client.john mon 'allow r' osd 'allow rw pool=liverpool'
# ceph auth caps client.paul mon 'allow rw' osd 'allow rwx pool=liverpool'
# ceph auth caps client.brian-manager mon 'allow *' osd 'allow *'
# ceph auth caps client.ringo mon ' ' osd ' '
7.4 刪除用戶
# ceph auth del {TYPE}.{ID}
說明: 其中,{TYPE} 是 client,osd,mon 或 mds 的其中一種。{ID} 是用戶的名字或守護進程的 ID。