5.7、Ceph集群Pool操作
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。