今天需要對(duì)實(shí)驗(yàn)室 OpenStack 環(huán)境中一臺(tái)虛擬機(jī)做實(shí)例快照,但是從 horizon 界面和 novaclient 都無法操作,錯(cuò)誤提示:無法獲取該實(shí)例的詳情。參考上一篇博客,因?yàn)檫@臺(tái)虛擬機(jī)在數(shù)據(jù)庫(kù)中的記錄被刪除了,我稱之為“消失”的虛擬機(jī)。最后我通過向數(shù)據(jù)庫(kù)中插入該虛擬機(jī)的信息,“找回”了這臺(tái)虛擬機(jī),使得此虛擬機(jī)可以重新正常使用。特此記錄。
前情回顧
之前誤刪了很多 nova_api 數(shù)據(jù)庫(kù)里 instance_mappings 里的 instance,導(dǎo)致很多虛擬機(jī)在 horizon 界面上無法操作。提示如下:

究其原因,說來話長(zhǎng)。
簡(jiǎn)單來說,OpenStack 目前采用了 cell_v2 架構(gòu)來管理不同集群的虛擬機(jī)。
(關(guān)于 cell 的知識(shí)參考http://www.itdecent.cn/p/653e43a02ddc)
cell 的相關(guān)數(shù)據(jù)表在 nova_api 數(shù)據(jù)庫(kù)中,三個(gè)數(shù)據(jù)表的關(guān)系如下圖:

當(dāng)想要獲取一個(gè)機(jī)器的詳細(xì)信息時(shí) :
1.nova-api 先從 instance_mappings 表拿到 instance 的 cell_id
2.再?gòu)?cell_mappings 表拿到所在 cell 的 DB connection
3.直接連接 cell 的 DB 拿到機(jī)器的詳細(xì)信息
之前說虛擬機(jī)“消失”了,是因?yàn)樵?nova_api 的 instance_mappings 表中刪除了該虛擬機(jī)的記錄,導(dǎo)致 nova-api 在響應(yīng)對(duì)虛擬機(jī)的操作請(qǐng)求時(shí),在上述第一步就出現(xiàn)了問題。雖然這臺(tái)虛擬機(jī)的記錄依然存在于nova數(shù)據(jù)庫(kù)的相關(guān)表中,但目前已是不可用狀態(tài)。
要讓這臺(tái)虛擬機(jī)恢復(fù)正常,變得“可操作”,必須從源頭解決問題,即恢復(fù)該虛擬機(jī)在 instance_mappings 表中的記錄。
操作過程
要在 instance_mappings 表中插入虛擬機(jī)記錄,先看一下 instance_mappings 表:

需要插入三個(gè)數(shù)據(jù),instance_uuid、cell_id、project_id。
我們已經(jīng)知道了虛擬機(jī)的 instance_uuid ,從錯(cuò)誤提示里復(fù)制過來就行 359c8002-301c-4306-8d6b-d0a743cdcf38 ,從 nova 數(shù)據(jù)庫(kù)的 instances 表里獲得 project_id:

從 nova_api 數(shù)據(jù)庫(kù)的 cell_mappings 表中查看 cell_id:

id為7。
最后,在 nova_api 數(shù)據(jù)庫(kù)的 instance_mappings 表中插入記錄:

好了,懷著忐忑的心情,去 horizon 上操作一下,可以操作了。不出所料,恢復(fù)“消失”的虛擬機(jī)成功了。