技術筆記系列 - SAN存儲的長鏈條
十幾年前學習DOS內核的時候,是可以直接寫程序控制磁盤步進電機的,磁頭放在什么位置,讀寫到盤片的哪兒都可以控制。但看看現在的SAN存儲,恍若已是隔世。
我們就以一條簡單的linux cat 讀文件命令,看看要經歷怎樣的千山萬水,才能到達物理磁盤,取到真正的數據。
首先,在linux 命令行中輸入cat 命令,系統會調用相應的system call, 進入內核態。在內核里最早接受請求的是VFS(virtual file system)層, VFS 是一層抽象的文件接口,當它發現實際請求是要訪問一個磁盤文件時,就會調用對應的真正的文件系統接口,在linux中通常是Ext3. 在這個時候,如果該文件之前已經被讀過,還放在buffer 中,那么恭喜你,你可以直接拿到數據了。
如果沒有,對不起,繼續往下調用塊設備存儲的驅動,塊設備存儲驅動會把讀取文件的指令轉換成讀取某個塊存儲設備的某個數據塊,這也是SCSI子系統的最高層接口,系統把存取指令按照SCSI協議命令打包,發給SCSI 控制器。如果linux是非虛擬機,這個時候工作就交給硬件。
但是,如果linux還是臺虛擬機(現在大部分情況都是這樣,假設這臺linux是運行在Vmware 的 EXSi host 上),讀取指令則會傳遞給一個虛擬的SCSI 控制器,這個虛擬SCSI控制器再傳遞給VMkernel, 對VMkernel而言,虛擬機的一個磁盤其實只是一個文件(datastore), 所以VMkernel還要二次轉換,轉成物理設備真正的位置,再把這些指令通過調用HBA驅動發給HBA卡。
HBA卡(host bus adapter)是光傳輸設備,它與光交換機,SAN存儲一起構成光纖傳輸網絡,把讀取指令傳輸到相應的存儲設備上。
好,總算到目的地了。且慢,這還是萬里長征第一步,現在的SAN存儲可不僅僅是幾塊磁盤,就拿IBM8870來說,它其實是由兩臺高端P系列服務器組成的集群。當我們的讀取指令到達SAN 存儲,SAN存儲會重新解析這些指令,如果該數據塊已經放在存儲服務器龐大的內存(Cache)中,則這些數據就會經光傳輸網絡返回。否則,就要遍歷在linux端同樣的過程,一級一級調用底層接口,最后通過SCSI驅動,發出指令來操作實際的物理硬盤。
在這個過程中,存儲服務器已經將數據的具體物理位置做了兩層封裝。首先是做RAID,比如IBM8870 中8個盤為一組,用RAID5,6,或10,實現數據冗余和高性能。所以看似連續的數據塊實際可能分布在一組磁盤上。第二層是extend pool, IBM8870可以將SSD盤,SAS盤,SATA 盤都放到同一個extend pool, 再分到同一個邏輯盤里。也就是說我們操作的邏輯盤其實際數據可能放在完全不同類型的盤中,而且,由于IBM78870提供了自動Easy tier 功能,系統可以根據數據的使用頻率調整使用不同的盤。如果某數據塊頻繁地被訪問,則該數據塊就會從 SAS盤轉到SSD盤 。所有這一切都是自動在后臺進行,對用戶完全不可見。
現在還有一項流行的技術,就是在服務器和物理存儲系統間再嵌入一層虛擬層,由它來管理控制所有存儲并對服務器提供存儲服務。比如IBM SVC (storage volume controller). linux 發出的數據讀取指令會先到SVC, SVC 實質也是一臺服務器,同時對各物理存儲系統的盤有做了一層封裝。所有連SVC 的存儲系統將自己的磁盤呈現給 SVC組成 MDG (managed disk group),SVC 再將這些盤映射為自己的 VDISK. 當用戶需要讀取某VDISK 中的數據時,SVC再翻譯成對應的實際物理存儲系統的的位置,然后通知該物理存儲系統讀取相應的數據。
我們可以看到,現代基于 SAN 的存儲系統其實已經對物理磁盤做了多層封裝和虛擬化。在用戶這一層幾經無法實際定位某一段數據真正放在物理磁盤上的哪個位置。
責任編輯:任我行
-
企業對云計算影響其業務的一些認識
-
文件完整性監測的5個階段
-
企業如何從SOAPA獲益
2018-02-05SOAPA