來自存儲老吳的博客——存儲之道node
存儲虛擬化技術其實不是一個特別新的東西,在很早之前就有了存儲虛擬化技術。存儲技術發展到今天,虛擬化技術在SSD、RAID、Volume、Scaleout等各個方面都發揮了巨大的做用。記得在2006年的時候,咱們實驗室作了一個很是宏大的項目叫VSDS,這個項目就是一個典型的存儲虛擬化項目。算法
在這個項目中,採用了大量的存儲虛擬化技術。首先將磁盤進行虛擬化,經過池化的方式對全部磁盤存儲資源進行管理,而後再將磁盤存儲池中的資源分配給系統中的邏輯卷。這樣就實現了邏輯卷資源的動態分配。這個概念在當時是很是前衛的,和LVM卷管理系統有着大相徑庭的存儲資源管理效果。在一個存儲節點中會建立不少邏輯卷,多個存儲節點中的邏輯卷資源在系統層級別再次造成一個分佈式的存儲池,該分佈式存儲池中的資源再動態分配給用戶可見的存儲卷。因此,VSDS本質上是一個分佈式的集羣SAN系統,在節點內部的卷級以及節點之間都採用了存儲虛擬化技術。在當年這套系統所採用的技術是很是前沿的,即便在今天看來也是很是有價值的一套分佈式SAN存儲系統。後端
存儲虛擬化技術是你們常常說起的東西,那到底在存儲系統中,該技術會出如今哪些層面,而且會封裝成什麼用戶特性?用戶又是從該類技術中如何受益的呢?存儲老吳給你們剖析一下磁盤存儲系統中的存儲虛擬化技術,不到之處敬請指出。服務器
從整個存儲系統的層次結構來看(以下圖所示),存儲虛擬化技術一般分紅以下三大類:架構
1, 系統級虛擬化技術。這種技術咱們也能夠稱之爲節點間的虛擬化技術或稱之爲SAN級虛擬化技術,經過該類技術能夠實現分佈式存儲。併發
2, 卷級虛擬化技術。這類技術主要在卷管理層面上使用虛擬化技術,解決卷管理方面的問題。分佈式
3, 底層虛擬化技術。主要在RAID數據保護層使用虛擬化技術,解決傳統RAID數據可靠性、數據重構等方面的問題ide
咱們首先談談底層虛擬化技術。底層虛擬化技術使用時間並非很長,也就在2012先後,不少存儲廠商開始發佈採用這種技術作成的數據保護系統,用來替代傳統RAID,解決傳統RAID在數據重構過程當中時間過長的問題。採用這種技術的廠商有NetApp的DDP系統、華爲的RAID2.0等。將存儲虛擬化技術引入到RAID系統中,最核心的一個想法是打破傳統RAID數據佈局上整齊劃一的特性,從而能夠破解數據重構過程當中讀寫性能的瓶頸點問題。佈局
底層虛擬化技術在應用的過程當中,解決了RAID所面臨的一些問題,但同時也引入了其餘不少問題,例如,虛擬化過程當中資源分配是存在侷限的,在同一個數據保護域內的數據不能被分配到相同的磁盤上。因爲這個侷限性,就會致使在存儲資源不平衡前提下,即便存在存儲資源都沒法實現分配的狀況。因此,當資源不平衡的時候,須要經過數據遷移的方式實現資源平衡。因此,底層虛擬化技術引入的數據遷移會致使應用性能降低。性能
另外一個比較重要的問題是虛擬化技術致使磁盤抖動,從而當磁盤數量較少狀況下,數據重構性能反而低於傳統RAID的數據重構性能。傳統RAID在數據重構的過程當中,若是沒有應用IO的狀況下,讀寫IO是徹底分離的,所以,全部盤都能運行在最高帶寬模式下。引入底層虛擬化技術以後,在數據重構過程當中,全部盤上都存在讀寫操做,而且讀寫之間地址都是離散的,所以每塊盤都運行在隨機訪問模式下,每塊盤的性能都會變成原來的一半,甚至更低。因此,當磁盤數量不夠多時,這種虛擬化技術所引入的損耗起了主導做用,整體性能低於傳統RAID。下圖引入底層虛擬化技術以後磁盤數據重構性能表現:
從上面的數據咱們能夠看出,當磁盤數量達到必定時,採用底層虛擬化技術以後的數據重構性能會隨着磁盤數量的增長而線性增長(DiskPool曲線)。而採用傳統RAID,其數據重構性能和磁盤的數量是無關的。
整體而言,底層存儲虛擬化技術改造了存儲數據的分佈,提高系統數據保護的能力。但同時該技術的應用也是有條件的,不是在任何狀況下均可以使用的。在華爲的存儲系統中,該類技術被稱之爲RAID2.0,在OceanStore9000集羣NAS系統、OceanStore18000系統中獲得了應用。在國外廠商中,和該類技術相似有IBM GPFS中的Declustered RAID,HP 3PAR存儲系統中的VRAID,NetApp盤陣中所採用的DDP技術都具備相似的結構。因爲底層虛擬化技術核心點是資源分配器,因此雖然這些系統都具有相同的結構,都具備資源池化的能力和思想,可是,資源池中的資源分配器算法各家確定是不相同的,而這種資源分配器算法影響了數據在存儲資源中的分佈,影響到數據重構、應用性能和數據可靠性,是整個系統的核心所在。因此,當看到一個產品中提到採用存儲池技術,就認爲是RAID2.0,那是錯誤的想法。底層虛擬化技術在RAID中應用,已經將RAID技術向卷管理、文件系統方向發展了,RAID技術複雜度提高了。存儲池不是該類技術的本質特徵,只是外在表現,重要的是內部的資源分配器算法及策略。
底層虛擬化技術解決了傳統RAID所遇到的問題。在底層虛擬化技術的上面就是存儲虛擬化技術普遍應用的卷級虛擬化。卷級虛擬化技術會將底層存儲資源進行虛擬化,池化。即將RAID中導出的LUN進行分塊池化。池化以後的資源經過分配策略分配到對應的邏輯卷中。初看起來底層虛擬化技術和卷級虛擬化技術是相同的,都是首先將資源進行池化,造成一個資源塊池,而後再經過分配器的方式將資源進行重組,造成一個邏輯設備。的確,從外在形式上看,他們都屬於存儲虛擬化技術,因此所採用的方式都是相同的。所不一樣的是解決不一樣的問題,資源分配的方法是不一樣的。對於卷級虛擬化,主要解決存儲的異構管理、資源的精簡配置、快照系統的資源高效使用等問題。而不像底層虛擬化技術是爲了解決數據重構等問題。
卷級虛擬化的內部實現機制以下圖所示:
其主要由三大部分組成:
1, 資源池。全部的存儲資源都進行分塊操做,以資源塊的形式在storage pool中進行管理。在池化的過程當中,一個重要的問題是資源塊粒度有多大,不一樣粒度的資源對性能會形成不一樣程度的影響。一般底層虛擬化技術所採用的資源粒度會大於卷級粒度。過大的卷級資源粒度會致使精簡配置效果不佳,而且對性能形成影響。
2, 每一個邏輯卷都會維護一個映射樹,每一個映射樹中的資源塊是從資源池中採用寫時分配的策略動態分配出來的。在一個邏輯卷被建立的時候,映射樹是空的,所以,全部的寫操做都會返回數據零。隨着寫數據量的增長,映射樹增大。當讀請求訪問邏輯卷時,須要查詢映射樹,經過映射樹將請求轉換成實際的物理訪問地址;當寫請求訪問邏輯卷時,一樣須要訪問映射樹,若是映射單元爲空,那麼從資源池中動態分配一個資源塊,而後將數據寫入該資源塊。當數據被寫入資源塊以後,須要更新邏輯卷中的映射樹信息。
3, 爲了便於查找物理資源和邏輯資源塊的信息,一般須要在內存中維護一個資源信息的反向映射表。經過該表將物理資源映射成邏輯資源,避免了當一個物理存儲設備從資源池中移除時的全局掃描操做。
卷級虛擬化在產品中給用戶帶來的一個著名特性是thin provisioning(存儲資源精簡配置)。經過這個特性,用戶能夠採購少許的存儲設備,在一個較小容量的存儲系統上建立若干大容量的邏輯卷。當用戶寫入的數據量達到必定閾值時,及時通知用戶添加存儲資源。這種技術爲用戶帶來的價值是節省了存儲投資,簡化了存儲的管理。當用戶追加存儲資源時,應用層可見的邏輯卷空間能夠不變,不須要作對應的擴容操做,業務不受影響。這是卷級虛擬化很是大的一個價值。
凡事都是有兩面性的,卷級虛擬化簡化了存儲資源的管理,能夠將異構平臺融合在一塊兒,能夠爲用戶提供精簡配置,能夠爲快照應用節省大量空間。全部這些好處的獲取是須要付出其它代價的。卷級虛擬化最大的一個問題就是二次寫問題,該問題會影響到業務的性能。
什麼是二次寫問題呢?根據卷級虛擬化的原理,在一個邏輯卷所有爲空的時候,應用寫入數據。此時寫入的數據都會按需分配一個資源塊,考慮到磁盤介質的隨機訪問抖動性問題,新分配資源塊在磁盤上的分佈都是順序的,從而使得總體性能達到最佳。因此,不管應用端的業務是什麼樣的IO模式,經過卷級虛擬化技術均可以將這種任意IO Pattern在磁盤端造成順序的數據流。這種經過首次寫將存儲資源進行分配的方式,致使了數據二次更新操做的低性能。當經過首次隨機寫將存儲資源都分配完成以後,應用再以順序IO的方式二次向邏輯卷寫入數據時,因爲映射關係在首次寫中已經肯定,因此,第二次雖然是順序IO的輸入方式,可是在磁盤端表現出隨機IO的特徵,所以,二次寫的性能變差。二次寫性能影響以下圖所示:
二次寫的問題是不容易解決的。對於用戶而言,經過引入卷級虛擬化技術以後,二次順序寫性能降低。爲了解決這個問題,一般能夠經過增大資源塊粒度來減少二次寫過程當中的磁盤抖動。
在虛擬化環境下,卷級虛擬化一樣會帶來必定的價值。在虛擬化環境下,隨着虛擬機個數的增長,IO性能會急劇降低。雖然每一個虛擬機中都運行順序IO操做,可是,後端存儲的性能仍是很是的低效。究其本質是在於多臺虛擬機的順序IO在後端存儲系統中交織在一塊兒,造成一種僞隨機的IO,會致使磁盤抖動,所以IO性能降低。若是採用了卷級虛擬化技術以後,能夠將這種僞隨機的IO進行順序化處理,從而提高磁盤存儲的性能。Vmware的Virsto就採用了這種思路。
卷級虛擬化技術使得存儲節點內部的邏輯卷管理變得更加靈活,而且能夠支持上層的更多應用,例如高效存儲空間快照等。再往上走,在系統級層面也存在存儲虛擬化技術。該類虛擬化技術是在存儲節點(storage node)基礎上完成的,其起到的做用是聚合各節點之間的存儲資源,使其構成一個分佈式的存儲系統。一個典型的系統級虛擬化技術以下圖所示:
這是一個典型的擁有元數據服務器的分佈式SAN。該分佈式SAN的一個技術就是存儲虛擬化技術。若是咱們把一個存儲節點當作是一個磁盤,那麼能夠採用存儲虛擬化技術將磁盤中的存儲資源都進行池化管理,池化以後的全部信息都保存在MS(元數據服務器)中。當位於客戶端的應用軟件訪問一個虛擬邏輯卷時,首先須要訪問MS,獲取邏輯卷中一個邏輯地址所對應的存儲節點以及存儲節點中的具體位置。獲取這些信息以後,應用軟件能夠直接向存儲節點發送數據讀寫請求。當訪問的數據在MS中還不存在映射時,客戶端的應用軟件會要求MS爲其分配一個資源塊。
採用這種分佈式架構的虛擬化技術,最大的特色就是控制和數據鏈路的分離,屬於帶外模式。資源映射、邏輯卷的管理由MS服務器完成,具體的數據訪問操做直接發生在存儲節點和客戶端之間,而不須要MS服務器的數據轉發。採用這種分佈式架構,必定程度上具備較好的數據併發行和可擴展性。可是,因爲全部的客戶端都須要訪問MS來獲取元數據信息,所以,元數據服務器是整個系統的性能瓶頸點,同時也是影響到系統可擴展性的一個重要因素。
和卷級虛擬化相比,系統級虛擬化在資源塊粒度方面會選擇的比較大,不然會致使客戶端頻繁的訪問元數據服務器,引發總體系統性能的降低。
存儲虛擬化技術有不少種,各類虛擬化技術的思路都是相同的,經過將資源池化,而後再經過分配器將資源進行重組利用。雖然思想差很少,可是在不一樣層次部署的虛擬化技術起到的效果是大相徑庭的。底層虛擬化技術的應用能夠加強數據可靠性,加速數據重構操做;卷級虛擬化技術的應用能夠更加靈活的管理異構設備、提供精簡配置功能、優化快照空間等;系統級虛擬化技術部署能夠構建大型分佈式存儲系統。能夠這麼說,存儲虛擬化技術是存儲的核心,隨着閃存技術的應用與發展,存儲虛擬化技術正在發揮着更大的做用和價值。