注意

本文档适用于 Ceph 开发版本。

监控集群

在你拥有一个运行中的集群后,你可以使用ceph工具来监控你的

使用命令行

交互模式

要以交互模式运行ceph工具,在命令行中输入ceph并不带任何参数。例如:

ceph
health
status
quorum_status
mon stat

非默认路径

如果你安装集群时为你的配置或密钥环指定了非默认位置,你可以通过运行以下命令来指定它们的位置:ceph工具

ceph -c /path/to/conf -k /path/to/keyring health

检查集群状态

在你启动集群后,以及在开始读写数据之前,你应该检查你的集群状态。

要检查集群状态,运行以下命令:

ceph status

或者,你可以运行以下命令:

ceph -s

在交互模式下,此操作是通过输入status并按下Enter:

status

Ceph 将打印集群状态。例如,一个运行每个服务(Monitor、Manager 和 OSD)一个实例的微型 Ceph “演示集群”可能会打印以下内容:

cluster:
  id:     477e46f1-ae41-4e43-9c8f-72c918ab0a20
  health: HEALTH_OK

services:
  mon: 3 daemons, quorum a,b,c
  mgr: x(active)
  mds: cephfs_a-1/1/1 up  {0=a=up:active}, 2 up:standby
  osd: 3 osds: 3 up, 3 in

data:
  pools:   2 pools, 16 pgs
  objects: 21 objects, 2.19K
  usage:   546 GB used, 384 GB / 931 GB avail
  pgs:     16 active+clean

Ceph 如何计算数据使用

The usage值反映了实际原始存储使用的量。值表示集群整体存储容量中可用的量(较小的数字)。概念数字反映存储数据在复制、克隆或快照之前的大小。因此,实际存储的数据量通常超过存储的概念量,因为 Ceph 创建数据的副本,并且还可能使用存储容量进行克隆和快照。xxx GB / xxx GB value means the amount available (the lesser number) of the overall storage capacity of the cluster. The notional number reflects the size of the stored data before it is replicated, cloned or snapshotted. Therefore, the amount of data actually stored typically exceeds the notional amount stored, because Ceph creates replicas of the data and may also use storage capacity for cloning and snapshotting.

监控集群

Ceph 集群中的每个守护进程都维护一个事件日志,而 Ceph 集群本身维护一个集群日志,记录有关整个 Ceph 集群的高级事件。这些事件记录到 Monitor 服务器的磁盘上(在默认位置/var/log/ceph/ceph.log),并且可以通过命令行进行监控。

要跟踪集群日志,运行以下命令:

ceph -w

Ceph 将打印系统状态,然后随着每次添加打印每个日志消息。例如:

cluster:
  id:     477e46f1-ae41-4e43-9c8f-72c918ab0a20
  health: HEALTH_OK

services:
  mon: 3 daemons, quorum a,b,c
  mgr: x(active)
  mds: cephfs_a-1/1/1 up  {0=a=up:active}, 2 up:standby
  osd: 3 osds: 3 up, 3 in

data:
  pools:   2 pools, 16 pgs
  objects: 21 objects, 2.19K
  usage:   546 GB used, 384 GB / 931 GB avail
  pgs:     16 active+clean


2017-07-24 08:15:11.329298 mon.a mon.0 172.21.9.34:6789/0 23 : cluster [INF] osd.0 172.21.9.34:6806/20527 boot
2017-07-24 08:15:14.258143 mon.a mon.0 172.21.9.34:6789/0 39 : cluster [INF] Activating manager daemon x
2017-07-24 08:15:15.446025 mon.a mon.0 172.21.9.34:6789/0 47 : cluster [INF] Manager daemon x is now available

与添加日志行不同,你可能只想打印最新的几行。运行ceph log last [n]以查看集群日志的最新n行。

监控健康检查

Ceph 不断运行各种健康检查。当健康检查失败时,此故障反映在ceph statusceph health的输出中。集群日志接收指示检查何时失败以及集群何时恢复的消息。

例如,当 OSD 停机时,状态输出中的health部分将更新如下:

health: HEALTH_WARN
        1 osds down
        Degraded data redundancy: 21/63 objects degraded (33.333%), 16 pgs unclean, 16 pgs degraded

同时,集群日志消息会发出以记录健康检查的失败:

2017-07-25 10:08:58.265945 mon.a mon.0 172.21.9.34:6789/0 91 : cluster [WRN] Health check failed: 1 osds down (OSD_DOWN)
2017-07-25 10:09:01.302624 mon.a mon.0 172.21.9.34:6789/0 94 : cluster [WRN] Health check failed: Degraded data redundancy: 21/63 objects degraded (33.333%), 16 pgs unclean, 16 pgs degraded (PG_DEGRADED)

当 OSD 恢复在线时,集群日志记录集群恢复到健康状态:

2017-07-25 10:11:11.526841 mon.a mon.0 172.21.9.34:6789/0 109 : cluster [WRN] Health check update: Degraded data redundancy: 2 pgs unclean, 2 pgs degraded, 2 pgs undersized (PG_DEGRADED)
2017-07-25 10:11:13.535493 mon.a mon.0 172.21.9.34:6789/0 110 : cluster [INF] Health check cleared: PG_DEGRADED (was: Degraded data redundancy: 2 pgs unclean, 2 pgs degraded, 2 pgs undersized)
2017-07-25 10:11:13.535577 mon.a mon.0 172.21.9.34:6789/0 111 : cluster [INF] Cluster is now healthy

网络性能检查

Ceph OSD 向彼此发送心跳 ping 消息,以监控守护进程可用性和网络性能。如果检测到单个延迟响应,这可能只是表示 OSD 正忙。但如果检测到不同 OSD 对之间的多个延迟,这可能表示网络交换机故障、网卡故障或第 1 层故障。

默认情况下,超过 1 秒(1000 毫秒)的心跳时间会触发健康检查(一个HEALTH_WARN从仓库中删除它。例如:

HEALTH_WARN Slow OSD heartbeats on back (longest 1118.001ms)

ceph health detail命令,你可以看到哪些 OSD 正在经历延迟以及延迟有多长。的输出ceph health detail限制为十行。以下是你期望从ceph health detail command:

[WRN] OSD_SLOW_PING_TIME_BACK: Slow OSD heartbeats on back (longest 1118.001ms)
    Slow OSD heartbeats on back from osd.0 [dc1,rack1] to osd.1 [dc1,rack1] 1118.001 msec possibly improving
    Slow OSD heartbeats on back from osd.0 [dc1,rack1] to osd.2 [dc1,rack2] 1030.123 msec
    Slow OSD heartbeats on back from osd.2 [dc1,rack2] to osd.1 [dc1,rack1] 1015.321 msec
    Slow OSD heartbeats on back from osd.1 [dc1,rack1] to osd.0 [dc1,rack1] 1010.456 msec

输出的示例:dump_osd_network命令。此命令通常发送到 Ceph 管理守护进程,但可以通过将其发送到该 OSD 来收集有关特定 OSD 交互的信息。慢心跳的默认阈值是 1 秒(1000 毫秒),但可以通过提供以毫秒为单位的参数来覆盖此值。

要显示所有网络性能数据,并指定阈值为 0,将以下命令发送到 mgr:

ceph daemon /var/run/ceph/ceph-mgr.x.asok dump_osd_network 0
{
    "threshold": 0,
    "entries": [
        {
            "last update": "Wed Sep  4 17:04:49 2019",
            "stale": false,
            "from osd": 2,
            "to osd": 0,
            "interface": "front",
            "average": {
                "1min": 1.023,
                "5min": 0.860,
                "15min": 0.883
            },
            "min": {
                "1min": 0.818,
                "5min": 0.607,
                "15min": 0.607
            },
            "max": {
                "1min": 1.164,
                "5min": 1.173,
                "15min": 1.544
            },
            "last": 0.924
        },
        {
            "last update": "Wed Sep  4 17:04:49 2019",
            "stale": false,
            "from osd": 2,
            "to osd": 0,
            "interface": "back",
            "average": {
                "1min": 0.968,
                "5min": 0.897,
                "15min": 0.830
            },
            "min": {
                "1min": 0.860,
                "5min": 0.563,
                "15min": 0.502
            },
            "max": {
                "1min": 1.171,
                "5min": 1.216,
                "15min": 1.456
            },
            "last": 0.845
        },
        {
            "last update": "Wed Sep  4 17:04:48 2019",
            "stale": false,
            "from osd": 0,
            "to osd": 1,
            "interface": "front",
            "average": {
                "1min": 0.965,
                "5min": 0.811,
                "15min": 0.850
            },
            "min": {
                "1min": 0.650,
                "5min": 0.488,
                "15min": 0.466
            },
            "max": {
                "1min": 1.252,
                "5min": 1.252,
                "15min": 1.362
            },
        "last": 0.791
    },
    ...

健康检查可以静音,以便它们不会影响集群的整体报告状态。例如,如果集群触发了一个健康检查,然后你静音了该健康检查,那么集群将报告状态为

Health checks can be muted so that they have no effect on the overall reported status of the cluster. For example, if the cluster has raised a single health check and then you mute that health check, then the cluster will report a status of HEALTH_OK。要静音特定的健康检查,请使用对应于该健康检查的健康检查代码(见健康检查),并运行以下命令:

ceph health mute <code>

例如,要静音一个OSD_DOWN健康检查,运行以下命令:

ceph health mute OSD_DOWN

静音作为ceph health命令输出的短形式和长形式的一部分报告。例如,在上述情况下,集群将报告:

ceph health
HEALTH_OK (muted: OSD_DOWN)
ceph health detail
HEALTH_OK (muted: OSD_DOWN)
(MUTED) OSD_DOWN 1 osds down
    osd.1 is down

通过运行以下命令可以移除静音:

ceph health unmute <code>

例如:

ceph health unmute OSD_DOWN

一个“健康静音”可以有一个 TTLT(生存时间)To L关联:这意味着静音将在指定的时间后自动过期。TTL 作为可选的持续时间参数指定,如下面的示例所示:

ceph health mute OSD_DOWN 4h    # mute for 4 hours
ceph health mute MON_DOWN 15m   # mute for 15 minutes

通常,如果被静音的健康检查得到解决(例如,如果在上面的示例中触发健康检查的 OSD 恢复了),则静音将消失。如果健康检查稍后再次触发,它将按常规方式报告。OSD_DOWN health check in the example above has come back up), the mute goes away. If the health check comes back later, it will be reported in the usual way.

可以使健康静音“粘性”:这意味着即使健康检查清除,静音也会保持。例如,要使健康静音“粘性”,你可以运行以下命令:

ceph health mute OSD_DOWN 1h --sticky   # ignore any/all down OSDs for next hour

大多数健康静音如果触发健康检查的不健康状况恶化,则会消失。例如,假设有一个 OSD 停机,健康检查被静音。在这种情况下,如果一个或多个额外的 OSD 停机,则健康静音将消失。此行为发生在任何具有阈值值的健康检查中。

检查集群使用统计

要检查集群的数据使用情况以及数据在池中的分布,请使用df命令。此选项类似于 Linux 的df命令。运行以下命令:

ceph df

的输出ceph df类似于以下内容:

CLASS     SIZE    AVAIL     USED  RAW USED  %RAW USED
ssd    202 GiB  200 GiB  2.0 GiB   2.0 GiB       1.00
TOTAL  202 GiB  200 GiB  2.0 GiB   2.0 GiB       1.00

--- POOLS ---
POOL                   ID  PGS   STORED   (DATA)   (OMAP)   OBJECTS     USED  (DATA)   (OMAP)   %USED  MAX AVAIL  QUOTA OBJECTS  QUOTA BYTES  DIRTY  USED COMPR  UNDER COMPR
device_health_metrics   1    1  242 KiB   15 KiB  227 KiB         4  251 KiB  24 KiB  227 KiB       0    297 GiB            N/A          N/A      4         0 B          0 B
cephfs.a.meta           2   32  6.8 KiB  6.8 KiB      0 B        22   96 KiB  96 KiB      0 B       0    297 GiB            N/A          N/A     22         0 B          0 B
cephfs.a.data           3   32      0 B      0 B      0 B         0      0 B     0 B      0 B       0     99 GiB            N/A          N/A      0         0 B          0 B
test                    4   32   22 MiB   22 MiB   50 KiB       248   19 MiB  19 MiB   50 KiB       0    297 GiB            N/A          N/A    248         0 B          0 B
  • CLASS:例如,“ssd”或“hdd”。

  • SIZE:集群管理的存储容量量。

  • AVAIL:集群中可用的空闲空间量。

  • USED:用户数据(不包括 BlueStore 的数据库)消耗的原始存储量。

  • RAW USED:用户数据、内部开销和保留容量消耗的原始存储量。

  • %RAW USED:原始存储使用的百分比。与full rationear full ratio结合观察此数字,以在集群接近满负荷阈值时提前预警。见存储容量.

POOLS:

输出的 POOLS 部分提供了池的列表以及每个池的概念使用情况。输出部分的notional usage of each pool. This section of the output 不反映副本、克隆或快照。例如,如果你存储一个 1MB 的数据对象,则概念使用量为 1MB,但实际使用量可能为 2MB 或更多,具体取决于副本、克隆和快照的数量。 reflect replicas, clones, or snapshots. For example, if you store an object with 1MB of data, then the notional usage will be 1MB, but the actual usage might be 2MB or more depending on the number of replicas, clones, and snapshots.

  • ID:池内特定节点的编号。

  • STORED:用户在一个池中实际存储的数据量。这与早期版本 Ceph 中的 USED 列类似,但计算(对于 BlueStore!)更加精确(因为间隙得到正确处理)。

    • (DATA):RBD(RADOS Block Device)、CephFS 文件数据和 RGW

    • (OMAP):键值对。主要由 CephFS 和 RGW (RADOS Gateway) 用于元数据存储。

  • OBJECTS:每个池存储的概念对象数(即除了副本、克隆或快照之外的对象数量)。

  • USED:在所有 OSD 上为池分配的空间。这包括复制空间、分配粒度空间以及与纠删码相关的开销空间。还包括压缩节省和对象内容间隙。但是,BlueStore 的数据库不包括在使用量报告的量中。

    • (DATA):RBD(RADOS Block Device)、CephFS 文件数据和 RGW

    • (OMAP):对象键值对。主要由 CephFS 和 RGW (RADOS Gateway) 用于元数据存储。

  • %USED:每个池使用的概念百分比存储。

  • MAX AVAIL:可以写入此池的概念数据的估计量。

  • QUOTA OBJECTS:配额对象的数量。

  • QUOTA BYTES:配额对象中的字节数。

  • DIRTY:已写入缓存池但尚未刷新到基础池的缓存池中的对象数量。当使用缓存分层时,此字段才可用。

  • USED COMPR:为压缩数据分配的空间量。这包括压缩数据以及所有用于复制、分配粒度和纠删码开销的空间。

  • UNDER COMPR:通过压缩(在所有副本上求和)并值得以压缩形式存储的数据量。

Note

POOLS 部分的数字是概念性的。它们不包括副本、克隆或快照的数量。因此,输出中 POOLS 部分的 USED 和 %USED 总和将不等于输出中 RAW 部分的 USED 和 %USED 总和。

Note

MAX AVAIL 值是一个复杂的函数,取决于复制或使用的纠删码类型、将存储映射到设备的 CRUSH 规则、这些设备的利用率以及配置mon_osd_full_ratio设置进行指数衰减。

检查 OSD 状态

要检查 OSD 是否upin, run the following command:

ceph osd stat

或者,你可以运行以下命令:

ceph osd dump

要根据 CRUSH 映射中的位置查看 OSD,请运行以下命令:

ceph osd tree

要打印显示主机、其 OSD、OSD 是否up以及 OSD 的权重,请运行以下命令:

#ID CLASS WEIGHT  TYPE NAME             STATUS REWEIGHT PRI-AFF
 -1       3.00000 pool default
 -3       3.00000 rack mainrack
 -2       3.00000 host osd-host
  0   ssd 1.00000         osd.0             up  1.00000 1.00000
  1   ssd 1.00000         osd.1             up  1.00000 1.00000
  2   ssd 1.00000         osd.2             up  1.00000 1.00000

请参阅监控 OSD 和 Placement Group.

检查 Monitor 状态

如果你的集群有多个 Monitor,那么你需要执行某些“Monitor 状态”检查。在启动集群后以及读写数据之前,你应该检查仲裁状态。当运行多个 Monitor 时必须存在仲裁,以确保你的 Ceph 集群正常运行。定期检查 Monitor 状态,以确保所有 Monitor 都在运行。

要显示 Monitor 映射,请运行以下命令:

ceph mon stat

或者,你可以运行以下命令:

ceph mon dump

要检查 Monitor 集群的仲裁状态,请运行以下命令:

ceph quorum_status

Ceph 返回仲裁状态。例如,一个由三个 Monitor 组成的 Ceph 集群可能会返回以下内容:

{ "election_epoch": 10,
  "quorum": [
        0,
        1,
        2],
  "quorum_names": [
    "a",
    "b",
    "c"],
  "quorum_leader_name": "a",
  "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",
      "features": {"persistent": [
            "kraken",
            "luminous",
            "mimic"],
    "optional": []
      },
      "mons": [
            { "rank": 0,
              "name": "a",
              "addr": "127.0.0.1:6789/0",
          "public_addr": "127.0.0.1:6789/0"},
            { "rank": 1,
              "name": "b",
              "addr": "127.0.0.1:6790/0",
          "public_addr": "127.0.0.1:6790/0"},
            { "rank": 2,
              "name": "c",
              "addr": "127.0.0.1:6791/0",
          "public_addr": "127.0.0.1:6791/0"}
           ]
  }
}

检查 MDS 状态

元数据服务器为 CephFS 提供元数据服务。元数据服务器有两个状态集:up | downactive | inactive。要检查你的元数据服务器是否upactive生成 SSH 密钥,运行以下命令:

ceph mds stat

要显示元数据服务器的详细信息,请运行以下命令:

ceph fs dump

检查 Placement Group 状态

Placement Group (PG) 将对象映射到 OSD。PG 被监控以确保它们是activeclean。见监控 OSD 和.

使用管理员套接字

Ceph 管理员套接字允许你通过套接字接口查询守护进程。默认情况下,Ceph 套接字位于/var/run/ceph下。要通过管理员套接字访问守护进程,请登录到运行守护进程的主机并运行以下两个命令之一:

ceph daemon {daemon-name}
ceph daemon {path-to-socket-file}

例如,以下命令彼此等效:

ceph daemon osd.0 foo
ceph daemon /var/run/ceph/ceph-osd.0.asok foo

运行管理员套接字命令有两种方法:(1)使用ceph daemon如上所述,这绕过 Monitor 并假设直接登录到守护进程的主机,以及(2)使用ceph tell {daemon-type}.{id}命令,该命令由 Monitor 中继,并且不需要访问守护进程的主机。

使用raise命令向守护进程发送信号,就像运行kill -X {daemon.pid}。通过ceph tell运行它允许在不访问其主机的情况下向守护进程发送信号:

ceph daemon {daemon-name} raise HUP
ceph tell {daemon-type}.{id} raise -9

要查看可用的管理员套接字命令,请运行以下命令:

ceph daemon {daemon-name} help

管理员套接字命令允许你在运行时查看和设置你的配置。有关查看配置的更多信息,请参阅在运行时查看配置.

Messenger 状态

Ceph 守护进程和 librados 客户端支持一个管理员套接字命令messenger dump,该命令显示有关连接、套接字、绑定地址和内核 TCP 统计信息(通过 tcp(7) TCP_INFO)的运行时信息快照。

Note

被查询的 Messenger 需要在创建快照时锁定连接数据结构。此锁的持续时间以毫秒计。这可能会干扰正常操作。使用dumpcontents参数来限制转储的数据结构。

示例

如果未指定要转储的 Messenger,则返回可用 Messenger 的列表:

ceph tell osd.0 messenger dump
{
   "messengers": [
       "client",
       "cluster",
       "hb_back_client",
       "hb_back_server",
       "hb_front_client",
       "hb_front_server",
       "ms_objecter",
       "temp_mon_client"
   ]
 }

The clientclustermessengers 对应于配置的客户端 / 集群网络(见网络配置参考)。带有hb_前缀的 messengers 是心跳系统的一部分。

列出客户端 Messenger 上的所有当前连接:

ceph tell osd.0 messenger dump client \
   | jq -r '.messenger.connections[].async_connection |
               [.conn_id, .socket_fd, .worker_id,
                if .status.connected then "connected" else "disconnected" end,
                .state,
                "\(.peer.type).\(.peer.entity_name.id).\(.peer.id)",
                .protocol.v2.con_mode, .protocol.v2.crypto.rx, .protocol.v2.compression.rx] |
               @tsv'
249     102     0       connected       STATE_CONNECTION_ESTABLISHED    client.admin.6407       crc    PLAIN   UNCOMPRESSED
242     99      1       connected       STATE_CONNECTION_ESTABLISHED    client.rgw.8000.4473    crc     PLAIN   UNCOMPRESSED
248     89      1       connected       STATE_CONNECTION_ESTABLISHED    mgr..-1 secure  AES-128-GCM     UNCOMPRESSED
32      101     2       connected       STATE_CONNECTION_ESTABLISHED    client.rgw.8000.4483    crc     PLAIN   UNCOMPRESSED
3       86      2       connected       STATE_CONNECTION_ESTABLISHED    mon..-1 secure  AES-128-GCM     UNCOMPRESSED
244     102     0       connected       STATE_CONNECTION_ESTABLISHED    client.admin.6383       crc     PLAIN   UNCOMPRESSED

打印活动连接及其 TCP 循环往返时间和重传计数器:

ceph tell osd.0 messenger dump client --tcp-info \
   | jq -r '.messenger.connections[].async_connection |
               select(.status.connected) |
               select(.peer.type != "client") |
               [.conn_id, .socket_fd, .worker_id,
                "\(.peer.type).\(.peer.global_id)",
                .tcp_info.tcpi_rtt_us, .tcp_info.tcpi_rttvar_us, .tcp_info.tcpi_total_retrans] |
                @tsv'
248     89      1       mgr.0   863     1677    0
3       86      2       mon.0   230     278     0

跟踪集群数据可用性分数

Ceph 内部跟踪集群中每个池的数据可用性。要检查集群中每个池的数据可用性分数,可以调用以下命令:

ceph osd pool availability-status

示例输出:

POOL         UPTIME  DOWNTIME  NUMFAILURES  MTBF  MTTR  SCORE        AVAILABLE
rbd             2m     21s           1            2m   21s  0.888889         1
.mgr                 86s     0s              0            0s   0s            1       1
cephfs.a.meta        77s     0s              0            0s   0s            1       1
cephfs.a.data        76s     0s              0            0s   0s            1       1

当池中的至少一个 PG 变为不活动或池中至少有一个未找到的对象时,池被认为unavailable。否则,池被认为available。根据池的当前和先前状态,我们更新uptimedowntime值:

先前状态

当前状态

运行时间更新

停机时间更新

可用

可用

+diff 时间

无更新

可用

不可用

+diff 时间

无更新

不可用

可用

+diff 时间

无更新

不可用

不可用

无更新

+diff 时间

从更新的uptimedowntime值,我们计算每个池的平均故障间隔时间 (MTBF) 和平均恢复时间 (MTTR)。然后通过找到 MTBF 与总时间的比率来计算可用性分数。

分数每五秒更新一次。此间隔目前不可配置。在此期间内发生的集群池的任何间歇性变化,但在我们重新检查池状态之前被重置,将不会被此功能捕获。

由 Ceph 基金会带给您

Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.