集群运维

查看集群状态

Ceph 提供了完善的 Web UI 来查看和操作集群中的各项服务。首先,使用管理员的用户名和密码登录 Ceph Web UI。

dashboard1

点击左侧导航栏的 Dashboard,查看集群状态总览。

dashboard2

点击左侧导航栏的 Cluster > OSDs,查看各个磁盘的使用情况。

dashboard3

点击左侧导航栏的 Cluster > OSDs,然后点击上侧的 Overall Performance,查看磁盘使用情况的可视化统计数据。

dashboard4

点击左侧导航栏的 Cluster > Logs,查看集群日志。

dashboard5

另外,您也可以通过 SSH 登录 Ceph 集群的管理节点,使用命令行来查看。

查看集群状态总览:

sudo ceph status
sudo ceph -s
sudo ceph health detail

查看本节点上运行的各项服务状态:

sudo systemctl status ceph\*.service ceph\*.target

查看本节点上运行的某项服务的详细日志:

sudo journalctl -u <service-name>

例如:

sudo journalctl -u ceph-osd@0.service

参考文档:

管理 alert

在 Ceph Dashboard 中,点击左侧导航栏的 Cluster > Monitoring,可以查看当前集群中的警告信息。

alert1

如果确认警告信息无关紧要,您可以静默警告信息。首先在表格中点击所要静默的行,然后点击左上角的 Create Silence 按钮,填写静默时长和筛选条件等配置即可。

alert2

另外,您也可以通过命令行来静默警告信息。例如,如果通过命令行查看集群状态发现有如下警告:

$ ceph health detail
[WRN] MDS_SLOW_METADATA_IO: 1 MDSs report slow metadata IOs

您可以通过以下命令静默该警告:

ceph health mute MDS_SLOW_METADATA_IO

或在一定时间内静默警告:

ceph health mute MDS_SLOW_METADATA_IO 1h

通过以下命令取消静默:

ceph health unmute MDS_SLOW_METADATA_IO

参考文档:

查看 daemon 状态

通过以下命令查看集群中运行的所有 daemon:

sudo ceph orch ls

sudo ceph orch ps 

sudo ceph orch ls --export > cluster.yaml

参考文档:

获取 daemon 地址

为了获取某个 daemon 的地址,例如 prometheus、grafana、alert manager 等,首先通过以下命令查看 daemon 所在的节点与端口:

$ sudo ceph orch ps
NAME                           HOST   PORTS        STATUS        REFRESHED  AGE  MEM USE  MEM LIM  VERSION  IMAGE ID      CONTAINER ID
alertmanager.host1             host1  *:9093,9094  running (5w)     4m ago   8w    54.3M        -           ba2b418f427c  10679fbf3b3d
grafana.host1                  host1  *:3000       running (5w)     4m ago   8w     149M        -  8.3.5    dad864ee21e9  526bb2c28317
prometheus.host1               host1  *:9095       running (5w)     4m ago   8w     213M        -           514e6a882f6e  8579c7c74cc5

可以看到,prometheus、grafana、alert manager 均运行在 host1 节点上,并分别使用 9095、3000、9093 端口。

通过以下命令查看 host1 节点的 ip:

$ sudo ​​ceph orch host ls
HOST    ADDR          LABELS  STATUS
host1   10.1.2.3      _admin

因此:

  • prometheus 的地址为 http://10.1.2.3:9095
  • grafana 的地址为 http://10.1.2.3:3000
  • alert manager 的地址为 http://10.1.2.3:9093

调整 daemon 配置

Ceph 支持以 yaml 配置文件的形式指定 daemon 的详细 spec。

以 rgw daemon 为例,导出配置文件:

sudo ceph orch ls --service_type rgw --export > rgw.yaml

rgw.yaml 示例如下:

service_type: rgw
service_id: cephs3
service_name: rgw.cephs3
placement:
  hosts:
  - host1

修改 rgw.yaml 为以下内容:

service_type: rgw
service_id: cephs3
service_name: rgw.cephs3
placement:
  count: 2
  hosts:
  - host1
  - host2
networks:
- 172.0.0.0/24
spec:
  rgw_frontend_port: 8081

其中:

  • 配置 rgw daemon 为 2 个,host1 节点、host2 节点各一个
  • 配置 rgw daemon 使用 172.0.0.0/24 网络
  • 配置 rgw daemon 使用 8081 端口

应用该配置文件:

sudo ceph orch apply -i ./rgw.yaml

移除 daemon

通过以下命令移除某个 daemon:

sudo ceph orch daemon rm <daemon-name>

例如:

sudo ceph orch daemon rm mgr.ds03.obymbg

移除 service

通过以下命令移除某个 service:

sudo ceph orch rm <service-name>

例如:

sudo ceph orch rm mds.k8s

参考文档:

查看 mon ip

通过以下命令查看 mon ip:

sudo ceph mon dump

创建 mon

默认情况下,Ceph 集群自动管理 mon daemon,一般在 5 个不同的节点上部署 5 个 daemon,占用节点的 3300 和 6789 端口。

如果需要手动管理 mon,首先执行以下命令:

sudo ceph orch apply mon --unmanaged

然后手动创建 mon:

sudo ceph orch daemon add mon --placement="myhost:[v2:1.2.3.4:3300,v1:1.2.3.4:6789]=name"

其中,[v2:1.2.3.4:3300,v1:1.2.3.4:6789] 是 mon 的网络地址,=name 用于指定所创建的 mon 名称。

参考文档:

查看 crash 历史

通过以下命令查看集群中曾经发生过的 crash 事件:

sudo ceph crash ls

查看某个 crash 事件的详细信息:

sudo ceph crash info <crash-id>

将 crash 事件归档,以免出现在 ceph status 的输出中:

sudo ceph crash archive-all

参考文档:

查看节点

通过以下命令查看集群中的所有节点:

sudo ceph orch host ls

添加节点

集群安装 - 添加节点

重启节点

通过 SSH 登录 Ceph 集群的任意一个节点,可执行以下命令重启本节点上的 Ceph 服务:

sudo systemctl stop ceph\*.service ceph\*.target
sudo systemctl start ceph.target 

移除节点

假设将被移除的节点名称为 host1,以下命令均需要在 Ceph 集群的其他管理节点上运行。

运行以下命令移除 host1:

sudo ceph orch host ls   
sudo ceph orch host drain host1
sudo ceph mon remove host1

观察 OSD 的移除情况,直到其报告 “No OSD remove/replace operations reported”:

sudo ceph orch osd rm status

观察 Daemon 的移除情况(这可能会需要较长的时间),直到其报告 “No daemons reported”:

sudo ceph orch ps host1

所有 Daemon 都被移除后才能通过以下命令删除节点 host1:

sudo ceph orch host rm host1
sudo ceph orch host ls

参考文档:

查看存储设备

查看节点上的所有存储设备:

lsblk

查看集群中 Ceph 能看到的所有存储设备:

sudo ceph orch device ls

查看集群中运行的所有 OSD:

sudo ceph osd status

添加存储设备

集群安装 - 添加存储设备

检查存储设备

如果某个存储设备出现异常,读写速度较慢,可通过以下命令检查:

hdparm -Tt <device-path>

例如:

hdparm -Tt /dev/sdb

移除存储设备

假设将被移除的磁盘上运行的 OSD 编号为 0(可通过 Web UI 或 sudo ceph osd status 命令获取)。

在磁盘所属节点上运行以下命令移除 OSD,并自动化地将该磁盘中存储的数据移动到其他磁盘中:

sudo ceph orch osd rm 0

通过以下命令查看 OSD 移除进展:

sudo ceph orch osd rm status

参考文档:

存储设备故障恢复

如果某个存储设备发生故障,其中的数据无法读取,该存储设备对应的 OSD Daemon 在一段时间后会自动发现故障并显示在集群状态总览中。此时,管理员应当按照移除存储设备一节中的步骤移除故障设备,并将其从物理机器中拔出。

由于 Ceph 使用了冗余存储机制,一个存储设备的损坏并不会造成数据的丢失,Ceph 将自动恢复损坏的数据。一个 Ceph 集群具体能够容忍的存储设备损坏数量根据配置的不同有所区别,详见 Erasure Code 一节。

查看存储空间

通过以下命令查看存储空间的整体使用情况:

sudo ceph df

通过以下命令查看每个 osd 的存储空间使用情况:

sudo ceph osd df

重启 mgr

mgr 负责集群的外围监控和管理,dashboard 即为 mgr 的一个组件。如果 dashboard 无法访问,可以尝试重启 mgr。

通过以下命令将当前正在运行的 mgr daemon 标记为失败,ceph 会自动重启该 daemon 并启用候补 daemon:

sudo ceph mgr fail

配置 crushmap

crushmap 用于指定数据如何存放到存储设备中,例如仅使用 hdd、仅使用 ssd、以 replicate 的形式、以 erasure code 的形式。

首先导出 crushmap:

sudo ceph osd getcrushmap -o comp_crush_map.cm
crushtool -d comp_crush_map.cm -o crush_map.cm

查看 crushmap:

$ cat crush_map.cm

...
# rules
rule replicated_hdd {
	id 0
	type replicated
	step take default class hdd
	step chooseleaf firstn 0 type osd
	step emit
}
rule replicated_ssd {
	id 1
	type replicated
	step take default class ssd
	step chooseleaf firstn 0 type osd
	step emit
}
rule ecpool-k4-m2 {
	id 2
	type erasure
	step set_chooseleaf_tries 5
	step set_choose_tries 100
	step take default class ssd
	step choose indep 0 type osd
	step emit
}

从上述 crushmap 示例可以看出:

  • type replicated 表示 crush rule 是 replicate 类型
  • type erasure 表示 crush rule 是 erasure code 类型
  • step take default class hdd 表示 crush rule 仅使用 hdd
  • step take default class ssd 表示 crush rule 仅使用 ssd
  • step chooseleaf firstn 0 type osd 表示 crush rule 在不同的 osd 中存储数据的多个备份

您可以编辑并通过以下命令应用 crushmap:

crushtool -c crush_map.cm -o new_crush_map.cm
sudo ceph osd setcrushmap -i new_crush_map.cm

然后即可配置 pool 使用新的 crush rule,参考配置 pool

参考文档:

查看 pool

通过以下命令查看集群中所有的 pool

sudo ceph osd lspools

删除 pool

通过以下命令删除一个 pool:

sudo ceph osd pool rm <pool-name> <pool-name> --yes-i-really-really-mean-it

注意:pool 中的数据将被彻底删除,无法恢复,请小心操作。

配置 pool

如果 pool 的 crush rule 是 replicate 类型,可通过以下命令设置 replicate size:

sudo ceph osd pool set <pool-name> size <size> --yes-i-really-mean-it
sudo ceph osd pool set <pool-name> min_size <min-size>

一般情况下,replicate pool 的 size 为 3(表示数据会被复制 3 份),min_size 为 2(表示最少有 2 份数据才能正常工作)。

特殊情况下,例如底层存储已经有 RAID 容错机制,可将 size 和 min_size 都设为 1。

如果集群中有多个 crush rule,可通过以下命令为 pool 指定 crush rule:

sudo ceph osd pool set <pool-name> crush_rule <crush-rule-name>

参考文档:

查看 cephfs

通过以下命令查看集群中所有的 cephfs:

sudo ceph fs ls

删除 cephfs

为了删除一个 cephfs,首先将其标记为不可用:

sudo ceph fs fail <fs-name>

然后确认删除该 cephfs:

sudo ceph fs rm <fs-name> --yes-i-really-mean-it

参考删除 pool,删除该 cephfs 下属所有的 pool。

参考移除 daemon,移除该 cephfs 对应的所有 mds daemon。

挂载 cephfs

您可以通过 mount 命令在任意能够访问 Ceph 集群的机器上挂载 cephfs。

首先安装 ceph 工具:

curl --silent --remote-name --location https://github.com/ceph/ceph/raw/quincy/src/cephadm/cephadm
chmod +x cephadm
sudo ./cephadm add-repo --release quincy
sudo ./cephadm install ceph-common

然后配置访问权限:

mkdir -p -m 755 /etc/ceph
ssh root@<ceph-admin-node-ip> "sudo ceph config generate-minimal-conf" | sudo tee /etc/ceph/ceph.conf
chmod 644 /etc/ceph/ceph.conf

ssh root@<ceph-admin-node-ip> "sudo ceph fs authorize <fs-name> client.foo / rw" | sudo tee /etc/ceph/ceph.client.foo.keyring
chmod 600 /etc/ceph/ceph.client.foo.keyring

最后执行 mount 命令:

mount -t ceph foo@<cluster-id>.<fs-name>=/ <mount-path> -o secret=<client-keyring>

例如:

mount -t ceph foo@f5e95c18-a869-11ed-ba9b-b95348587a43.k8s=/ /mnt/mycephfs -o secret=AQBFgglkj0N0CRAA0LHXD/QFerke3mZZ6W3UAw==

注意:不要直接在 Ceph 集群的节点上挂载 cephfs,这可能会造成死锁。但在容器中挂载 cephfs 是可以的。

参考文档:

配置 cephfs

cephfs 支持的最大文件大小默认是 1TiB,可通过以下命令修改:

sudo ceph fs set <fs-name> max_file_size <num-bytes>

例如,修改为 4TiB:

sudo ceph fs set <fs-name> max_file_size 4398046511104

查看 osd

通过以下命令查看集群中所有的 osd 和 pool:

sudo ceph osd dump

查看 pg

查看所有 pg 情况:

sudo ceph pg dump

查看某个 pool 中的所有 pg:

sudo ceph pg ls-by-pool <pool-name>

查看某个 osd 中的所有 pg

sudo ceph pg ls-by-osd <pool-name>

查看存在异常的所有 pg:

sudo ceph pg dump_stuck unclean

查看某个 pg 的详细情况:

sudo ceph pg <pg-id> query

参考文档:

调整 pg 数量

一般情况下,建议通过以下命令禁用 pg autoscaling,以便集群正常运行:

sudo ceph config set osd osd_pool_default_pg_autoscale_mode off

禁用 pg autoscaling 后,通过以下命令设置每个 pool 的 pg 数量:

sudo ceph osd pool set <pool-name> pg_num <num>
sudo ceph osd pool set <pool-name> pgp_num <num>

例如:

sudo ceph osd pool set default.rgw.buckets.data pg_num 256
sudo ceph osd pool set default.rgw.buckets.data pgp_num 256

根据 Red Hat 文档,推荐每个 osd 约 100~200 个 pg。

修复 pg

当集群的存储策略发生变化时,数据在重新平衡的过程中,pg 可能卡住,可尝试以下方式修复 pg:

sudo ceph pg force-backfill <pg-id>

sudo ceph pg force-recovery <pg-id>

sudo ceph pg repeer <pg-id>

手动 scrub / deep scrub

scrub 是指 Ceph 对 pg 中的数据进行一致性验证,通常每天进行一次。

deep scrub 是一种更深层次的 scrub,会读取数据的每个 bit 并计算 checksum,通常每周进行一次。

对某个 pg 进行 scrub / deep scrub:

sudo ceph pg scrub <pg-id>
sudo ceph pg deep-scrub <pg-id>

对某个 osd 上的所有 pg 进行 scrub / deep scrub:

sudo ceph osd scrub <osd-id>
sudo ceph osd deep-scrub <osd-id>

对某个 pool 中的所有 pg 进行 scrub / deep scrub:

sudo ceph osd pool scrub <pool-name>
sudo ceph osd pool deep-scrub <pool-name>

参考文档:

修改集群配置

Ceph 集群有非常多的配置可以实时修改。

查看某项配置的命令格式如下:

sudo ceph config get <who> <config-key>

修改某项配置的命令格式如下:

sudo ceph config set <who> <config-key> <config-value>

其中,<who> 表示该项配置对应的服务,如 mon、osd 等。

例如,获取 osd 中最多能够同时进行多少个 backfill 操作:

sudo ceph config get osd osd_max_backfills

设置该项配置的值为 8:

sudo ceph config set osd osd_max_backfills 8

参考文档:

调整数据平衡速度

当集群的存储策略发生变化时,数据会在 osd 之间进行重新平衡。如果期望尽快完成数据平衡,可以调整以下设置:

Name Default Now
osd_max_backfills 1 8
osd_recovery_max_active_hdd 3 8
osd_recovery_priority 5 1
osd_recovery_op_priority 3 1
osd_recovery_max_single_start 1 8
osd_recovery_sleep_hdd 0.1 0

注意:调整上述配置会极大地影响正常的读写速度,最好在无人使用的情况下进行,并在数据平衡完成后重新调整为默认值。

删除集群

注意,此为危险操作,数据将全部丢失。

如果确认需要删除整个 Ceph 集群,可以从非管理节点开始,逐一在每个节点上运行以下命令:

sudo apt update
sudo apt install ceph-deploy -y
sudo ceph-deploy purge <hostname>
sudo rm -rf /var/lib/ceph/*

通过以下命令格式化 Ceph 使用过的存储设备:

sudo sgdisk --zap-all <device-path>

例如:

sudo sgdisk --zap-all /dev/sdb

然后重启节点,才能恢复存储设备的状态:

sudo reboot