目录

Ceph常用命令

Whether you want to provide Ceph Object Storage and/or Ceph Block Device services to Cloud Platforms, deploy a Ceph Filesystem or use Ceph for another purpose, all Ceph Storage Cluster deployments begin with setting up each Ceph Node, your network, and the Ceph Storage Cluster. A Ceph Storage Cluster requires at least one Ceph Monitor, Ceph Manager, and Ceph OSD (Object Storage Daemon). The Ceph Metadata Server is also required when running Ceph Filesystem clients.

https://blog-image.nos-eastchina1.126.net/7jFFdagBFi.png

  • Monitors : A Ceph Monitor (ceph-mon) maintains maps of the cluster state, including the monitor map, manager map, the OSD map, and the CRUSH map. These maps are critical cluster state required for Ceph daemons to coordinate with each other. Monitors are also responsible for managing authentication between daemons and clients. At least three monitors are normally required for redundancy and high availability.
  • Managers : A Ceph Manager daemon (ceph-mgr) is responsible for keeping track of runtime metrics and the current state of the Ceph cluster, including storage utilization, current performance metrics, and system load. The Ceph Manager daemons also host python-based plugins to manage and expose Ceph cluster information, including a web-based dashboard and REST API. At least two managers are normally required for high availability.
  • Ceph OSDs : A Ceph OSD (object storage daemon, ceph-osd) stores data, handles data replication, recovery, rebalancing, and provides some monitoring information to Ceph Monitors and Managers by checking other Ceph OSD Daemons for a heartbeat. At least 3 Ceph OSDs are normally required for redundancy and high availability.
  • MDSs : A Ceph Metadata Server (MDS, ceph-mds) stores metadata on behalf of the Ceph Filesystem (i.e., Ceph Block Devices and Ceph Object Storage do not use MDS). Ceph Metadata Servers allow POSIX file system users to execute basic commands (like ls, find, etc.) without placing an enormous burden on the Ceph Storage Cluster.

Ceph stores data as objects within logical storage pools. Using the CRUSH algorithm, Ceph calculates which placement group should contain the object, and further calculates which Ceph OSD Daemon should store the placement group. The CRUSH algorithm enables the Ceph Storage Cluster to scale, rebalance, and recover dynamically.

1 监视器命令

监视器命令用 ceph 工具发出:

1
ceph [-m monhost] {command}

命令格式通常是(但不总是):

1
ceph {subsystem} {command}

2 系统命令

下列命令显示集群状态:

1
2
ceph -s
ceph status

下列命令显示集群状态的运行摘要、及主要事件:

1
ceph -w

下列命令显示监视器法定人数状态,包括哪些监视器参与着、哪个是首领。

1
ceph quorum_status

下列命令查询单个监视器状态,包括是否在法定人数里。

1
ceph [-m monhost] mon_status

3 认证子系统

要添加一个 OSD 的密钥环,执行下列命令:

1
ceph auth add {osd} {--in-file|-i} {path-to-osd-keyring}

要列出集群的密钥及其能力,执行下列命令:

1
ceph auth list

4 归置组子系统

要显示所有归置组的统计信息,执行下列命令:

1
ceph pg dump [--format {format}]

可用输出格式有 plain (默认)和 json

要显示卡在某状态的所有归置组,执行下列命令:

1
ceph pg dump_stuck inactive|unclean|stale|undersized|degraded [--format {format}] [-t|--threshold {seconds}]

--format 可以是 plain (默认)或 json

--threshold 定义了多久算“卡住了”(默认 300 秒)

Inactive 归置组不能处理读或写,因为它们在等待数据及时更新的 OSD 回来。

Unclean 归置组包含副本数未达期望值的对象,它们应该在恢复中。

Stale 归置组处于未知状态——归置组所托付的 OSD 有一阵没向监视器报告了(由 mon osd report timeout 配置)。

删除“丢失”对象,或者恢复到其先前状态,可以是前一版本、或如果刚创建就干脆删除。

1
ceph pg {pgid} mark_unfound_lost revert|delete

5 OSD 子系统

查询 OSD 子系统状态:

1
ceph osd stat

把最新的 OSD 运行图拷贝到一个文件,参见 osdmaptool

1
ceph osd getmap -o file

从最新 OSD 运行图拷出 CRUSH 图:

1
ceph osd getcrushmap -o file

前述功能等价于:

1
2
ceph osd getmap -o /tmp/osdmap
osdmaptool /tmp/osdmap --export-crush file

转储 OSD 运行图, -f 的可用格式有 plainjson ,如未指定 --format 则转储为纯文本。

1
ceph osd dump [--format {format}]

把 OSD 运行图转储为树,每个 OSD 一行、包含权重和状态。

1
ceph osd tree [--format {format}]

找出某对象在哪里或应该在哪里:

1
ceph osd map <pool-name> <object-name>

增加或挪动一个新 OSD 条目,要给出 id/name/weight 和位置参数。

1
ceph osd crush set {id} {weight} [{loc1} [{loc2} ...]]

从现有 CRUSH 图删除存在的条目( OSD ):

1
ceph osd crush remove {name}

从现有 CRUSH 图删除存在的空桶:

1
ceph osd crush remove {bucket-name}

把有效的桶从分级结构里的一个位置挪到另一个。

1
ceph osd crush move {id} {loc1} [{loc2} ...]

设置 {name} 所指条目的权重为 {weight}

1
ceph osd crush reweight {name} {weight}

创建集群快照。

1
ceph osd cluster_snap {name}

把 OSD 标记为丢失,有可能导致永久性数据丢失,慎用!

1
ceph osd lost {id} [--yes-i-really-mean-it]

创建新 OSD 。如果未指定 ID ,有可能的话将自动分配个新 ID 。

1
ceph osd create [{uuid}]

删除指定 OSD 。

1
ceph osd rm [{id}...]

查询 OSD 运行图里的 max_osd 参数。

1
ceph osd getmaxosd

导入指定 CRUSH 图。

1
ceph osd setcrushmap -i file

设置 OSD 运行图的 max_osd 参数,扩展存储集群时有必要。

1
ceph osd setmaxosd

把 ID 为 {osd-num} 的 OSD 标记为 down 。

1
ceph osd down {osd-num}

把 OSD {osd-num} 标记为数据分布之外(即不给分配数据)。

1
ceph osd out {osd-num}

把 OSD {osd-num} 标记为数据分布之内(即分配了数据)。

1
ceph osd in {osd-num}

列出 Ceph 集群载入的类。

1
ceph class list

设置或清空 OSD 运行图里的暂停标记。若设置了,不会有 IO 请求发送到任何 OSD ;用 unpause 清空此标记会导致重发未决的请求。

1
2
ceph osd pause
ceph osd unpause

{osd-num} 的权重设置为 {weight} ,权重相同的两个 OSD 大致会收到相同的 I/O 请求、并存储相同数量的数据。 ceph osd reweight 命令可给 OSD 设置一个增益权重,有效值在 0 和 1 之间,它使得 CRUSH 重新归置一定数量的、本应该放到此处的数据。它不会影响 crush 图里所分配的权重,在 CRUSH 分布算法没能理想地执行时,它可作为一种纠正手段。比如,假设你的某个 OSD 使用率达到了 90% ,但其它的大致都在 50% ,这时你就可以试着下调此权重来补偿它。

1
ceph osd reweight {osd-num} {weight}

重设所有滥用 OSD 的权重,它默认会下调达到平均利用率 120% 的那些OSD ,除非你指定了阀值。

1
ceph osd reweight-by-utilization [threshold]

增加、删除黑名单里的地址。增加地址的时候可以指定有效期,否则有效期为 1 小时。黑名单里的地址不允许连接任何 OSD ,此技术常用于防止滞后的元数据服务器“错爱” OSD 上的数据。

这些命令大多只在故障测试时有用,因为黑名单是自动维护的,无需手动干涉。

1
2
ceph osd blacklist add ADDRESS[:source_port] [TIME]
ceph osd blacklist rm ADDRESS[:source_port]

创建/删除存储池快照。

1
2
ceph osd pool mksnap {pool-name} {snap-name}
ceph osd pool rmsnap {pool-name} {snap-name}

创建/删除/重命名存储池。

1
2
3
ceph osd pool create {pool-name} pg_num [pgp_num]
ceph osd pool delete {pool-name} [{pool-name} --yes-i-really-really-mean-it]
ceph osd pool rename {old-name} {new-name}

更改存储池设置。

1
ceph osd pool set {pool-name} {field} {value}

可用的 field 值有:

  • size: 设置存储池内数据的副本数;
  • crash_replay_interval: 允许客户端重放确认而未提交的请求前等待的时间,秒;
  • pg_num: 归置组数量;
  • pgp_num: 计算归置组存放的有效数量;
  • crush_ruleset: 用于归置映射的规则号。

获取存储池配置值。

1
ceph osd pool get {pool-name} {field}

可用的 field 值有:

  • pg_num: 归置组数量;
  • pgp_num: 计算归置组存放的有效数量;
  • lpg_num: 本地归置组数量;
  • lpgp_num: 用于存放本地归置组的数量。

向 OSD {osd-num} 下达一个洗刷命令,用通配符 * 把命令下达到所有 OSD 。

1
ceph osd scrub {osd-num}

向 osdN 下达修复命令,用 * 下达到所有 OSD 。

1
ceph osd repair N

在 osdN 上进行个简单的吞吐量测试,每次写入 BYTES_PER_WRITE 、一共写入 TOTAL_BYTES 。默认以 4MB 增量写入 1GB 。 此压力测试是非破坏性的,不会覆盖已有 OSD 数据,但可能会暂时影响同时访问此 OSD 的客户端性能。

1
ceph tell osd.N bench [NUMER_OF_OBJECTS] [BYTES_PER_WRITE]

6 MDS 子系统

更改在运行 mds 的参数:

1
ceph tell mds.{mds-id} injectargs --{switch} {value} [--{switch} {value}]

例如:

1
ceph tell mds.0 injectargs --debug_ms 1 --debug_mds 10

打开了调试消息。

1
ceph mds stat

显示所有元数据服务器状态。

1
ceph mds fail 0

把活跃 MDS 标记为失败,如果有候补此命令会触发故障转移。

Todo

ceph mds 子命令缺少文档:set, dump, getmap, stop, setmap

7 监视器子系统

查看监视器状态:

1
2
3
4
ceph mon stat

2011-12-14 10:40:59.044395 mon {- [mon,stat]
2011-12-14 10:40:59.057111 mon.1 -} 'e3: 5 mons at {a=10.1.2.3:6789/0,b=10.1.2.4:6789/0,c=10.1.2.5:6789/0,d=10.1.2.6:6789/0,e=10.1.2.7:6789/0}, election epoch 16, quorum 0,1,2,3' (0)

末尾的 quorum 列表列出了当前法定人数里的监视器节点。

也可以更直接地获取:

1
2
3
4
$ ./ceph quorum_status

2011-12-14 10:44:20.417705 mon {- [quorum_status]
2011-12-14 10:44:20.431890 mon.0 -}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
'{ "election_epoch": 10,
  "quorum": [
        0,
        1,
        2],
  "monmap": { "epoch": 1,
      "fsid": "444b489c-4f16-4b75-83f0-cb8097468898",
      "modified": "2011-12-12 13:28:27.505520",
      "created": "2011-12-12 13:28:27.505520",
      "mons": [
            { "rank": 0,
              "name": "a",
              "addr": "127.0.0.1:6789\/0"},
            { "rank": 1,
              "name": "b",
              "addr": "127.0.0.1:6790\/0"},
            { "rank": 2,
              "name": "c",
              "addr": "127.0.0.1:6791\/0"}]}}' (0)

如果法定人数未形成,上述命令会一直等待。

你刚刚连接的监视器的状态(用 -m HOST:PORT 另外指定):

1
2
3
4
5
ceph mon_status


2011-12-14 10:45:30.644414 mon {- [mon_status]
2011-12-14 10:45:30.644632 mon.0 -}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
'{ "name": "a",
  "rank": 0,
  "state": "leader",
  "election_epoch": 10,
  "quorum": [
        0,
        1,
        2],
  "outside_quorum": [],
  "monmap": { "epoch": 1,
      "fsid": "444b489c-4f16-4b75-83f0-cb8097468898",
      "modified": "2011-12-12 13:28:27.505520",
      "created": "2011-12-12 13:28:27.505520",
      "mons": [
            { "rank": 0,
              "name": "a",
              "addr": "127.0.0.1:6789\/0"},
            { "rank": 1,
              "name": "b",
              "addr": "127.0.0.1:6790\/0"},
            { "rank": 2,
              "name": "c",
              "addr": "127.0.0.1:6791\/0"}]}}' (0)

监视器状态转储:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
ceph mon dump

2011-12-14 10:43:08.015333 mon {- [mon,dump]
2011-12-14 10:43:08.015567 mon.0 -} 'dumped monmap epoch 1' (0)
epoch 1
fsid 444b489c-4f16-4b75-83f0-cb8097468898
last_changed 2011-12-12 13:28:27.505520
created 2011-12-12 13:28:27.505520
0: 127.0.0.1:6789/0 mon.a
1: 127.0.0.1:6790/0 mon.b
2: 127.0.0.1:6791/0 mon.c

参考