前言
環境因為一些問題(網絡,或者磁盤,或者其它各種異常),引起了集群的狀態的一些變化,變化之后,集群的某些虛擬機正常某些虛擬機出現異常,異常現象就是無法啟動
特別是win server2008 ,會一直卡在滾動條這里
這個問題很久前碰到過一個哥們出現過,他問我是否遇到過,這個之前遇到過一次無法啟動的,通過導出導入的方式解決了,當時一直也沒找到原因
這個哥們告訴我,通過關閉rbd的屬性后,就可以正常啟動了,當時就記了下,也沒分析更深層次的原因
最近有一個環境因為時間過快,往回調整了十幾分鍾,集群出現mon選舉,osd出現閃斷以后,部分虛擬機出現無法啟動的情況
問題分析
導入導出或者克隆基本可以判斷數據是沒有問題的,那么應該就是其它問題
通過關閉屬性可以解決,那么大概能夠定位到這幾個屬性相關的
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
而鎖文件是最大的懷疑,之前處理ctdb的時候,就有過鎖沒有加上超時時間,然后ctdb掛掉以后,鎖不會自動釋放的問題,懷疑這個地方類似
我們的rbd的鏡像如下
[root@lab101 vm]# rbd info rbd/windows-server-8-base-clone
rbd image 'windows-server-8-base-clone':
size 50GiB in 12800 objects
order 22 (4MiB objects)
block_name_prefix: rbd_data.102376b8b4567
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
flags:
create_timestamp: Fri Dec 18 11:56:27 2020
parent: rbd/windows-server-8-base@for-clone
overlap: 50GiB
這個地方會有兩個對象被上鎖
[root@lab101 ceph]# rbd lock ls rbd/windows-server-8-base-clone
There is 1 exclusive lock on this image.
Locker ID Address
client.96545 auto 94013702760192 192.168.19.101:0/915896787
object_map的rbd_lock
[root@lab101 ceph]# rados -p rbd lock info rbd_object_map.102376b8b4567 rbd_lock
{"name":"rbd_lock","type":"exclusive","tag":"","lockers":[{"name":"client.96943","cookie":"","description":"","expiration":"0.000000","addr":"192.168.19.101:0/2231653745"}]}
header的rbd_lock,這個跟上面通過rbd lock查到的鎖命令是同一個
[root@lab101 ceph]# rados -p rbd lock info rbd_header.102376b8b4567 rbd_lock
{"name":"rbd_lock","type":"exclusive","tag":"internal","lockers":[{"name":"client.96943","cookie":"auto 94009656832384","description":"","expiration":"0.000000","addr":"192.168.19.101:0/2231653745"}]}
復現問題
啟動一個rbd的kvm,並且裝上win server2008
/usr/libexec/qemu-kvm -drive format=raw,file=rbd:rbd/windows-server-8-base-clone -cdrom /home/vm/win2008.iso -m 8192 -vnc :0
這個啟動后直接用vnc連接訪問即可,然后使用一個循環測試寫入工具在虛擬機里面進行循環讀寫,模擬正常的寫入,我使用的是SANergy這個工具,使用循環寫模式,可以做成iso,然后上面的-cdrom參數把文件穿透進去
准備一個至少兩個物理節點的集群
節點一為mon,節點二的時間同步指向節點一,然后調整一的物理時間往后調整20分鍾(也可以往前),這個集群會出現osd閃斷的情況
正常情況下,這個時候windows會卡死的,如果沒卡死,多操作幾遍往后調整時間,目的就是把虛擬機卡死
我的環境通過資源管理器看到沒有讀寫io了,強制停止kvm進程,無法停止就kill -9
我們恢復集群的狀態,然后再次檢查鎖狀態
[root@lab101 ceph]# cat /home/vm/checklock.sh
rados -p rbd lock info rbd_object_map.102376b8b4567 rbd_lock
rados -p rbd lock info rbd_header.102376b8b4567 rbd_lock
[root@lab101 ceph]# sh /home/vm/checklock.sh
{"name":"rbd_lock","type":"exclusive","tag":"","lockers":[{"name":"client.96943","cookie":"","description":"","expiration":"0.000000","addr":"192.168.19.101:0/2231653745"}]}{"name":"rbd_lock","type":"exclusive","tag":"internal","lockers":[{"name":"client.96943","cookie":"auto 94009656832384","description":"","expiration":"0.000000","addr":"192.168.19.101:0/2231653745"}]}
可以看到居然還在
我們嘗試啟動虛擬機出現無法啟動的情況
我們嘗試刪除鎖
處理objectmap的鎖
[root@lab101 ceph]# rados -p rbd lock break rbd_object_map.102376b8b4567 rbd_lock client.96943
處理header的鎖
[root@lab101 ceph]# rados -p rbd lock break rbd_header.102376b8b4567 rbd_lock client.96943
ERROR: failed breaking lock: (2) No such file or directory
error 2: (2) No such file or directory
提示沒有,比較奇怪,那嘗試拿鎖
[root@lab101 ceph]# rados -p rbd lock get rbd_header.102376b8b4567 rbd_lock client.96943
ERROR: failed locking: (16) Device or resource busy
error 16: (16) Device or resource busy
可以看到Device or resource busy 這個一般就是資源占用,無法釋放的情況
我們用rbd的命令試下
[root@lab101 ceph]# rbd lock ls rbd/windows-server-8-base-clone
There is 1 exclusive lock on this image.
Locker ID Address
client.96943 auto 94009656832384 192.168.19.101:0/2231653745
[root@lab101 ceph]# rbd lock rm rbd/windows-server-8-base-clone "auto 94009656832384" client.96943
[root@lab101 ceph]# rbd lock ls rbd/windows-server-8-base-clone
可以看到這個是可以刪除的
再次檢查
[root@lab101 ceph]# sh /home/vm/checklock.sh
{"name":"rbd_lock","type":"exclusive","tag":"","lockers":[]}{"name":"rbd_lock","type":"exclusive","tag":"internal","lockers":[]}[root@lab101 ceph]#
可以看到沒有鎖了
我們再次嘗試啟動
產生了新的鎖文件了
{"name":"rbd_lock","type":"exclusive","tag":"","lockers":[]}{"name":"rbd_lock","type":"exclusive","tag":"internal","lockers":[]}[root@lab101 ceph]#
[root@lab101 ceph]# sh /home/vm/checklock.sh
{"name":"rbd_lock","type":"exclusive","tag":"","lockers":[{"name":"client.97312","cookie":"","description":"","expiration":"0.000000","addr":"192.168.19.101:0/1322200836"}]}{"name":"rbd_lock","type":"exclusive","tag":"internal","lockers":[{"name":"client.97312","cookie":"auto 94532169500416","description":"","expiration":"0.000000","addr":"192.168.19.101:0/1322200836"}]}
從vnc里面可以看到桌面了
上面的是處理的方法之一,另外的一個方法是
rbd feature disable rbd/windows-server-8-base-clone exclusive-lock, object-map, fast-diff
rbd feature enable rbd/windows-server-8-base-clone exclusive-lock, object-map, fast-diff
建議是通過方法一進行處理,理論上方法二也沒什么問題,其它幾個屬性如果正好需要用到的話,那么關閉后,開啟下就行
總結
出問題總會是有原因的,如果我們提前抓到了問題,那么下次再遇到的時候就會從容的多,所以不要放棄解決問題,能夠解決的問題都會成為你的經驗