删除Cinder卷报错“image still has watchers”的原因及解决方法咨询
残留Watcher导致RBD镜像无法删除的原因
RBD镜像的Watcher是Ceph RADOS层为实现客户端会话管理、镜像访问互斥、状态同步设计的机制:正常场景下Cinder挂载卷到计算节点、或客户端执行rbd map操作时,librbd客户端会为目标镜像注册Watcher,卷正常卸载/取消映射时客户端会主动通知集群注销Watcher。
出现残留Watcher的常见场景包括:
- 卷挂载节点(计算节点/cinder-volume服务节点)的
nova-compute/cinder-volume服务异常崩溃,未触发正常的Watcher注销流程 - 客户端节点与Ceph集群网络闪断,会话中断后集群未在超时周期内自动回收失效Watcher
- OpenStack侧卷状态异常(卡在attaching/error/deleting等状态),平台未触发正常的卷资源释放逻辑
- 手动映射RBD卷后未执行取消映射操作直接退出客户端进程
残留Watcher场景下删除目标卷的操作步骤
操作前务必确认目标卷已无业务使用,强制清理正在使用的Watcher会导致读写IO失败、数据损坏
步骤1:优先尝试正常释放Watcher
首先登录Watcher对应的节点(你场景中为172.18.0.1)执行以下操作:
- 检查是否有该卷的映射记录:
存在映射的话先执行取消映射:rbd showmapped | grep ${volume-id}rbd unmap ${pool}/${volume-id} - 检查是否有进程占用该卷相关的设备:
确认进程为无效残留的话可以手动结束进程,等待10s后Watcher会自动释放。lsof /dev/rbd/${pool}/${volume-id} - 也可以等待Ceph默认的30s客户端会话超时时间,确认超时后Watcher自动清理再尝试删除卷。
步骤2:手动清理残留Watcher
如果节点已经下线、或正常释放操作无效,执行以下命令手动清理Watcher:
适配Ceph Octopus(V15.2.+)及以上版本
使用rbd status输出的client ID和cookie参数执行清理:
rbd watchers rm ${pool}/${volume-id} --client-id 230016780 --cookie 94001004445696
适配低版本Ceph
先查询镜像对应的header对象:
rbd info ${pool}/${volume-id} | grep block_name_prefix # 输出格式类似:block_name_prefix: rbd_data.xxxxxxxxxxxxxxx,对应的header对象为rbd_header.xxxxxxxxxxxxxxx
执行Watcher清理:
rados rmwatchers ${pool}/rbd_header.${volume-id} 172.18.0.1:0/523356342
步骤3:验证并删除卷
执行rbd status ${pool}/${volume-id}确认Watcher已完全清理后,执行删除操作:
rbd rm ${pool}/${volume-id}
如果OpenStack侧该卷状态异常,先重置状态再从平台侧删除:
cinder reset-state --state available ${volume-id} cinder delete ${volume-id}
内容的提问来源于stack exchange,提问作者Corey
相关产品推荐
相关产品推荐

