概述
Xapi是Xen Server中的一組管理接口的統(tǒng)稱,是Xen Server管理的核心,由一系列的toolstack組成。
Xapi主要提供各客戶端以及Pool中各主機(jī)通信的接口。 客戶端可以通過Xapi來讀取Xen Server的配置、管理、License的管理、數(shù)據(jù)庫的維護(hù)等等,同時也包括如存儲、虛機(jī)、虛擬網(wǎng)卡、HA等資源的功能管理及控制。Xapi接口必須保持向后兼容,允許較老版本的客戶端可以正常工作。
其具有代表性的客戶端有XenCenter、Xen Orchestra、Openstack 和CloudStack 等。
基礎(chǔ)概念
在Xen中最基礎(chǔ)的概念是資源池(Pool)--整體集群作為單個實體進(jìn)行管理。即使單個Xen Host的非集群環(huán)境,Xapi對資源對象的管理也是通過Pool 來完成的。Xapi運(yùn)行在主機(jī)集群中,他們共享著部分存儲集群。這部分共享存儲也是建立高可用集群(HA)的前提保證。下圖展示的是運(yùn)行著Xapi的主機(jī)集群環(huán)境。
在任何時候,最多只有一個主機(jī)可以被稱為Pool Mater,它用來負(fù)責(zé)協(xié)調(diào)和鎖定資源池的資源。首次創(chuàng)建Pool時,需要指定一臺機(jī)器為Pool Master,這臺機(jī)器則稱為Master Host(主節(jié)點),其他節(jié)點我們可以稱之為Slave Host(從節(jié)點)。Pool Master角色也并非一成不變的。我們可以通過XenCenter等客戶端手動調(diào)整Master Host節(jié)點;也可配置HA的集群通過Xen自身的HA機(jī)制在Master Host宕機(jī)時,自動選舉新的節(jié)點為Master Host。
所有主機(jī)都會提供兩種協(xié)議的接口,一個是使用80端口的HTTP和XML/RPC協(xié)議接口以及使用443端口的TLS/SSL協(xié)議接口。雖然存在著這兩種接口協(xié)議,但并不是所有主機(jī)都能夠通過Xapi來下發(fā)操作請求的,在集群中僅Master Host具有著接受Xapi操作請求的權(quán)限。
如若嘗試將控制操作的請求發(fā)送到另一臺Slave Host的機(jī)器,將導(dǎo)致XenAPI重定向返回一個錯誤消息,該錯誤消息包含有這臺機(jī)器所處集群的Master Host的地址,以及詳細(xì)錯誤提示。
作為Pool Master除了上文提及配置HA后的自動遷移還會以有序的方式處理或轉(zhuǎn)發(fā)用戶請求(xe pool-designate-new-master)以及處理或轉(zhuǎn)發(fā)在緊急情況下的用戶請求(xe pool-emergency-transition-to-master)。
Slave Host節(jié)點并不是完全不能接受任何操作。為了提高效率,在Slave Host上允許進(jìn)行以下操作:
查詢性能計數(shù)器(及其歷史記錄)
連接到VNC控制臺
導(dǎo)入/導(dǎo)出(特別是當(dāng)磁盤在本地存儲上時)
由于Master Host充當(dāng)協(xié)調(diào)器和鎖定管理器的角色,因此其他主機(jī)通常會與Master Host通信。Slave Host也會相互通信(通過相同的HTTP和XMLRPC通道)來完成以下功能
傳輸VM內(nèi)存映像(VM遷移)
鏡像磁盤(存儲遷移)
要注意的是,某些類型的共享存儲(特別是所有使用vhd的存儲)需要協(xié)調(diào)磁盤GC和合并。這種協(xié)調(diào)目前由Xapi完成,因此不可能在資源池之間共享這種存儲。
工具集/toolstack
Xapi工具集需要主機(jī)在x86或ARM上運(yùn)行Xen 4.4或更高版本。Xen管理程序?qū)⒅鳈C(jī)劃分為多個域(Domain),其中一些域可以具有特權(quán)硬件訪問權(quán)限,其余部分是非特權(quán)客戶機(jī)(DomainU)。xapi工具堆棧通常在特權(quán)初始域Domain 0中運(yùn)行其所有組件,也稱為“控制域”。然而,有一些實驗代碼支持“驅(qū)動域(driver domains)”,允許存儲和網(wǎng)絡(luò)驅(qū)動程序在其各自的域中隔離。
下圖顯示了在單主機(jī)上運(yùn)行Xen Server的情況。在一個集群環(huán)境中所有主機(jī)都運(yùn)行相同版本的Xen Server,除非Xen Server正處于版本迭代期間則不一定是完全相同的軟件版本。
工具集包含有一組協(xié)作守護(hù)程序,它們構(gòu)建在所有Xen主機(jī)通用的基本集之上。他們主要包含有:
Xapi:管理主機(jī)群集,協(xié)調(diào)對共享存儲和網(wǎng)絡(luò)的訪問。
Xenopsd:一個低級“域管理器”,負(fù)責(zé)通過libxc和libxl與Xen交互來創(chuàng)建、掛起、恢復(fù)、遷移、重新引導(dǎo)域。
Xcp-rrdd:一個性能計數(shù)器監(jiān)視守護(hù)程序,它聚合通過插件API定義的“數(shù)據(jù)源”并記錄每個守護(hù)程序的歷史記錄。
Xcp-networkd:主機(jī)網(wǎng)絡(luò)管理器,負(fù)責(zé)配置接口,網(wǎng)橋和OpenVSwitch實例
SM:Storage Manager插件,用于將Xapi的內(nèi)部存儲接口連接到外部存儲系統(tǒng)的控制API。
perfmon:監(jiān)視性能計數(shù)器的守護(hù)程序,如果值超過某個預(yù)定義的閾值,則發(fā)送“警報”。
mpathalert:監(jiān)視“存儲路徑”的守護(hù)程序,如果路徑出現(xiàn)故障并需要修復(fù)則發(fā)送“警報”。
snapwatchd:一個守護(hù)進(jìn)程,它響應(yīng)通過guest 虛擬機(jī)VSS代理(對于Windows)發(fā)送的快照請求。
stunnel:一個守護(hù)程序,它解碼TLS / SSL并將流量轉(zhuǎn)發(fā)到Xapi。
xenconsoled:允許訪問客戶機(jī)控制臺。這對所有Xen主機(jī)都是通用的。
xenstored:用于連接VM磁盤和網(wǎng)絡(luò)接口的鍵值對配置數(shù)據(jù)庫。這對所有主機(jī)也很常見。
工作機(jī)制
Xapi分為以下類別:
master-only:這些是當(dāng)前主要的API請求類型。客戶端API請求Master節(jié)點,Master節(jié)點轉(zhuǎn)發(fā)請求到相應(yīng)的機(jī)器并鎖定相應(yīng)資源。
normal-local:這些是對性能有著特殊要求的情況,允許從節(jié)點去調(diào)用的API。例如磁盤導(dǎo)入/導(dǎo)出和控制臺連接等,它們直接發(fā)送到對數(shù)據(jù)到相關(guān)主機(jī),不必經(jīng)過Master節(jié)點的轉(zhuǎn)發(fā)。
emergency:是處理Master Host離線這種緊急情況下使用的API請求類型。
主機(jī)在接受到API請求后,先判斷本機(jī)可以接受該類型的請求,如果可以執(zhí)行,API調(diào)用就會進(jìn)入“消息轉(zhuǎn)發(fā)”層。消息轉(zhuǎn)發(fā)層將會:
鎖定資源(通過current_operations機(jī)制實現(xiàn))
選擇需要執(zhí)行請求的主機(jī)
如果請求應(yīng)在本地運(yùn)行,則使用直接函數(shù)調(diào)用; 否則,消息轉(zhuǎn)發(fā)代碼會對特定的Slave Host進(jìn)行同步API調(diào)用。需注意的是Xapi目前使用“thread per request”(一個線程處理一個請求)模型,該模型會為每個請求創(chuàng)建一個完整的POSIX線程。即使僅轉(zhuǎn)發(fā)請求,這個線程仍然會被創(chuàng)建,并會一直阻塞直至相關(guān)Slave Host返回結(jié)果。
如果XenAPI請求內(nèi)容是VM生命周期相關(guān)的操作,它將轉(zhuǎn)換為Xenopsd API調(diào)用并通過Unix域套接字進(jìn)行轉(zhuǎn)發(fā)。Xapi和Xenopsd都有類似的task的概念,當(dāng)前的Xapi task(所有操作在task的上下文中運(yùn)行)會被綁定到Xenopsd task上,之后Xapi還會用來傳遞取消操作和更新task進(jìn)度。
如果XenAPI請求內(nèi)容為存儲操作,則將消息轉(zhuǎn)發(fā)至“存儲訪問”層。存儲訪問層需:
驗證存儲對象是否處于正確狀態(tài)(驗證SR掛載狀態(tài);VDI掛載、激活 以及VDI是否具有讀寫權(quán)限)
調(diào)用Storage Manager API(SMAPI)v2接口中的相關(guān)操作
使用SMAPIv2到SMAPIv1轉(zhuǎn)換器生成必要的命令行來與SMAPIv1插件(EXT,NFS,LVM等)通信并執(zhí)行
將存儲對象的狀態(tài)(包括VDI.a(chǎn)ttach調(diào)用的結(jié)果)持久化
在內(nèi)部,smapiv1插件通過對xapi數(shù)據(jù)庫的特權(quán)訪問來直接設(shè)置字段(例如VDI.virtual_size),這些字段將被視為對其他客戶端是只讀的。SMAPIv1插件也依賴于Xapi
了解可能訪問存儲的所有主機(jī)
鎖定資源池中的磁盤
通過“Xapi插件”機(jī)制在其他主機(jī)上安全地執(zhí)行代碼
Xapi數(shù)據(jù)庫包含主機(jī)和VM的元數(shù)據(jù),并共享給整個Pool。Master Host會在內(nèi)存中緩存一份副本,所有其他節(jié)點在使用時會查詢Master Host中緩存的數(shù)據(jù)。數(shù)據(jù)庫將每個對象都會有一個事件計數(shù)器,生成計數(shù)器用于實現(xiàn)XenAPI中event.next和event.from的相關(guān)操作。如果啟用了“redo-log”, 那么所有數(shù)據(jù)庫寫入操作都會以增量的形式同步寫入共享塊設(shè)備。如果不使用redo-log”在刷新之前取消Xapi則可能會丟失最近的更新。
總結(jié)
Xapi為程序開發(fā)者提供一個靈活,穩(wěn)定,方便,快捷的Xen Server管理接口,使得用戶可以根據(jù)自身需求進(jìn)行量身定制。但是由于使用“thread per request”模式會給Master Host帶來較大的資源開銷,使用時可盡量合并請求操作,減少并發(fā)數(shù)量,來降低Xapi對Master節(jié)點資源消耗。
評論
查看更多