概述

Xapi是Xen Server中的一組管理介面的統稱,是Xen Server管理的核心,由一系列的toolstack組成。

Xapi主要提供各客戶端以及Pool中各主機通信的介面。 客戶端可以通過Xapi來讀取Xen Server的配置、管理、License的管理、資料庫的維護等等,同時也包括如存儲、虛機、虛擬網卡、HA等資源的功能管理及控制。Xapi介面必須保持向後兼容,允許較老版本的客戶端可以正常工作。

其具有代表性的客戶端有XenCenter、 Xen Orchestra、Openstack 和 CloudStack 等。

運行環境

在Xen中最基礎的概念是資源池(Pool)--整體集羣作為單個實體進行管理。即使單個Xen Host的非集羣環境,Xapi對資源對象的管理也是通過Pool 來完成的。Xapi運行在主機集羣中,他們共享著部分存儲集羣。這部分共享存儲也是建立高可用集羣(HA)的前提保證。下圖展示的是運行著Xapi的主機集羣環境。

在任何時候,最多隻有一個主機可以被稱為Pool Mater,它用來負責協調和鎖定資源池的資源。首次創建Pool時,需要指定一臺機器為Pool Master,這臺機器則稱為 Master Host(主節點),其他節點我們可以稱之為Slave Host(從節點)。Pool Master角色也並非一成不變的。我們可以通過XenCenter等客戶端手動調整 Master Host節點;也可配置HA的集羣通過Xen自身的HA機制在Master Host宕機時,自動選舉新的節點為Master Host。

所有主機都會提供兩種協議的介面,一個是使用80埠的HTTP和XML/RPC協議介面以及使用443埠的TLS/SSL協議介面。雖然存在著這兩種介面協議,但並不是所有主機都能夠通過Xapi來下發操作請求的,在集羣中僅Master Host具有著接受Xapi操作請求的許可權。如若嘗試將控制操作的請求發送到另一臺Slave Host的機器,將導致XenAPI重定向返回一個錯誤消息,該錯誤消息包含有這臺機器所處集羣的Master Host的地址,以及詳細錯誤提示。

作為 Pool Master除了上文提及配置HA後的自動遷移還會以有序的方式處理或轉發用戶請求(xe pool-designate-new-master)以及處理或轉發在緊急情況下的用戶請求(xe pool-emergency-transition-to-master)。

Slave Host節點並不是完全不能接受任何操作。為了提高效率,在Slave Host上允許進行以下操作:

  • 查詢性能計數器(及其歷史記錄)
  • 連接到VNC控制檯
  • 導入/導出(特別是當磁碟在本地存儲上時)

由於Master Host充當協調器和鎖定管理器的角色,因此其他主機通常會與Master Host通信。Slave Host也會相互通信(通過相同的HTTP和XMLRPC通道)來完成以下功能

  • 傳輸VM內存映像(VM遷移)
  • 鏡像磁碟(存儲遷移)

要注意的是,某些類型的共享存儲(特別是所有使用vhd的存儲)需要協調磁碟GC和合併。這種協調目前由Xapi完成,因此不可能在資源池之間共享這種存儲。

工具集/toolstack

Xapi工具集需要主機在x86或ARM上運行Xen 4.4或更高版本。Xen管理程序將主機劃分為多個域(Domain),其中一些域可以具有特權硬體訪問許可權,其餘部分是非特權客戶機(DomainU)。xapi工具堆棧通常在特權初始域Domain 0中運行其所有組件,也稱為「控制域」。然而,有一些實驗代碼支持「驅動域(driver domains)」,允許存儲和網路驅動程序在其各自的域中隔離。

下圖顯示了在單主機上運行Xen Server的情況。在一個集羣環境中所有主機都運行相同版本的Xen Server,除非Xen Server正處於版本迭代期間則不一定是完全相同的軟體版本。

工具集包含有一組協作守護程序,它們構建在所有Xen主機通用的基本集之上。他們主要包含有:

  • Xapi:管理主機羣集,協調對共享存儲和網路的訪問。
  • Xenopsd:一個低級「域管理器」,負責通過libxc和libxl與Xen交互來創建、掛起、恢復、遷移、重新引導域。
  • Xcp-rrdd:一個性能計數器監視守護程序,它聚合通過插件API定義的「數據源」並記錄每個守護程序的歷史記錄。
  • Xcp-networkd:主機網路管理器,負責配置介面,網橋和OpenVSwitch實例
  • SM:Storage Manager插件,用於將Xapi的內部存儲介面連接到外部存儲系統的控制API。
  • perfmon:監視性能計數器的守護程序,如果值超過某個預定義的閾值,則發送「警報」。
  • mpathalert:監視「存儲路徑」的守護程序,如果路徑出現故障並需要修復則發送「警報」。
  • snapwatchd:一個守護進程,它響應通過guest 虛擬機VSS代理(對於Windows)發送的快照請求。
  • stunnel:一個守護程序,它解碼TLS / SSL並將流量轉發到Xapi。
  • xenconsoled:允許訪問客戶機控制檯。這對所有Xen主機都是通用的。
  • xenstored:用於連接VM磁碟和網路介面的鍵值對配置資料庫。這對所有主機也很常見。

工作機制

Xapi分為以下類別:

  • master-only:這些是當前主要的API請求類型。客戶端API請求Master節點,Master節點轉發請求到相應的機器並鎖定相應資源。
  • normal-local:這些是對性能有著特殊要求的情況,允許從節點去調用的API。例如磁碟導入/導出和控制檯連接等,它們直接發送到對數據到相關主機,不必經過Master節點的轉發。

· emergency:是處理Master Host離線這種緊急情況下使用的API請求類型。

主機在接受到API請求後,先判斷本機可以接受該類型的請求,如果可以執行,API調用就會進入「消息轉發」層。

消息轉發層將會

  • 鎖定資源(通過current_operations機制實現)
  • 選擇需要執行請求的主機

如果請求應在本地運行,則使用直接函數調用; 否則,消息轉發代碼會對特定的Slave Host進行同步API調用。需注意的是Xapi目前使用「thread per request」(一個線程處理一個請求)模型,該模型會為每個請求創建一個完整的POSIX線程。即使僅轉發請求,這個線程仍然會被創建,並會一直阻塞直至相關Slave Host返回結果。

如果XenAPI請求內容是VM生命週期相關的操作,它將轉換為Xenopsd API調用並通過Unix域套接字進行轉發。Xapi和Xenopsd都有類似的task的概念,當前的Xapi task(所有操作在task的上下文中運行)會被綁定到Xenopsd task上,之後Xapi還會用來傳遞取消操作和更新task進度。

如果XenAPI請求內容為存儲操作,則將消息轉發至「存儲訪問」層。存儲訪問層需

  • 驗證存儲對象是否處於正確狀態(驗證SR掛載狀態;VDI掛載、激活 以及VDI是否具有讀寫許可權)
  • 調用Storage Manager API(SMAPI)v2介面中的相關操作
  • 使用SMAPIv2到SMAPIv1轉換器生成必要的命令行來與SMAPIv1插件(EXT,NFS,LVM等)通信並執行
  • 將存儲對象的狀態(包括VDI.attach調用的結果)持久化

在內部,smapiv1插件通過對xapi資料庫的特權訪問來直接設置欄位(例如VDI.virtual_size),這些欄位將被視為對其他客戶端是隻讀的。SMAPIv1插件也依賴於Xapi

  • 瞭解可能訪問存儲的所有主機
  • 鎖定資源池中的磁碟
  • 通過「Xapi插件」機制在其他主機上安全地執行代碼

Xapi資料庫包含主機和VM的元數據,並共享給整個Pool。Master Host會在內存中緩存一份副本,所有其他節點在使用時會查詢Master Host中緩存的數據。資料庫將每個對象都會有一個事件計數器,生成計數器用於實現XenAPI中event.next和event.from的相關操作。如果啟用了「redo-log」, 那麼所有資料庫寫入操作都會以增量的形式同步寫入共享塊設備。如果不使用redo-log」在刷新之前取消Xapi則可能會丟失最近的更新。

總結

Xapi為程序開發者提供一個靈活,穩定,方便,快捷的Xen Server管理介面,使得用戶可以根據自身需求進行量身定製。但是由於使用「thread per request」模式會給Master Host帶來較大的資源開銷,使用時可盡量合併請求操作,減少並發數量,來降低Xapi對Master節點資源消耗。

·


推薦閱讀:
相關文章