Ceph集群运维命令汇总
MON
添加mon节点:
ceph-deploy mon create {host-name [host-name]...}
Note:在一主机上新增监视器时,如果它不是由 ceph-deploy new 命令所定义的,那就必须把 public network 加入 ceph.conf 配置文件。
检查法定人数状态:
ceph quorum_status -f json-pretty
删除mon节点:
ceph-deploy mon destroy {host-name [host-name]...}
Note:确保你删除一监视器后,其余监视器仍能达成一致。如果不可能,删除它之前先加一个。
MDS
OSD
查看使用空间:
ceph df
ceph osd df tree
监控 OSD
某 OSD 的状态可以是在集群内( in )或集群外( out )、也可以是活着且在运行( up )或挂了且不在运行( down )。
如果一个 OSD 活着,它也可以是 in (你可以读写数据)或者 out 集群。
如果它以前是 in 但最近 out 了, Ceph 会把其归置组迁移到其他 OSD 。
如果一 OSD out 了, CRUSH 就不会再分配归置组给它。
如果它挂了( down )其状态也应该是 out 。
Note: 如果一 OSD 状态为 down 且 in ,必定有问题,而且集群处于非健康状态。
ceph -s
ceph health
ceph -w
ceph osd stat
ceph osd tree
Tip:精心设计的 CRUSH 分级结构可以帮你更快的定位到物理位置、加快故障排除。
归置组集
CRUSH 要把归置组分配到 OSD 时,它先查询这个存储池的副本数设置,再把归置组分配到 OSD ,这样就把各副本分配到了不同 OSD 。
比如,如果存储池要求归置组有 3 个副本, CRUSH 可能把它们分别分配到 osd.1 、 osd.2 、 osd.3 。
考虑到你设置于 CRUSH 运行图中的失败域,实际上 CRUSH 找出的是伪随机位置,所以在大型集群中,你很少能看到归置组被分配到了相邻的 OSD 。
我们把涉及某个特定归置组副本的一组 OSD 称为 acting set 。在一些情况下,位于 acting set 中的一个 OSD down 了或者不能为归置组内的对象提供服务,这些情形发生时无需惊慌,常见原因如下:
- 你增加或拆除了一 OSD 。然后 CRUSH 把那个归置组分配到了其他 OSD ,因此改变了 Acting Set 的构成、并且用 backfill 进程启动了数据迁移;
- 一 OSD down 了、重启了、而现在正恢复( recovering );
- acting set 中的一个 OSD 挂了,不能提供服务,另一个 OSD 临时接替其工作。
Ceph 靠 up set 处理客户端请求,它们是最终处理请求的一系列 OSD 。
大多数情况下 up set 和 acting set 本质上相同,如果不同,说明可能 Ceph 在迁移数据、某 OSD 在恢复、或者哪里有问题。这种情况下, Ceph 通常表现为 HEALTH WARN 状态,还有 “stuck stale” 消息。
用下列命令获取归置组列表:
ceph pg dump
要根据指定归置组号查看哪些 OSD 位于 Acting Set 或 Up Set 里,执行:
ceph pg map {pg-num}
其结果会告诉你 osdmap 版本( eNNN )、归置组号( {pg-num} )、 Up Set 内的 OSD ( up[] )、和 Acting Set 内的 OSD ( acting[] )。
osdmap eNNN pg {pg-num} -> up [0,1,2] acting [0,1,2]
Note:如果 Up Set 和 Acting Set 不一致,这可能表明集群内部在重均衡或者有潜在问题。
监控归置组状态
如果你执行过 ceph health 、 ceph -s 、或 ceph -w 命令,你也许注意到了集群并非总返回 HEALTH OK 。检查完 OSD 是否在运行后,你还应该检查归置组状态。你应该明白,在归置组建立连接时集群不会返回 HEALTH OK :
- 刚刚创建了一个存储池,归置组还没互联好;
- 归置组正在恢复;
- 刚刚增加或删除了一个 OSD;
- 刚刚修改了 CRUSH 图,并且归置组正在迁移;
- 某一归置组的副本间的数据不一致;
- Ceph 正在洗刷一个归置组的副本;
- Ceph 没有足够空余容量来完成回填操作。
如果是前述原因之一导致了 Ceph 返回 HEALTH WARN ,无需紧张。
很多情况下,集群会自行恢复;有些时候你得采取些措施。
归置组监控的一件重要事情是保证集群起来并运行着,所有归置组都处于 active 状态、并且最好是 clean 状态。用下列命令查看所有归置组状态:
ceph pg stat
其结果会告诉你归置组运行图的版本号( vNNNNNN )、归置组总数 x 、有多少归置组处于某种特定状态,如 active+clean ( y )。
vNNNNNN: x pgs: y active+clean; z bytes data, aa MB used, bb GB / cc GB avail
Note:Ceph 同时报告出多种状态是正常的。
除了归置组状态之外, Ceph 也会报告数据占据的空间( aa )、剩余空间( bb )和归置组总容量。这些数字在某些情况下是很重要的:
- 快达到
near full ratio
或full ratio
时; - 由于 CRUSH 配置错误致使你的数据没能在集群内分布。
归置组唯一标识符
归置组 ID 由存储池号(不是存储池名字)、后面跟一个点( . )、然后是归置组 ID ,它是一个十六进制数字。用 ceph osd lspools 可查看存储池号及其名字,例如,默认存储池 rbd 对应的存储池号是 0 。完整的归置组 ID 格式如下:
{pool-num}.{pg-id}
典型长相:
0.1f
用下列命令获取归置组列表:
ceph pg dump
你也可以让它输出到 JSON 格式,并保存到文件:
ceph pg dump -o {filename} --format=json
要查询某个归置组,用下列命令:
ceph pg {poolnum}.{pg-id} query
Ceph 会输出成 JSON 格式。
Ceph 提供了几个选项来均衡资源竞争,如新服务请求、恢复数据对象和恢复归置组到当前状态。
- osd recovery delay start 选项允许一 OSD 在开始恢复进程前,先重启、重建互联、甚至处理一些重放请求;
- osd recovery threads 选项限制恢复进程的线程数,默认为 1 线程;
- osd recovery thread timeout 设置线程超时,因为多个 OSD 可能交替失败、重启和重建互联;
- osd recovery max active 选项限制一 OSD 最多同时接受多少请求,以防它压力过大而不能正常服务;
- osd recovery max chunk 选项限制恢复数据块尺寸,以防网络拥塞。
在回填运转期间,你可能见到以下几种状态之一:
- backfill_wait 表明一回填操作在等待时机,尚未开始;
- backfill 表明一回填操作正在进行;
- backfill_too_full 表明需要进行回填,但是因存储空间不足而不能完成。某归置组不能回填时,其状态应该是 incomplete 。
Ceph 提供了多个选项来解决重分配归置组给一 OSD (特别是新 OSD )时相关的负载问题。
- 默认, osd_max_backfills 把双向的回填并发量都设置为 10 ;
- osd backfill full \ ratio 可让一 OSD 在接近占满率(默认 85% )时拒绝回填请求,如果一 OSD 拒绝了回填请求,在 osd backfill retry interval 间隔之后将重试(默认 10 秒);
- OSD 也能用 osd backfill scan min 和 osd backfill scan max 来管理扫描间隔(默认 64 和 512 )。
找出故障归置组
如前所述,一个归置组状态不是 active+clean 时未必有问题。一般来说,归置组卡住时 Ceph 的自修复功能往往无能为力,卡住的状态细分为:
- Unclean: 归置组里有些对象的副本数未达到期望次数,它们应该在恢复中;
- Inactive: 归置组不能处理读写请求,因为它们在等着一个持有最新数据的 OSD 回到 up 状态;
- Stale: 归置组们处于一种未知状态,因为存储它们的 OSD 有一阵子没向监视器报告了(由 mon osd report timeout 配置)。
为找出卡住的归置组,执行:
ceph pg dump_stuck [unclean|inactive|stale|undersized|degraded]
定位对象
要把对象数据存入 Ceph 对象存储,一 Ceph 客户端必须:
- 设置对象名
- 指定一存储池
Ceph 客户端索取最新集群运行图、并用 CRUSH 算法计算对象到归置组的映射,然后计算如何动态地把归置组映射到 OSD 。要定位对象,只需要知道对象名和存储池名字,例如:
ceph osd map {poolname} {object-name}
练习:定位一个对象
反正是练习,我们先创建一个对象。给 rados put 命令指定一对象名、一个包含数据的测试文件路径、和一个存储池名字,例如:
rados put {object-name} {file-path} --pool=data
rados put test-object-1 testfile.txt --pool=data
用下列命令确认 Ceph 对象存储已经包含此对象:
rados -p data ls
现在可以定位对象了:
ceph osd map {pool-name} {object-name}
ceph osd map data test-object-1
Ceph 应该输出对象的位置,例如:
osdmap e537 pool 'data' (0) object 'test-object-1' -> pg 0.d1743484 (0.4) -> up [1,0] acting [1,0]
要删除测试对象,用 rados rm 即可,如:
rados rm test-object-1 --pool=data
随着集群的运转,对象位置会动态改变。 Ceph 动态重均衡的优点之一,就是把你从人工迁移中解救了,详情见体系结构。
查看存储池统计信息
要查看某存储池的使用统计信息,执行命令:
rados df