您可能需要調查 cephadm 命令失敗的原因或某個服務不再正常運行的原因。
Cephadm 將守護進程部署為容器。這意味着對那些容器化的守護進程進行故障排除的工作方式可能與您預期的不同(如果您希望此故障排除的工作方式與所涉及的守護程序未容器化時的故障排除方式相同,那肯定是正確的)。
這里有一些工具和命令可幫助您對 Ceph 環境進行故障排除。
暫停或禁用 CEPHADM
如果出現問題並且 cephadm 表現不佳,您可以通過運行以下命令暫停大部分 Ceph 集群的后台活動:
ceph orch pause
這會停止 Ceph 集群中的所有更改,但 cephadm 仍會定期檢查主機以刷新其守護進程和設備清單。您可以通過運行以下命令完全禁用 cephadm:
ceph orch set backend ''
ceph mgr module disable cephadm
這些命令禁用所有CLI 命令。所有先前部署的守護程序容器將繼續存在,並將像運行這些ceph orch ...命令之前那樣啟動。
有關禁用單個服務的信息,請參閱禁用守護程序的自動部署。
每個服務和每個守護進程事件
為了幫助調試失敗的守護進程部署,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 日志時對其進行監控,請閱讀Watching cephadm log messages。
如果您的 Ceph 集群已配置為將事件記錄到ceph.cephadm.log文件中,則會在所有監控主機上 調用一個 cephadm 日志文件(有關此內容的更完整說明,請參見Ceph 守護程序日志)。
收集日志文件
使用 journalctl 收集所有守護進程的日志文件:
筆記: 默認情況下,cephadm 現在將日志存儲在 journald 中。這意味着您將無法在/var/log/ceph/找到守護進程輸出日志。
要讀取一個特定守護程序的日志文件,請運行:
cephadm logs --name <name-of-daemon>
注意:這僅在運行守護程序的同一主機上運行時有效。要獲取在不同主機上運行的守護程序的日志,請提供以下--fsid選項:
cephadm logs --fsid <fsid> --name <name-of-daemon>
其中
要獲取給定主機上所有守護進程的所有日志文件,請運行:
for name in $(cephadm ls | jq -r '.[].name') ; do
cephadm logs --fsid <fsid> --name "$name" > $name;
done
收集系統狀態
要打印 systemd 單元的狀態,請運行:
systemctl status "ceph-$(cephadm shell ceph fsid)@<service name>.service";
要獲取給定主機的所有守護程序的所有狀態,請運行:
fsid="$(cephadm shell ceph fsid)"
for name in $(cephadm ls | jq -r '.[].name') ; do
systemctl status "ceph-$fsid@$name.service" > $name;
done
列出所有下載的容器鏡像
列出主機上下載的所有容器鏡像:
筆記: Image也可以稱為ImageID
podman ps -a --format json | jq '.[].Image'
"docker.io/library/centos:8"
"registry.opensuse.org/opensuse/leap:15.2"
手動運行容器
Cephadm 編寫運行容器的小型包裝器。容器執行命令參考 /var/lib/ceph/
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
...
用戶可以做的事情:
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-ssk-key -i -
2.確保 ssh 配置正確:
[root@mon1 ~]# cephadm shell -- ceph cephadm get-ssh-config > config
3.驗證我們是否可以連接到主機:
[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 守護進程都提供了一個繞過 MON 的管理套接字(請參閱使用管理套接字)。
要訪問管理套接字,首先進入主機上的守護進程容器:
[root@mon1 ~]# cephadm enter --name <daemon-name>
[ceph: root@mon1 /]# ceph --admin-daemon /var/run/ceph/ceph-<daemon-name>.asok config show
調用各種 CEPH 工具
要調用諸如 ceph-objectstore-toolor 之類的雜項 ceph-monstore-tool,您可以通過如下調用 cephadm shell --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
此命令以適合擴展守護程序維護和交互運行守護程序的方式設置環境。
恢復 MON 仲裁
如果 Ceph MON 無法形成仲裁,則 cephadm 無法管理集群,直到恢復仲裁。
為了恢復 MON quorum,請按照以下步驟從 monmap 中刪除不健康的 MON:
1.停止所有 MON。對於每個 MON 主機:
ssh {mon-host}
cephadm unit --name mon.`hostname` stop
2.識別一個幸存的監視器並登錄到該主機:
ssh {mon-host}
cephadm enter --name mon.`hostname`
3.按照從不健康的集群中刪除監視器中的步驟進行操作: https://docs.ceph.com/en/pacific/rados/operations/add-or-rm-mons/#rados-mon-remove-from-unhealthy
手動部署 MGR 守護進程
cephadm 需要一個 MGR 守護進程來管理集群。如果集群的最后一個 MGR 被刪除,請按照以下步驟在mgr.hostname.smfvfd集群的隨機主機上手動部署 MGR。
禁用 cephadm 調度程序,以防止 cephadm 刪除新的 MGR。請參閱啟用 Ceph CLI:
ceph config-key set mgr/cephadm/pause true
然后為新的 MGR 獲取或創建 auth 條目:
ceph auth get-or-create mgr.hostname.smfvfd mon "profile mgr" osd "allow *" mds "allow *"
獲取 ceph.conf:
ceph config generate-minimal-conf
獲取容器鏡像:
ceph config get "mgr.hostname.smfvfd" container_image
創建一個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"
}
部署守護進程:
cephadm --image <container-image> deploy --fsid <fsid> --name mgr.hostname.smfvfd --config-json config-json.json
分析核心轉儲
如果 Ceph 守護進程崩潰,cephadm 支持分析核心轉儲。要啟用核心轉儲,請運行
ulimit -c unlimited
核心轉儲現在將被寫入/var/lib/systemd/coredump.
筆記: 核心轉儲沒有被內核命名空間,這意味着它們將被寫入/var/lib/systemd/coredump容器主機上。
現在,等待崩潰再次發生。(要模擬守護進程的崩潰,請運行 killall -3 ceph-mon )
通過進入 cephadm shell 安裝調試包並安裝ceph-debuginfo:
# cephadm shell --mount /var/lib/systemd/coredump
[ceph: root@host1 /]# dnf install ceph-debuginfo gdb zstd
[ceph: root@host1 /]# unzstd /mnt/coredump/core.ceph-*.zst
[ceph: root@host1 /]# gdb /usr/bin/ceph-mon /mnt/coredump/core.ceph-...
(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 ()