注意

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

故障排除

本节解释如何调查 cephadm 命令失败的原因或某个服务不再正常运行的原因。

Cephadm 在容器中部署守护进程。故障排除容器化守护进程需要一个不同于传统守护进程(通过软件包安装)的流程。

这里有一些工具和命令可以帮助您故障排除您的 Ceph 环境。

暂停或禁用 cephadm

如果出现问题时 cephadm 行为异常,通过运行以下命令暂停 Ceph 集群的大部分后台活动:

ceph orch pause

这将停止 Ceph 集群中的所有更改,但 cephadm 仍将定期检查主机以刷新其守护进程和设备的清单。通过运行以下命令完全禁用 cephadm:

ceph orch set backend ''
ceph mgr module disable cephadm

这些命令禁用所有ceph orch ...CLI 命令。所有先前部署的守护进程容器继续运行,并且就像您运行这些命令之前一样启动。

请参阅禁用守护进程的自动部署更多关于禁用单个服务的详细信息。

每个服务和每个守护进程的事件

为了更容易地调试失败的守护进程,cephadm 为每个服务和每个守护进程存储事件。这些事件通常包含与您的 Ceph 集群故障排除相关的信息。

列出服务事件

要查看与某个服务相关的事件,运行以下格式的命令:

ceph orch ls --service_name=<service-name> --format yaml

这将返回以下格式的信息:

service_type: alertmanager
service_name: alertmanager
placement:
  hosts:
  - unknown_host
status:
  ...
  running: 1
  size: 1
events:
- 2021-02-01T08:58:02.741162 service:alertmanager [INFO] "service was created"
- '2021-02-01T12:09:25.264584 service:alertmanager [ERROR] "Failed to apply: Cannot
  place <AlertManagerSpec for service_name=alertmanager> on unknown_host: Unknown hosts"'

列出守护进程事件

要查看与某个守护进程相关的事件,运行以下格式的命令:

ceph orch ps --service-name <service-name> --daemon-id <daemon-id> --format yaml

这将返回以下格式的信息:

daemon_type: mds
daemon_id: cephfs.hostname.ppdhsz
hostname: hostname
status_desc: running
...
events:
- 2021-02-01T08:59:43.845866 daemon:mds.cephfs.hostname.ppdhsz [INFO] "Reconfigured
  mds.cephfs.hostname.ppdhsz on host 'hostname'"

检查 Cephadm 日志

要了解如何监控 cephadm 日志的生成,请阅读查看cephadm日志消息.

如果您的 Ceph 集群已配置为将事件记录到文件中,则所有监控主机上都将有一个ceph.cephadm.log文件。参见Ceph 守护进程控制以获取更完整的解释。

收集日志文件

使用journalctl以收集所有守护进程的日志文件:

Note

默认情况下 cephadm 现在将日志存储在 journald 中。这意味着/var/log/ceph/.

您将不再在

cephadm logs --name <name-of-daemon>

Note

这仅在在运行守护进程的同一主机上运行时才有效。要获取在不同主机上运行的守护进程的日志,向命令中添加--fsid选项,如下面的示例所示:

cephadm logs --fsid <fsid> --name <name-of-daemon>

在此示例中,<fsid>对应于ceph status command.

返回的集群 ID。

for name in $(cephadm ls | jq -r '.[].name') ; do
  cephadm logs --fsid <fsid> --name "$name" > $name;
done

收集 Systemd 状态

要打印 systemd 单元的状态,运行以下格式的命令:

systemctl status "ceph-$(cephadm shell ceph fsid)@<service name>.service";

要获取给定主机上所有守护进程的状态,运行以下 shell 脚本:

fsid="$(cephadm shell ceph fsid)"
for name in $(cephadm ls | jq -r '.[].name') ; do
  systemctl status "ceph-$fsid@$name.service" > $name;
done

列出所有下载的容器镜像

要列出主机上下载的所有容器镜像,运行以下命令:

podman ps -a --format json | jq '.[].Image' "docker.io/library/centos:8" "registry.opensuse.org/opensuse/leap:15.2"

Note

Image也可能称为ImageID.

手动运行容器

Cephadm 在运行容器时使用小的包装器。有关容器执行命令,请参阅/var/lib/ceph/<cluster-fsid>/<service-name>/unit.run

SSH 错误

错误消息:

execnet.gateway_bootstrap.HostNotFound: -F /tmp/cephadm-conf-73z09u6g -i /tmp/cephadm-identity-ky7ahp_5 root@10.10.1.2
...
raise OrchestratorError(msg) from e
orchestrator._interface.OrchestratorError: Failed to connect to 10.10.1.2 (10.10.1.2).
Please make sure that the host is reachable and accepts connections using the cephadm SSH key
...

如果您收到上述错误消息,请尝试以下方法来故障排除cephadm与监控之间的 SSH 连接:

  1. 确保cephadm具有 SSH 身份密钥:

    [root@mon1~]# cephadm shell -- ceph config-key get mgr/cephadm/ssh_identity_key > ~/cephadm_private_key
    INFO:cephadm:Inferring fsid f8edc08a-7f17-11ea-8707-000c2915dd98
    INFO:cephadm:Using recent ceph image docker.io/ceph/ceph:v15 obtained 'mgr/cephadm/ssh_identity_key'
    [root@mon1 ~] # chmod 0600 ~/cephadm_private_key
    

如果失败,cephadm 没有密钥。通过运行以下命令修复此问题:

[root@mon1 ~]# cephadm shell -- ceph cephadm generate-ssh-key

或:

[root@mon1 ~]# cat ~/cephadm_private_key | cephadm shell -- ceph cephadm set-ssh-key -i -
  1. 确保 SSH 配置正确:

    [root@mon1 ~]# cephadm shell -- ceph cephadm get-ssh-config > config
    
  2. 验证是否可以连接到主机:

    [root@mon1 ~]# ssh -F config -i ~/cephadm_private_key root@mon1
    

验证公钥是否列在 authorized_keys 文件中

要验证公钥是否在authorized_keys文件中,运行以下命令:

[root@mon1 ~]# cephadm shell -- ceph cephadm get-pub-key > ~/ceph.pub
[root@mon1 ~]# grep "`cat ~/ceph.pub`"  /root/.ssh/authorized_keys

推断 CIDR 网络错误

如果您看到此错误:

ERROR: Failed to infer CIDR network for mon ip ***; pass --skip-mon-network to configure it later

或此错误:

Must set public_network config option or specify a CIDR network, ceph addrvec, or plain IP

这意味着您必须运行此格式的命令:

ceph config set mon public_network <mon_network>

更多关于此类操作的详细信息,请参阅部署附加监视器.

访问管理员套接字

每个 Ceph 守护进程都提供一个管理员套接字,允许运行时选项设置和统计读取。参见使用管理员套接字.

  1. 要访问管理员套接字,请在主机上进入守护进程容器:

    [root@mon1 ~]# cephadm enter --name <daemon-name>
    
  2. 运行以下格式的命令以查看管理员套接字的配置和其他可用操作:

    [ceph: root@mon1 /]# ceph --admin-daemon /var/run/ceph/ceph-<daemon-name>.asok config show
    [ceph: root@mon1 /]# ceph --admin-daemon /var/run/ceph/ceph-<daemon-name>.asok help
    

运行各种 Ceph 工具

要运行ceph-objectstore-toolceph-monstore-tool等 Ceph 工具,请使用cephadm shell --name <daemon-name>. 例如:

root@myhostname # cephadm unit --name mon.myhostname stop
root@myhostname # cephadm shell --name mon.myhostname
[ceph: root@myhostname /]# ceph-monstore-tool /var/lib/ceph/mon/ceph-myhostname get monmap > monmap
[ceph: root@myhostname /]# monmaptool --print monmap
monmaptool: monmap file monmap
epoch 1
fsid 28596f44-3b56-11ec-9034-482ae35a5fbb
last_changed 2021-11-01T20:57:19.755111+0000
created 2021-11-01T20:57:19.755111+0000
min_mon_release 17 (quincy)
election_strategy: 1
0: [v2:127.0.0.1:3300/0,v1:127.0.0.1:6789/0] mon.myhostname

Cephadm shell 以适合扩展守护进程维护和交互式运行守护进程的方式设置环境。

恢复监视器仲裁

如果 Ceph 监控守护进程(mons)无法形成多数派,cephadm将无法管理集群,直到多数派恢复。

为了恢复多数派,请按照以下步骤从 monmap 中删除不健康的监控器:

  1. 停止所有监控器。使用ssh连接到每个监控器的宿主机,然后在连接到监控器的宿主机时使用cephadm停止监控守护进程:

    ssh {mon-host}
    cephadm unit --name {mon.hostname} stop
    
  2. 确定一个存活的监控器并登录到其宿主机:

    ssh {mon-host}
    cephadm enter --name {mon.hostname}
    
  3. 按照从不健康集群中删除监控器的步骤进行操作。.

手动部署管理器守护进程

Cephadm 需要至少一个管理器(mgr)守护进程来管理集群。如果 Ceph 集群中最后一个剩余的管理器已被删除,请按照以下步骤在集群中的任意主机上部署一个新的管理器。在此示例中,新部署的管理器守护进程称为mgr.hostname.smfvfd.

  1. 禁用 cephadm 调度器,以防止cephadm删除新的管理器。参见启用 Ceph CLI:

    ceph config-key set mgr/cephadm/pause true
    
  2. 检索或创建新管理器的“auth entry”:

    ceph auth get-or-create mgr.hostname.smfvfd mon "profile mgr" osd "allow *" mds "allow *"
    
  3. 检索监控器的配置:

    ceph config generate-minimal-conf
    
  4. 检索容器镜像:

    ceph config get "mgr.hostname.smfvfd" container_image
    
  5. 创建一个名为config-json.json的文件,其中包含部署守护进程所需的信息:

    {
      "config": "# minimal ceph.conf for 8255263a-a97e-4934-822c-00bfe029b28f\n[global]\n\tfsid = 8255263a-a97e-4934-822c-00bfe029b28f\n\tmon_host = [v2:192.168.0.1:40483/0,v1:192.168.0.1:40484/0]\n",
      "keyring": "[mgr.hostname.smfvfd]\n\tkey = V2VyIGRhcyBsaWVzdCBpc3QgZG9vZi4=\n"
    }
    
  6. 部署管理器守护进程:

    cephadm --image <container-image> deploy --fsid <fsid> --name mgr.hostname.smfvfd --config-json config-json.json
    

捕获核心转储

使用cephadm的 Ceph 集群可以配置为捕获核心转储。systemd-coredump.

要启用核心转储处理,运行以下命令

ulimit -c unlimited

Note

核心转储不由内核命名空间化。这意味着核心转储写入/var/lib/systemd/coredump在容器主机上。设置ulimit -c unlimited仅在系统重新启动时持续。

等待再次发生崩溃。为了模拟守护进程的崩溃,例如运行killall -3 ceph-mon.

使用 cephadm 运行调试器

运行单个调试会话

使用cephadm shell命令启动调试会话。

  1. 启动 shell 会话:

    cephadm shell --mount /var/lib/system/coredump
    
  2. 在 shell 会话中,运行以下命令:

    dnf install ceph-debuginfo gdb zstd
    
    unzstd /var/lib/systemd/coredump/core.ceph-*.zst
    
    gdb /usr/bin/ceph-mon /mnt/coredump/core.ceph-*.zst
    
  3. 在 gdb 提示符下运行调试器命令:

    bt
    
    #0  0x00007fa9117383fc in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
    #1  0x00007fa910d7f8f0 in std::condition_variable::wait(std::unique_lock<std::mutex>&) () from /lib64/libstdc++.so.6
    #2  0x00007fa913d3f48f in AsyncMessenger::wait() () from /usr/lib64/ceph/libceph-common.so.2
    #3  0x0000563085ca3d7e in main ()
    

运行重复调试会话

当使用cephadm shell,如上面示例所示,对 shell 命令生成的容器所做的任何更改都是暂时的。在 shell 会话退出后,下载和安装的文件将不再可用。您可以简单地每次cephadm shell调用时重新运行相同的命令,但为了节省时间和资源,您可以创建一个新的容器镜像并使用它进行重复调试会话。

在以下示例中,我们创建一个简单的文件来构建容器镜像。下面的命令使用 podman,但如果podman被替换为docker:

cat >Containerfile <<EOF
ARG BASE_IMG=quay.io/ceph/ceph:v18
FROM \${BASE_IMG}
# install ceph debuginfo packages, gdb and other potentially useful packages
RUN dnf install --enablerepo='*debug*' -y ceph-debuginfo gdb zstd strace python3-debuginfo
EOF
podman build -t ceph:debugging -f Containerfile .
# pass --build-arg=BASE_IMG=<your image> to customize the base image

,预计它也能正常工作。ceph:debugging的新本地镜像。此镜像可以在构建它的同一台机器上使用。此镜像也可以推送到容器仓库或保存并复制到运行其他 Ceph 容器的节点。有关容器工作流程的更多信息,请参阅podmandocker文档。

镜像构建完成后,它可以用于启动重复调试会话。通过这种方式使用镜像,您可以避免每次运行调试会话时都必须重新安装调试工具和 debuginfo 软件包的麻烦。要使用此镜像调试核心文件,与之前描述的方法相同,运行:

cephadm --image ceph:debugging shell --mount /var/lib/system/coredump

调试运行中的进程

Gdb 调试器可以附加到运行中的进程以调试它们。这可以通过使用调试镜像并将其附加到要调试的进程所在的相同 PID 命名空间来实现。

这需要使用一些自定义参数运行容器命令。我们可以生成一个可以调试运行容器中进程的脚本。

cephadm --image ceph:debugging shell --dry-run > /tmp/debug.sh

这将创建一个包含cephadm用于创建 shell 的容器命令的脚本。通过删除脚本中的--init参数并将其替换为连接到运行中的容器的命名空间的参数来修改脚本。例如,假设我们要调试管理器,并且已经确定管理器正在名为ceph-bc615290-685b-11ee-84a6-525400220000-mgr-ceph0-sluwsk的容器中运行。在这种情况下,--pid=container:ceph-bc615290-685b-11ee-84a6-525400220000-mgr-ceph0-sluwsk参数应使用。

我们可以使用sh /tmp/debug.sh运行我们的调试容器。在 shell 中,我们可以运行ps等命令以获取管理器进程的 PID。在以下示例中,这是2。在运行 gdb 时,我们可以附加到运行中的进程:

attach 2
info threads
bt

由 Ceph 基金会带给您

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