我的 :ref:`priv_cloud_infra` 中部署的 :ref:`zdata_ceph` 采用了3台 :ref:`ovmf` 虚拟机,但是我在一次物理服务器重启前,快速执行了 virsh shutdown XXX
连续关闭了3台虚拟机。这次 virsh shutdown
命令执行间隔极短,也就是说3台Ceph虚拟机几乎同时关闭。由于没有在虚拟机内部的操作系统执行shutdown,这种虚拟机 shutdown 可能不是干净的关机方法,我发现重启服务器之后,3个虚拟机虽然正常启动,但是使用ceph存储的其他虚拟机启动会 paused
住:
Id Name State ---------------------------- 1 z-b-data-2 running 2 z-b-data-3 running 3 z-b-data-1 running 4 z-k8s-m-1 paused
在Ceph虚拟机集群中检查 ceph -s
可以看到告警:
cluster: id: 0e6c8b6f-0d32-4cdb-a45d-85f8c7997c17 health: HEALTH_WARN Reduced data availability: 33 pgs inactive, 33 pgs peering 5 slow ops, oldest one blocked for 1925 sec, daemons [osd.1,osd.2] have slow ops. services: mon: 3 daemons, quorum z-b-data-1,z-b-data-2,z-b-data-3 (age 11m) mgr: z-b-data-1(active, since 32m) osd: 3 osds: 3 up (since 31m), 3 in (since 4w) data: pools: 2 pools, 33 pgs objects: 44.79k objects, 174 GiB usage: 517 GiB used, 880 GiB / 1.4 TiB avail pgs: 100.000% pgs not active 33 peering
这显示OSD存在异常
检查 dmesg -T
输出也有一个提示信息:
[Tue Jan 10 00:41:47 2023] systemd[1]: /lib/systemd/system/ceph-volume@.service:8: Unit configured to use KillMode=none. This is unsafe, as it disables systemd's process lifecycle management for the service. Please update your service to use a safer KillMode=, such as 'mixed' or 'control-group'. Support for KillMode=none is deprecated and will eventually be removed.
看来ceph进程关闭需要改进?
因为是晚上,我一时没有解决方法,所以在第二天开始排查,此时发现原先 paused
住的虚拟机已经进入了 runing
状态了:
.. literalinclude:: osd_slow_ops_warning_after_ceph_down/virsh_list_running :language: bash :caption: paused的虚拟机进入了running状态 :emphasize-lines: 7
此时观察 ceph -s
集群状态出现更为严重的告警( objects degraded
):
.. literalinclude:: osd_slow_ops_warning_after_ceph_down/ceph_objects_degraded :language: bash :caption: ceph集群降级(objects degraded) :emphasize-lines: 7
可以看到已经有一个osd出现宕机:
检查ceph日志,可以看到:
.. literalinclude:: osd_slow_ops_warning_after_ceph_down/ceph_log :language: bash :caption: ceph集群日志显示"33 pgs: 33 active+undersized+degraded" :emphasize-lines: 4-6
- 首先我们要找到是哪个osd节点宕机:
.. literalinclude:: osd_slow_ops_warning_after_ceph_down/ceph_osd_tree :language: bash :caption: ceph osd tree命令检查osd状态 :emphasize-lines: 6,7
可以看到节点2上 osd.1
出现宕机
- 然后检查服务器上空间:
.. literalinclude:: osd_slow_ops_warning_after_ceph_down/ceph_osd_df :language: bash :caption: ceph osd df命令检查osd存储空间 :emphasize-lines: 4
可以看到节点2的存储已经无法访问
- 在节点2上检查服务,可以看到
osd
服务是运行状态:
.. literalinclude:: osd_slow_ops_warning_after_ceph_down/systemctl_status_osd :language: bash :caption: systemctl检查osd处于运行状态
- 检查节点2上
/var/log/ceph/osd.log
:
.. literalinclude:: osd_slow_ops_warning_after_ceph_down/osd_log :language: bash :caption: systemctl检查osd处于运行状态 :emphasize-lines: 10
从日志没有看到非常多异常,但是从dashboard可以看到 OSDs 页面侠士,节点2状态是 out down
:
- 我检查了节点2的系统日志,但是没有看到异常,物理服务器的dmesg日志没有看到硬件异常
由于没有找到明显报错,但是可以看到节点2出现down机,数据延迟了4小时,所以我先shutdown了节点2操作系统,然后再次启动该虚拟机。
启动节点2可以看到Ceph立即开始进行数据修复同步:
.. literalinclude:: osd_slow_ops_warning_after_ceph_down/ceph_node_reboot_fix :language: bash :caption: 重启ceph节点2,可以看到数据同步修复 :emphasize-lines: 10
然后Ceph集群恢复健康状态:
.. literalinclude:: osd_slow_ops_warning_after_ceph_down/ceph_health :language: bash :caption: 重启ceph节点2,Ceph恢复健康
我初步推测是虚拟化 :ref:`ovmf_gpu_nvme` 可能在快速重启时出现passthcough存储访问问题,影响了ceph的数据节点。这个排查比较粗糙:
- 目前还缺乏对Ceph底层系统级原理的深入理解,需要补齐这块短板
- 需要模拟不同的破坏场景进行演练