內(nèi)容來(lái)源:2018 年 8 月 7 日,VMware大中華區(qū)原廠高級(jí)技術(shù)講師史峻在“VMware直播分享 第二期”進(jìn)行《vSAN常見(jiàn)錯(cuò)誤故障排錯(cuò)》演講分享。IT 大咖說(shuō)經(jīng)主辦方和演講者審閱授權(quán)轉(zhuǎn)載發(fā)布。
閱讀字?jǐn)?shù):5264 | 14分鐘閱讀
摘要
本次演講主要分享vSAN常見(jiàn)故障排除,其中包括:vSAN創(chuàng)建VM全過(guò)程介紹,vSAN排錯(cuò)方法論和vSAN常用排錯(cuò)工具。
嘉賓演講視頻回放,請(qǐng)掃下方二維碼即可觀看。
vSAN Software Architecture
vSAN是軟件定義的對(duì)象存儲(chǔ),VMware的對(duì)象存儲(chǔ)和虛擬化的產(chǎn)品是緊密的結(jié)合在一起的,它實(shí)際上是將本機(jī)磁盤(pán)組中的硬盤(pán)聚集起來(lái)打造的虛擬的軟件定義的共享存儲(chǔ)。這個(gè)環(huán)境中只有主機(jī)、服務(wù)器,沒(méi)有第三方的硬件存儲(chǔ)。
傳統(tǒng)存儲(chǔ)如果用的是共享存儲(chǔ),服務(wù)器連接到LUN,然后在LUN中創(chuàng)建VMFS文件系統(tǒng),文件系統(tǒng)中有虛擬機(jī)的文件夾,由vmkernel進(jìn)行虛擬機(jī)文件I/O。
vSAN中不再以文件的形式進(jìn)行數(shù)據(jù)存取,vSAN創(chuàng)建之后有個(gè)vSAN Datastore,這個(gè)DataStore中存放著5類(lèi)虛擬機(jī)的對(duì)象,分別是NameSpace、VMDK、快照、內(nèi)存以及交換文件。
vSAN數(shù)據(jù)保護(hù)和性能提升主要通過(guò)軟件層面的策略來(lái)實(shí)現(xiàn),由策略定義性能和可用性等。上圖是創(chuàng)建vSAN存儲(chǔ)策略的界面,可以在此進(jìn)行各種策略的配置。
Virtual Machine Storage Policy Capabilites for vSAN
可用性最基本的指標(biāo)就是數(shù)據(jù)有多個(gè)副本,比如RAID 1可以有兩個(gè)數(shù)據(jù)副本。在vSAN中通過(guò)PFTT策略來(lái)保證可用性,即容忍錯(cuò)誤的數(shù)量是多少,如果為0 就表示不能容錯(cuò),數(shù)據(jù)只有一份拷貝,1表示容忍出錯(cuò)1次,數(shù)據(jù)有兩份拷貝。PFTT默認(rèn)為1,相當(dāng)于實(shí)現(xiàn)了RAID 1的效果,最大可以設(shè)置為3。
在RAID中性能的提升需要依靠RAID 0,RAID 0是將數(shù)據(jù)切成多個(gè)條帶來(lái)進(jìn)行保存。vSAN中也能將數(shù)據(jù)切分成多個(gè)條帶,最多12份進(jìn)行同時(shí)寫(xiě)。
vSAN Architecture Components
vSAN中有這樣幾個(gè)軟件組件。CLOM(集群級(jí)別的對(duì)象管理器),DOM(分布式對(duì)象管理器),LSOM(本地日志結(jié)構(gòu)對(duì)象管理器),CMMDS(集群成員監(jiān)視和目錄服務(wù))。
更形象一點(diǎn)的描述,CLOM可以理解為架構(gòu)師,DOM是承包商,LSOM則是Worker,最后的CMMDS為項(xiàng)目經(jīng)理。
CLOM and Its Role: Architect
CLOM會(huì)根據(jù)創(chuàng)建的存儲(chǔ)策略決定對(duì)象是否能基于策略被創(chuàng)建出來(lái),即策略會(huì)不會(huì)生效。比如副本數(shù)是3,要生成4分拷貝,但是集群中只有3臺(tái)主機(jī),很明顯此時(shí)的策略無(wú)法生效,因?yàn)闆](méi)有充足的主機(jī)提供使用。CLOM還會(huì)檢測(cè)整個(gè)集群范圍內(nèi)主機(jī)的負(fù)載情況,將對(duì)象及其組件分散到不同的主機(jī)上,并且當(dāng)組件出現(xiàn)問(wèn)題要進(jìn)行修復(fù)的時(shí)候?qū)Q定該組件在哪些主機(jī)上重建。
CLOM組件在后臺(tái)有著一個(gè)進(jìn)程,所以一定要保證主機(jī)上的這個(gè)進(jìn)程沒(méi)有出現(xiàn)問(wèn)題。由于該進(jìn)程是運(yùn)行在每個(gè)vSAN的節(jié)點(diǎn)之上,因此可以通過(guò)/etc/init.d/clomd來(lái)查看它的當(dāng)前狀態(tài)。
DOM and Its Role: Contractor
DOM也是運(yùn)行在集群中的每臺(tái)主機(jī)上。DOM會(huì)接收來(lái)自CLOM的指令,并著手實(shí)施,它會(huì)找LSOM來(lái)真正的干活。前面提到的5類(lèi)對(duì)象中都有一個(gè)DOM owner,用來(lái)審核針對(duì)該對(duì)象的IO操作,決定是否能夠執(zhí)行,如果IO操作被允許就由DOM client來(lái)執(zhí)行。
LSOM and Its Role: Worker
實(shí)際的I/O操作會(huì)被DOM分配到LSOM上,由于LSOM會(huì)對(duì)設(shè)備直接進(jìn)行I/O,所以它是運(yùn)行在某個(gè)主機(jī)的內(nèi)核空間中的,而沒(méi)有進(jìn)程。
CMMDS and Its Role: Project Manager
CMMDS能夠告訴我們整個(gè)vSAN集群拓?fù)涞娜埠蛯?duì)象的狀態(tài),包括集群中的服務(wù)器、網(wǎng)絡(luò)、硬盤(pán)設(shè)備,對(duì)象元數(shù)據(jù)信息,新增或刪除主機(jī)等,它還會(huì)定義集群中的三個(gè)角色master、backup、agent,master負(fù)責(zé)管理整個(gè)vSAN集群的業(yè)務(wù),backup是master的備份。
我們簡(jiǎn)單的梳理下這幾個(gè)組件之間的交互,首先由CLOM接到請(qǐng)求創(chuàng)建對(duì)象開(kāi)始,如果根據(jù)策略能創(chuàng)建它就會(huì)將需求發(fā)給DOM,由DOM進(jìn)行組件的創(chuàng)建,DOM決定好要?jiǎng)?chuàng)建哪個(gè)組件之后將需求發(fā)送給LSOM,LSOM跟存儲(chǔ)層(SSD、硬盤(pán))進(jìn)行交互執(zhí)行具體的I/O。另外的CMMDS會(huì)枚舉出整個(gè)集群中的可用資源,以及這些資源的拓?fù)浜涂捎们闆r。
Virtual Machine Creation
虛擬機(jī)創(chuàng)建的時(shí)候,首先vCenter的vpxd進(jìn)程會(huì)和主機(jī)進(jìn)行通信,選擇某個(gè)主機(jī)創(chuàng)建虛擬機(jī)存儲(chǔ)。主機(jī)上的vpxa進(jìn)程接收到vpxd發(fā)出的請(qǐng)求后,CMMDS會(huì)創(chuàng)建策略,主機(jī)根據(jù)策略創(chuàng)建虛擬機(jī)及其關(guān)聯(lián)的vmdk。由于vmdk是對(duì)象,因此要由CLOM根據(jù)策略來(lái)決定是否能創(chuàng)建該對(duì)象及其組件,當(dāng)組件的創(chuàng)建的位置被決定好之后CMMDS會(huì)更新CLOM發(fā)出的組件拓?fù)湫畔ⅰ?/p>
另外主機(jī)上的DOM接收到CLOM發(fā)出的信息后,將創(chuàng)建對(duì)象組件的要求下發(fā)到本地LSOM上,最后LSOM通過(guò)本地存儲(chǔ)來(lái)創(chuàng)建虛擬機(jī)的存儲(chǔ)對(duì)象。
About Object
Home namesace對(duì)象其實(shí)是一個(gè)小的虛擬機(jī)文件夾VMFS文件系統(tǒng),VMDK、Swap、Snapshot deltas、VM memory這4個(gè)對(duì)象對(duì)應(yīng)的是原來(lái)系統(tǒng)中的4個(gè)大文件。
這些對(duì)象不是直接放在硬盤(pán)上,而是分成若干個(gè)組件的形式寫(xiě)入存儲(chǔ),這是為了實(shí)現(xiàn)RAID、性能以及可用性。具體的切分方式和存儲(chǔ)策略相關(guān),比如要實(shí)現(xiàn)RAID 1就將數(shù)據(jù)復(fù)制成兩個(gè)組件來(lái)寫(xiě)(未計(jì)入Witness組件),既實(shí)現(xiàn)RAID 0又實(shí)現(xiàn)RAID 1則要4個(gè)組件。
上圖是RAID 1的組織結(jié)構(gòu),很明顯的看到有兩個(gè)Component組件,細(xì)心的朋友可能發(fā)現(xiàn)了這里還多了個(gè)witness(仲裁組件)。RAID 1的兩個(gè)副本中如果其中之一損壞了,就無(wú)法進(jìn)行讀,因?yàn)榇藭r(shí)不能確定哪個(gè)副本是完好的。Witness的存在正是為了解決這一問(wèn)題,它的投票直接決定了哪個(gè)組件可用。
Componet Count
下面我們結(jié)合具體的例子來(lái)看下不同策略下對(duì)象和組件到底是如何創(chuàng)建的。(以下組件的計(jì)算都不包含witness)
首先是PFTT等于0(容錯(cuò)為0),F(xiàn)TM為RAID 1,條帶為1的情況,此時(shí)的硬盤(pán)會(huì)寫(xiě)1個(gè)組件,因?yàn)橹挥?份拷貝。
PFTT等于1(容錯(cuò)為1),F(xiàn)TM為RAID 1,條帶為1的情況下,硬盤(pán)會(huì)寫(xiě)2個(gè)組件(拷貝為2)。
PFTT等于2(容錯(cuò)為2),F(xiàn)TM為RAID 1,條帶為1的情況下,硬盤(pán)會(huì)寫(xiě)3個(gè)組件。需要注意的是這里的witness會(huì)有兩個(gè)。
PFTT等于1(容錯(cuò)為1),F(xiàn)TM為RAID 1,條帶為2的情況下。因?yàn)檫@里的數(shù)據(jù)有2份拷貝,所以有2個(gè)Mirror,同時(shí)條帶又為2,因此Mirror將會(huì)被拆成兩份。總結(jié)起來(lái)一共有4個(gè)組件。
PFTT等于2(容錯(cuò)為2),F(xiàn)TM為RAID 1,條帶為3的情況下。根據(jù)上面的計(jì)算規(guī)律可以很輕松的計(jì)算出,此時(shí)的組件數(shù)量應(yīng)該為9。
需要提到的是默認(rèn)情況下組件最大為255G,如果某個(gè)VMDK對(duì)象大小超過(guò)255G,就會(huì)被平均拆成多份。
同樣是PFTT等于1(容錯(cuò)為1),F(xiàn)TM為RAID 1,條帶為1的情況。此時(shí)由于硬盤(pán)大小為400G,超過(guò)了默認(rèn)的255G,所以每個(gè)盤(pán)會(huì)被拆分成兩份,每份200G。一共是4個(gè)組件。
這里是PFTT等于0(容錯(cuò)為0),F(xiàn)TM為RAID 1,條帶為1的情況,因?yàn)槭?00G的硬盤(pán),所以要被平均拆分成3份(注:是每個(gè)不超過(guò)255G)。
Object Inaccessibility
虛擬機(jī)無(wú)法啟動(dòng)有各種原因,如果是vSAN存儲(chǔ)問(wèn)題就可能是由于VMDK對(duì)象無(wú)法訪問(wèn)引起的。組件能否使用依賴(lài)于DOM,DOM會(huì)確認(rèn)對(duì)象或組件是在線還是離線,如果是離線就無(wú)法訪問(wèn)。離線原因可能是組件自身發(fā)生損壞,也可能與組件的健康狀態(tài)有關(guān),比如LSOM組件或數(shù)據(jù)出現(xiàn)問(wèn)題。數(shù)據(jù)的問(wèn)題有兩方面的原因,一方面是數(shù)據(jù)本身被破壞,另一方面是數(shù)據(jù)同步有問(wèn)題。所有一定要清楚組件和哪些對(duì)象關(guān)聯(lián),當(dāng)前狀態(tài)如何。
Torubleshooting Methodlogy
Defining the problem
定義問(wèn)題不能僅限于表層的描述,要能夠具體的找出引發(fā)問(wèn)題的關(guān)鍵點(diǎn)。比如有關(guān)資源競(jìng)爭(zhēng)的問(wèn)題,在vSAN集群中ESXi主機(jī)上不僅會(huì)運(yùn)行虛擬機(jī)還會(huì)進(jìn)行硬盤(pán)的I/O,由于主機(jī)是分布式存儲(chǔ)集群的一員,因此除了給虛擬機(jī)提供CPU和內(nèi)存資源之外,還會(huì)額外的消耗資源在硬盤(pán)I/O上。如果I/O特別密集且虛擬機(jī)負(fù)載又高的話,兩者之間就會(huì)產(chǎn)生競(jìng)爭(zhēng)沖突。所以在出現(xiàn)資源競(jìng)爭(zhēng)問(wèn)題的時(shí)候,需要先看下CPU和內(nèi)存的使用率是否過(guò)高。
要想解決問(wèn)題,首先應(yīng)盡可能的收集額外的詳細(xì)信息。在遇到任何問(wèn)題時(shí)候,第一舉措就是保護(hù)好現(xiàn)場(chǎng),比如拍照或截屏,因?yàn)橛行┨崾究赡軙?huì)一閃而過(guò)不會(huì)再重現(xiàn)。有了這些信息后,再根據(jù)自身掌握的知識(shí)體系結(jié)構(gòu)列出可能原因,然后依次排除。
這里我們對(duì)定義問(wèn)題做更詳細(xì)的描述。首先是問(wèn)題能否重現(xiàn),如果能重現(xiàn)解決起來(lái)就相對(duì)容易。其次是逐漸縮小問(wèn)題范圍,從集群到主機(jī)再到組件依次排查。另外在問(wèn)題出現(xiàn)之前是否對(duì)系統(tǒng)做過(guò)改動(dòng),通過(guò)日志查看有哪些變動(dòng)。由于VMware的用戶基數(shù)很大,因此我們可以在相關(guān)論壇和官方網(wǎng)站中搜索是否有遇到同樣問(wèn)題的線索。通過(guò)每次新版本發(fā)布的Release Notes,也能判斷問(wèn)題是否由BUG引起。
Identifying the Root Cause
問(wèn)題定義完之后接下來(lái)就要找尋問(wèn)題的原因,根據(jù)現(xiàn)有產(chǎn)品中環(huán)境的狀態(tài)進(jìn)行判斷,比如檢查當(dāng)前集群、對(duì)象和組件的健康狀態(tài),硬盤(pán)以及虛擬機(jī)關(guān)聯(lián)對(duì)象是否存在問(wèn)題等。上圖就是vSAN集群的健康狀態(tài)監(jiān)控,直觀的展示了當(dāng)前集群的各種情況。
除了圖形界面外,還可以通過(guò)一些vSAN的命令或腳本在控制臺(tái)中查看當(dāng)前狀態(tài)。
Resolving the problem
最后要做的是構(gòu)造解決方案,下面通過(guò)一些具體的例子來(lái)描述。比如主機(jī)進(jìn)入維護(hù)模式造成虛擬機(jī)不可用,一般在有多份拷貝的情況下進(jìn)入維護(hù)模式并無(wú)太大影響,但只有兩份拷貝的時(shí)候,如果其中一個(gè)副本已損壞,另一個(gè)正常的副本卻進(jìn)入了維護(hù)模式,那么在退出維護(hù)模式的時(shí)候這兩份數(shù)據(jù)副本就都不是最新?tīng)顟B(tài)。所以在進(jìn)維護(hù)模式之前一定要運(yùn)行vsan.check_state腳本檢查對(duì)象的所有組件是否健康正常。
虛擬機(jī)I/O出錯(cuò)很有可能是由于其相關(guān)的組件有問(wèn)題,可以通過(guò)vsan.vm_object_info腳本來(lái)檢查對(duì)象信息,它會(huì)顯示出對(duì)象具體存在的問(wèn)題并進(jìn)行修復(fù)。也有可能是主機(jī)進(jìn)入維護(hù)模式引起的,這時(shí)可以退出維護(hù)模式以進(jìn)行修復(fù)。
性能問(wèn)題同樣值得關(guān)注,比如磁盤(pán)組離線導(dǎo)致虛擬機(jī)出錯(cuò)。一般性能出問(wèn)題,有可能是CPU和內(nèi)存性能不夠也有可能與驅(qū)動(dòng)器有關(guān),硬盤(pán)是否兼容也要考慮到。
為防止DataStore空間耗盡,在它達(dá)到70%臨界值的時(shí)候,就該計(jì)劃擴(kuò)容分配加主機(jī)、磁盤(pán)組或硬盤(pán)。
Troubleshooting Tools
ESXICLI Commands
上圖列出是與esxcli相關(guān)的一些命令,可以在主機(jī)本地shell或者通過(guò)ssh遠(yuǎn)程連接到主機(jī)使用。這些命令并不需要強(qiáng)記,只要輸入esxcli就會(huì)列出后續(xù)的子命令列表,如下圖是使用esxcli storage后的幫助列表。
Useful Log Files
日志文件是最常用的輔助手段之一,推薦大家關(guān)注vobd.log、vmkernerl.log、vmkwarning.log、clomd.log這個(gè)四個(gè)日志文件。這些日志文件可以配合python腳本來(lái)使用。
上圖的vsanDiskFaultInjection.pyc腳本是用來(lái)模擬vSAN集群出現(xiàn)問(wèn)題后的情況,通過(guò) —help列出相關(guān)的幫助信息,比如 -u是模擬硬盤(pán)的熱拔出。
這是具體的執(zhí)行命令,-d指明了要拔出的設(shè)備。
命令執(zhí)行完之后在日志中就展示出了錯(cuò)誤信息。
設(shè)備重新上線后,日志中的信息會(huì)進(jìn)行更新,可以看到下方已經(jīng)顯示online了。
ESXCLI Namespaces in vSAN
最后我們通過(guò)一個(gè)具體的例子來(lái)演示下如何使用esxcli相關(guān)的命令。假如集群中的某臺(tái)服務(wù)器的系統(tǒng)損壞,但是硬盤(pán)沒(méi)有問(wèn)題還保存著vSAN的數(shù)據(jù),這時(shí)我們要做的是對(duì)系統(tǒng)進(jìn)行重裝,重新加入到vSAN集群中。那么如何加入呢,其實(shí)可以通過(guò)esxcli vsan命令來(lái)完成。
在vSAN集群的其他正常主機(jī)上運(yùn)行 esxcli vsan cluster get命令得到當(dāng)前集群的信息,這里有一個(gè)關(guān)鍵的條目——集群的UUID(圖中紅色標(biāo)識(shí)的)。
獲取到UUID之后,就可以在新裝主機(jī)上執(zhí)行esxcli vsan cluster join -u “UUID”命令加入到集群中,然后在當(dāng)前主機(jī)上使用esxcli vsan cluster get就會(huì)看到它已經(jīng)正常加入到集群中了。
以上為今天的全部分享內(nèi)容,謝謝大家!