ceph常用命令
ceph常用命令
ceph的系列博客:https://blog.51cto.com/u_7603402/category10.html
Pool是存储对象的逻辑分区,它规定了数据冗余的类型和对应的副本分布策略;支持两种类型:副本(replicated)和 纠删码( Erasure Code);目前我们公司内部使用的Pool都是副本类型(3副本);
PG( placement group)是一个放置策略组,它是对象的集合,该集合里的所有对象都具有相同的放置策略;简单点说就是相同PG内的对象都会放到相同的硬盘上; PG是 ceph的核心概念, 服务端数据均衡和恢复的最小粒度就是PG;
OSD是负责物理存储的进程,一般配置成和磁盘一一对应,一块磁盘启动一个OSD进程;
下面这张图形象的描绘了它们之间的关系:
- 一个Pool里有很多PG,
- 一个PG里包含一堆对象;一个对象只能属于一个PG;
- PG有主从之分,一个PG分布在不同的OSD上(针对三副本类型)
一. 集群查看
1.查看池目前使用的状态和存储
apt-get install ceph #客户端安装
ceph -s
ceph df
df -Th | grep rbd #查看挂载情况
提示:
STORED 代表存储数据的真实大小
USED 代表一共使用了多大的空间(因为这里创建的池是默认的三副本,就是复制了三份,所以100x3,就是300M)
查看集群检测报告
ceph mgr module enable insights
ceph insights
查看集群iostat
ceph iostat
查看集群访问地址
ceph mgr services
2. ceph健康状态详情
ceph health detail
pg状态 解释
unclean PG 故障, 没有完成指定副本数量
degraded PG中的一些对象还没有被复制到规定的份数
undersized 该PG的副本数量小于存储池所配置的副本数量
二. pool相关命令
1. 查看集群中的pools
ceph osd lspools
2. 修改pool的名字
ceph osd pool rename device_health_metrics RDB_Test_pool1
3. 查看pool中pg, pgp数量
osd pool get pg_num|pgp_num
例如
ceph osd pool get RDB_Test_pool2 pg_num
ceph osd pool get RDB_Test_pool2 pgp_num
4. 调整pg, pgp的数量
ceph osd pool set RDB_Test_pool2 pg_num 64
ceph osd pool set RDB_Test_pool2 pgp_num 64
5. 查看pool的副本数
ceph osd pool get RDB_Test_pool2 size
# 系统默认是3个副本,按照实际生产环境一般采用最少为2个副本就可以了,可以直接加载到ceph.conf配置文件中
vi ceph.conf
osd_pool_default_min_size = 2
6. 调整pool副本数
ceph osd pool set RDB_Test_pool2 size 3
7. 设置pool的配额
设置允许最大object数量为100
ceph osd pool set-quota mytest max_objects 100
想恢复,很简单,调整下max_objects值为0即可, 0为默认值,即代表不做限制
设置允许容量限制为10G
ceph osd pool set-quota mytest max_bytes $(10*1024*1024*1024))
或者写成
ceph osd pool set-quota mytest max_bytes 100M
查看当前池的配额
ceph osd pool get-quota mytest
参考:pool池限制大小的方式
https://blog.csdn.net/weixin_43860781/article/details/112907361
8. 删除pool
ceph osd pool delete mytest mytest --yes-i-really-really-mean-it
9. 创建ceph pool
ceph osd pool create mytest 128 128 #它的参数包括pool名字、PG和PGP的数量。
说明:
若少于5个OSD, 设置pg_num为128。
5~10个OSD,设置pg_num为512。
10~50个OSD,设置pg_num为4096。
创建的pool name不可含有特殊字符,如“-”等
PG和PGP数量一定要根据OSD的数量进行调整,计算公式如下,但是最后算出的结果一定要接近或者等于一个2的指数:
One pool total PGs = (Total_number_of_OSD * 100) / max_replication_count
三. 镜像相关
1. 查看池中的镜像
rbd ls mytest
查看本节点上镜像映射的块设备, 在本节点可找到相应的/dev/rdb目录。
[root@rook-ceph-tools-6f44db7c58-pj7fm /]# rbd showmapped
id pool namespace image snap device
0 replicapool csi-vol-e76d6040-0626-11ec-b89e-62196757365f - /dev/rbd0
1 replicapool csi-vol-591e9be4-f9be-11eb-b89e-62196757365f - /dev/rbd1
2 replicapool csi-vol-98d9aac4-fa46-11eb-b89e-62196757365f - /dev/rbd2
3 replicapool csi-vol-5900c7d7-f9be-11eb-b89e-62196757365f - /dev/rbd3
4 replicapool csi-vol-595c04b0-f9be-11eb-b89e-62196757365f - /dev/rbd4
5 replicapool csi-vol-74c999a2-f5d4-11eb-b89e-62196757365f - /dev/rbd5
6 replicapool csi-vol-74cb2b64-f5d4-11eb-b89e-62196757365f - /dev/rbd6
7 replicapool csi-vol-74c62911-f5d4-11eb-b89e-62196757365f - /dev/rbd7
8 replicapool csi-vol-0dd6bd0f-fc10-11eb-b89e-62196757365f - /dev/rbd8
9 replicapool csi-vol-3dde17cc-fb45-11eb-b89e-62196757365f - /dev/rbd9
...
2. 查看池中的某个镜像信息
root@k8s-master1:~# rbd info replicapool/csi-vol-0695f963-f8e8-11eb-b89e-62196757365f
rbd image 'csi-vol-0695f963-f8e8-11eb-b89e-62196757365f':
size 2 GiB in 512 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 88232bc33526
block_name_prefix: rbd_data.88232bc33526 #这个值为镜像的指纹
format: 2
features: layering
op_features:
flags:
create_timestamp: Mon Aug 9 16:01:39 2021
access_timestamp: Mon Aug 9 16:01:39 2021
modify_timestamp: Mon Aug 9 16:01:39 2021
2.1 查看image真实使用空间
比如我查看mysql的存储用了多少
先去mysql容器中df -h查看块设备名字(其实这里直接就能看到实际使用了多少空间)
kubectl get pod -o wide查看mysql运行在哪个node上
在对应的node节点上执行:rbd showmapped获取image的名字,然后使用下面命令查看image真实空间
root@k8s-master1~# rbd diff replicapool/csi-vol-00408d5e-064e-11ec-b89e-62196757365f| awk '{ SUM += $2 } END { print SUM/1024/1024 " MB" }'
662.984 MB
2.2. 根据镜像指纹可查到该image的所有object
rados -p replicapool ls | grep rbd_data.88232bc33526 # -p后面跟的是pool的名字
rbd_data.882374f98e58.0000000000000826
rbd_data.882374f98e58.0000000000001e27
rbd_data.882374f98e58.0000000000000098
rbd_data.882374f98e58.0000000000001200
rbd_data.882374f98e58.0000000000000049
rbd_data.882374f98e58.0000000000001e41
rbd_data.882374f98e58.000000000000242b
rbd_data.882374f98e58.0000000000000823
...
从上面的查询结果中可以看出,一个image对象是由上面的object组成的,他们每一个的存储位置可能都不一样。我们以最后一行的object来查询它的真实存储位置。
2.3 查看object所在的PG和OSD
root@k8s-master1:~# ceph osd map replicapool rbd_data.882374f98e58.0000000000000823
osdmap e1794 pool 'replicapool' (2) object 'rbd_data.882374f98e58.0000000000000823' -> pg 2.460f6fff (2.1f) -> up ([0,1], p0) acting ([0,1], p0)
表示这个对象位于2.1f这个pg中,并且位于osd1和osd0上(两个副本)
2.4 查看pg
ceph pg stat
ceph pg dump #查看pg组映射信息
ceph pg map 3.5d #查看pg分布在哪些OSD,3.5d是上面dump出来的一个pg的PG_STAT
ceph pg 1.2f6 query 查看PG详细信息
ceph pg dump_stuck inactive|unclean|stale #显示非正常的pg
ceph pg {pg-id} mark_unfound_lost revert #恢复一个丢失的pg, 待验证
例如
[root@abc ~]# ceph pg map 1.24
osdmap e1008 pg 1.24 (1.24) -> up [0,2,8] acting [0,2,8]
可以看到该pg的3副本分别是分布在osd.0,osd.2和osd.8上的,其中最前面的0表示主副本存在于osd.0上。
参考:https://www.cnblogs.com/luohaixian/p/9693978.html
问题排查: stale pg
pg出现stale状态,也就是pg处于僵死状态,该状态是无法处理新的请求了的,新的请求过来只会block,这种情况一般是由于所有副本pg的osd都挂了,要模拟其实也很简单,比如设置2副本,然后将2个不同故障域的osd挂掉即可出现,最好的恢复方法当然是重新拉起这两个osd,但有时可能出现这样的情况,两个osd永远也拉不起来了,然后你把这两个osd清理出去了,清理完后这些pg当然就是stale的状态,这时的恢复方法只能是丢掉这个pg里的数据了,重新创建pg:
<1>使用命令ceph pg dump |grep stale 找出所有的stale的pg,也可以ceph health detail |grep stale
<2>执行ceph pg force_create_pg $pg_id命令强制重新创建pg,这时可以看到pg会转为creating状态
<3>重启ceph集群中的所有OSD
3. 删除镜像信息
rdb rm mytest/test.img
4. 创建镜像
参考:https://www.cnblogs.com/boshen-hzb/p/6692975.html
#创建 100 MB 大小的名字为 ‘image1’ 的 RBD Image,默认情况下,它被条带化为 4MB 大小的 25 个对象
rbd create -p testPool image1 --size 100 #size的单位为MB
查看这个pool下的镜像
rbd list testPool 或者rbd ls testPool
查看这个pool下的对象
[root@rook-ceph-tools-6f44db7c58-pj7fm /]# rados -p testPool ls
rbd_directory
rbd_info
rbd_header.10e3e2d8535bfd
rbd_id.image1
从名字也能看出来,这些 object 存放的不是 image 的数据,而是 ID,header 之类的元数据信息。其中,rbd_directory 中保存了pool内所有image的 ID 和 name 信息
# rados -p testPool listomapvals rbd_directory
而 rbd_header 保存的是一个 RBD 镜像的元数据:
rados -p testPool listomapvals rbd_header.10e3e2d8535bfd
上面这两条命令的信息正是下面命令的信息来源:
# rbd -p testPool info image1
rbd image 'image1':
size 100 MiB in 25 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 10e3e2d8535bfd
block_name_prefix: rbd_data.10e3e2d8535bfd
format: 2
features: layering
op_features:
flags:
create_timestamp: Thu Oct 21 03:39:36 2021
access_timestamp: Thu Oct 21 03:39:36 2021
modify_timestamp: Thu Oct 21 03:39:36 2021
四. object相关
1. 查看池中的object
rados ls -p myest
这些 object 存放的不是 image 的数据,而是 ID,header 之类的元数据信息。其中,rbd_directory 中保存了pool内所有image的 ID 和 name 信息
2. 将文件导入pool池中(给object起名为object-1)
rados put object-1 1.txt -p test
3. 删除object
rados rm object-1
五. 释放内存
ceph tell osd.* heap release 释放可释放的内存
ceph tell osd.0 heap stats 查看状态
ceph config get osd.0 osd_memory_target
helm部署ceph
https://www.putianhui.cn/index.php/helm/182.html
ceph存储osd启动异常处理和正常启停操作
https://www.cnblogs.com/hixiaowei/p/8327724.html
ceph操作osd
https://www.jianshu.com/p/b08e66536981