Ceph-RBD锁引起KVM无法开机问题(RBD块设备无法映射)

Ceph-RBD锁引起KVM无法开机问题(RBD块设备无法映射)

Deng YongJie's blog 1,775 2024-06-02

前言

不知什么原因,KVM内核日志提示IO error,大部分命令执行无响应,关机之后无法启动

内核日志报错:

image-20240321121304250

关机后无法启动报错:

image-20240321121717420

排查过程

根据启动时的报错,进入PVE查看内核日志,发现RBD映射解锁失败?

image-20240321121828442

于是找了相关资料,初步判断是否ceph镜像的锁没有释放?

查看镜像锁和相关的rbd特性

rbd lock ls xds_kvm_dev_data/vm-516-disk-cloudinit

rbd info xds_kvm_dev_data/vm-516-disk-0

发现rbd并没有锁

image-20240321122331558

然后找了此4个特性的资料

ceph rbd的新特性

ceph支持 layering,striping exclusive lock, object map,fast diff ,deep-flatten 等新的new features

  • layering
    image的克隆操作。可以对image创建快照并保护,然后从快照克隆出新的image出来,父子image之间采用COW技术,共享对象数据。

  • striping v2
    条带化对象数据,类似raid 0,可改善顺序读写场景较多情况下的性能。

  • exclusive lock
    保护image数据一致性,对image做修改时,需要持有此锁。这个可以看做是一个分布式锁,在开启的时候,确保只有一个客户端在访问image,否则锁的竞争会导致io急剧下降。 主要应用场景是qemu live-migration。

  • object map
    此特性依赖于exclusive lock。因为image的对象分配是thin-provisioning,此特性开启的时候,会记录image所有对象的一个位图,用以标记对象是否真的存在,在一些场景下可以加速io。

  • fast diff
    此特性依赖于object map和exlcusive lock。快速比较image的snapshot之间的差异。

  • deep-flatten
    layering特性使得克隆image的时候,父子image之间采用COW,他们之间的对象文件存在依赖关系,flatten操作的目的是解除父子image的依赖关系,但是子image的快照并没有解除依赖,deep-flatten特性使得快照的依赖也解除。

  • journaling
    依赖于exclusive lock。将image的所有修改操作进行日志化,并且复制到另外一个集群(mirror),可以做到块存储的异地灾备。这个特性在部署的时候需要新部署一个daemon进程,目前还在试验阶段,不过这个特性很重要,可以做跨集群/机房容灾。

创建image的时候,jewel默认开启的特性包括: layering/exlcusive lock/object map/fast diff/deep flatten

Exclusive Lock
从上面可以看出,很多特性都依赖于exclusive lock,重点介绍一下。

exclusive lock 是分布式锁,实现的时候默认是客户端在第一次写的时候获取锁,并且在收到其他客户端的锁请求时自动释放锁。这个特性在jewel默认开启后,本身没什么问题, 客户端可以自动获取和释放锁,在客户端crash后也能够正确处理。

通过上面RBD特性资料可以知道,很有可能是因为PVE内核不支持这几种特性,导致锁没有及时释放或者没有加超时时间?导致rbd镜像实际上不存在锁了,而PVE内核层面却还在不停解锁?解锁失败就无法映射RBD,从而导致KVM的开机失败?

再次重试开机多次失败,并查看是否还有镜像锁,然后尝试禁用此4种特性,看最终是否能开机?

image-20240321123521394

rbd lock ls xds_kvm_dev_data/vm-516-disk-0

#禁用特性,KVM相关的所有盘都要操作
rbd feature disable xds_kvm_dev_data/vm-516-disk-0 exclusive-lock object-map fast-diff deep-flatten

rbd info xds_kvm_dev_data/vm-516-disk-0

查看了锁并不存在,查看了镜像特性,已经全部关闭了。那么可以判定的是ceph-rbd镜像没有损坏,要么就是新特性的锁导致的问题,要么就是PVE内核映射rbd时出现了问题?

禁用了4种特性,然后再次尝试多次开机,发现还是无法开机,但换了另一种报错,提示需开启这3种特性? fast-diff,object-map,exclusive-lock

image-20240321123927230

那么可以判断出,PVE是支持这3种特性的,不支持deep-flatten特性?也就是说没有把快照的依赖也解除?

尝试开启3种特性,开启失败只能让PVE自身去启动。

rbd feature enable xds_kvm_dev_data/vm-516-disk-1 layering exclusive-lock object-map fast-diff

再次启动发现成功了,然后查看镜像锁是否也加了上去就能判断问题是PVE内核问题还是Ceph-RBD问题。

最终发现ceph-rbd加锁了,问题显然是出现在PVE的内核,此次问题是实际上ceph的镜像锁已经没了,PVE内核执行开机会映射rbd,然后提示解锁失败,所以无法开机。

image-20240321141944370

这是PVE内核的缺陷还是BUG,也就没有深究下去,审计源码是漫长耗时耗力的过程。

最后查看集群默认开启的特性,61的含义如下:

image-20240321142449147
o_200901040252rbd属性

61的意思是上面图中的bit码相加得到的值

解决方案

如再次复现此情况,需要重新禁用4种特性,并且尝试多次开机。如果报错提示需开启3种特性,那么需要开启此特性,再次开机

另外需要将配置文件分发到各个节点,在ceph.conf中增加rbd_default_features,写明你创建的卷需要哪几种属性。

[global]
rbd_default_features = "layering, exclusive-lock, object-map, fast-diff"