現在,無論是傳統 IT 還是互聯網行業,云平臺似乎越來越受到關注和認可。在通常的 IAAS 平臺中,虛擬化技術和相應的平臺管理工具(API)是主要技術點,而虛擬化實現實際上決定這個云平臺的擴展和利用能力,幾乎決定了 IAAS 平臺的能力和競爭力。
虛擬化是一個既熟悉又復雜的詞匯,在很大一部分場所指的是利用物理機的資源(計算,存儲,網絡)為眾多虛擬機提供相應的隔離資源,比如成熟的單機虛擬化工具 KVM 和 Xen。而實際上虛擬化有時候會泛指資源的池化,如一個集群的所有資源都是可以調度利用并提供能力的,特別是指存儲資源的虛擬化,往往傾向于一個集群機器的存儲資源的整合利用。
在談到單機虛擬化與集群虛擬化的時候,計算資源虛擬化往往比存儲虛擬化更容易理解,我們在談及存儲虛擬化的時候可以以前者為例。
大家都已經習慣單機虛擬化的使用,如使用 VirtualBox 可以隨意創建出虛擬機,虛擬快設備和虛擬網絡。而為了彌補性能問題,硬件提供了相應的虛擬化指令幫助更好的切換 Host/VM 運行態和更快的內存訪問。這種虛擬化滿足用戶應用多樣化的需要,提高了資源的利用率,但是當用戶希望能利用一群機器資源池子化來創建一個更強大能力的單一運行環境時,Hadoop 和 Spark 部分滿足了這個需求,它跟一個理想中巨大”VM”的區別就是運行環境 API 的差異。理想化的集群虛擬化可能是一個 Nginx 服務器無縫的在一個集群“VM”上運行,一個 fork 調用會跑到不同的機器運行,這可能就需要一個分布式“內核”去搞定(一個學術項目在做這件事)。
不過這個兼容 Posix 標準的 VM 未必就是合理的,如果串行編程之于并行編程,在程序設計思路和實現上會有巨大鴻溝,那么分布式編程如果還能直接使用 Posix 標準,那么想必也絕不是直接拿并行編程的那一套就可以,假設具備一個龐大的支持 Posix 標準的 VM,那么程序設計反而需要向 Mapreduce 靠攏,數據更多考慮分片化,減少避免鎖和同步,盡量減少中間結果。那么最后既然在分布式編程需要向 Mapreduce 上靠,這個支持 Posix 的容器可能也沒有想象的重要。
存儲虛擬化
花了這么多時間講計算資源虛擬化和 Posix 標準的關系就是為了鋪墊存儲虛擬化,先考慮單機存儲虛擬化,就是在 Host 機器分配一個文件,一個虛擬塊設備(LVM)或者一個物理設備到 VM,通過全模擬的 Qemu 或者 KVM 來幫助實現從 VM 到設備的訪問。相應的,當用戶希望能自由組合和利用多個機器上的存儲資源時,集群的存儲虛擬化就是需要的。與計算資源不同的是,依賴于網絡的存儲資源更具備可能性,本質原因是存儲資源與計算相比是個慢得多的設備。因此,網絡并不會為節點間存儲資源傳輸增添太多的負荷,原來的程序設計也不需要像計算資源一樣過多考慮局部性的問題。
圖片來自SNIA Technical Tutorial
因此,與計算資源虛擬化概念不太一樣的是,大多時候,存儲虛擬化更多的會是集群所有存儲資源的池子化,通常提供存儲虛擬化能力的是軟件,通過溝通多個網絡連接的存儲設備來提供一致性的數據服務。任何一個技術都是為了解決一些問題才是有價值的,存儲虛擬化它作為一個技術提供了解決一些問題的新方法,而這些問題中最顯著改善的就是整個存儲基礎設施的管理。我們都知道因為存儲服務固有的“慢”,從數據訪問到真正存儲的介質之間塞進去各種虛擬、優化、緩存層,這些層次構成的復雜性實際上已經成為存儲系統高可用的障礙,而存儲虛擬化也被寄希望于解決這些問題:
單點失敗問題: 無論是陣列,SAN或者是中間的網絡設備都會成為問題
QoS問題: 實際上維護和持久保證一個SAN或者存儲系統的性能是非常困難的,而虛擬化提供了實時“管理”性能的可能性
在存儲系統中的數據是任何用戶業務的關鍵,任何數據的丟失或者一段時間不可用都是災難性事件,虛擬化提供了可用性的方案而不是需要昂貴的高端存儲
低效的空間利用: 實際上用戶業務增加的數據往往需要新的存儲設備提供,而舊設備往往在不斷新設備的提供后慢慢降低了空間利用率,加上困難的數據管理操作,用戶的存儲系統很容易隨著時間使得利用率大幅下降
存儲虛擬化技術為了解決上述問題,需要顯著減少存儲系統的管理難度(通過將管理物理設備轉換為管理虛擬設備),減少 down-time,增加新舊設備的空間利用和彈性使用,抽象存儲設備的特性。這些能力使得虛擬化實現具備以下基本能力:
地址空間的重新映射
IO 重定向
提供復制分發
磁盤資源和資源池元信息的管理
通常我們把這部分特性分為三個層次,分別是協議層,地址轉換層和數據存儲層。協議層提供網絡路由的高可用,地址轉換層保證存儲資源的高可用,數據存儲層保證存儲資源的持久性。而數據存儲層的抽象化往往會根據虛擬化實現本身會存在多個層次,如磁盤虛擬化,文件系統虛擬化,塊設備虛擬化等等。
以開源的塊存儲解決方法 Ceph 為例,Ceph 的客戶端依賴多個元信息服務器提供的智能理由能力,承擔起地址轉換的角色,根據請求的地址參數請求相應的后端 OSD,OSD 將塊設備視為一個帶權重和屬性的存儲對象來提供數據存儲資源的持久性和均衡性,這個持久性可以是復制或者是擦除碼分發。再比如一個 Strata 提供的高性能分布式存儲,由 SDN 協議實現的到 Virtual NFS Server 的網絡路由高可用,由改進的 NFS Server 提供數據的高可用。
此外,由于虛擬化本身的抽象存儲能力,虛擬化實現本身可以看成是眾多存儲設備的大腦,往往基于一些用戶輸入和定義規則能擴展出更加誘人的特性,比如分層存儲,快照,災備。
總而言之,存儲虛擬化是為了提高空間利用率,降低成本,提供理想化的資源(空間和IO能力)自由分配和組合的可能性,并且向用戶呈現的是數據而不是它的物理存儲位置及存儲方式,同時減小了對存儲硬件資源的綁定(增加了異構存儲設備整合能力),將更多特性放在了虛擬化實現上。當然,與原生的設備訪問相比,性能上損耗和保證能力的損失是存在的,這部分掌控取決于存儲虛擬化的實現,同時存儲虛擬化技術是否能發揮這些功效的程度取決于其完整性及在核心數據管理體系結構中的集成度。
軟件定義存儲
軟件定義存儲(Software defined Storage)實際上是另一個火熱概念,通常情況下它與虛擬化密切聯系并出現。但是軟件定義存儲實際上存在更大的適用范圍,它的目標是從存儲硬件中分離出存儲功能和服務并提供編程接口,如 OpenStack Cinder, EMC ViPR, Nexenta 和 HP StoreVirtual 都是這個范疇。
再具體一點,軟件定義存儲是把存儲硬件或軟件提供的控制能力抽象出來,并與數據層面的能力(數據訪問)分開,這些控制能力包括卷管理,RAID,QoS,數據復制,監控,快照和備份等等,這個舉動意義在于這些控制能力抽象出來以后,任何廠商提供的存儲能力控制都是接近的,避免對廠商的綁定。這些作用很容易與以前提到的 Storage Hypervisor 聯系起來,只不過它們在不同時期的環境下提出和定義。然后它通過這些控制能力進一步為管理員提供自定義、基于策略的虛擬存儲層,這些策略可以是基于空間、性能、費用等等因素。它的優勢在于與存儲虛擬化相比更加輕量,通常可以保留底層存儲系統如SAN,陣列的特性并仍然發揮作用,而且部署和實現難度都大幅度下降,可以采用更小的代價實現管理存儲基礎設施的能力。
那么在這里更期望用一些例子來闡述存儲虛擬化與軟件定義存儲的交集和聯系。OpenStack Cinder 是一個典型的軟件定義存儲產品,它目前支持大量的存儲廠商設備,它定義了一些卷管理,快照,備份,簡單統計等特性,用戶可以使用 Cinder 提供的接口來獲得不同存儲設備提供的相似能力。而 Ceph 可以看作一個典型的存儲虛擬化產品,它將大量的通用存儲設備聯合起來提供一個存儲池,并實現了一般存儲廠商產品的能力。而 Ceph 的塊存儲能力使得它成為了 Cinder 的一個 Driver。同時,Cinder 通過了這些基本 API 進行擴展,可以定義出不同的存儲池,智能化的存儲區域等等。
但是 EMC 的 ViPR 作為一個典型的軟件定義存儲產品仍然提供了數據訪問層的能力,它的 Object Data Service 可以支持對象存儲接口(S3, Swift)和 HDFS 接口。
因此分割存儲虛擬化與軟件定義存儲的關系是不現實的,在一般環境下,往往將軟件定義存儲視為偏管理數據的軟件,將存儲虛擬化視為處理數據訪問的實現,兩者往往會在自身基礎上向對方的功能或者特性上發展。
參考
ViPR 軟件定義的存儲 – EMC(http://china.emc.com/data-center-management/vipr/index.htm)
HITACHI STORAGE VIRTUALIZATION(http://www.hds.com/solutions/it-strategies/storage-virtualization/)
Storage Virtualization: The SNIA Technical Tutorial(https://www.snia.org/education/storage_networking_primer/stor_virt)
storage virtualization(http://searchstorage.techtarget.com/definition/storage-virtualization)