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 ratiofull 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
posted @ 2020-11-02 17:01  Varden  阅读(695)  评论(0编辑  收藏  举报