在存儲設備中,使用分層技術,將冷熱數據自動分層存放在具有不用讀寫性能的存儲介質上,已經是很普遍的做法,比如 IBM 的 DS8K 中使用的 Easy Tier。這些功能都需要存儲設備固件的支持,如何在 Linux 主機上,使用 Linux 現有的機制,實現數據的分層存儲?本文主要介紹了 Linux 平臺上兩種不同的實現分層存儲的方案。
背景介紹
隨著固態存儲技術 (SSD),SAS 技術的不斷進步和普及,存儲介質的種類更加多樣,采用不同存儲介質和接口的存儲設備的性能出現了很大差異。SSD 相較于傳統的機械硬盤,由于沒有磁盤的機械轉動,尋址速度大大提高,尤其在隨機讀寫較多的應用環境下,性能會大大提升,但這些高性能存儲設備的單位存儲價格相對于傳統的磁帶和 SATA 硬盤也高出很多,如圖 1 所示。
圖 1 不同存儲設備的性能價格對比
所以,如何高效平衡地利用這些存儲設備,是所有存儲廠商都在關注的問題。采用 Storage Tiering分層存儲,將數據按照冷熱進行自動分層,越熱的數據存放在訪問性能越高的設備上,而越冷的數據存放在訪問性能越低的設備上,既可以獲取高的性能,又可以有效節約成本。
Storage Tiering 分層存儲技術在企業級的存儲設備中已經被廣泛使用,如 IBM 的 Easy Tier, EMC 的 FAST 等,但這些功能都集成在存儲設備內部,需要存儲設備固件的支持。
本文主要 Host 主機的角度,分析在 Linux 上實現 Storage Tiering 分層存儲的兩種方案以及其開源實現。為便于表述,本文中僅以兩級 Tiering 為例,慢速設備為傳統的 SATA 硬盤(DEV1),快速設備為固態存儲硬盤 SSD(DEV2)。
分層存儲的技術要點
要實現分層存儲,首先需要將具有不同訪問性能的存儲設備(DEV1, DEV2)虛擬化成一個新的存儲設備(VDEV)。與緩存(Cache)不同,VDEV 的存儲容量是 DEV1 與 DEV2 的容量之和(需除去一些用于存放元數據的空間)。
所有用戶的 IO 請求將會發給新的存儲設備 VDEV,然后再按照一定的地址映射關系被轉發到相應的物理設備 DEV1 或 DEV2。
同時還需要統計 IO 的熱度,并根據這些熱度數據,動態地在不同的 Tiering 間遷移數據,以達到性能容量的優化。
因此,實現分層存儲主要包括三方面的工作,如圖 2 所示。
存儲設備的虛擬化
負責虛擬設備的創建,刪除; 維護虛擬設備到物理設備的地址映射關系。
IO 性能的監測統計
統計 IO 的熱度,以及 IO 的大小,隨機性能屬性,為數據遷移提供依據。
數據的遷移
根據 IO 數據的熱度等統計屬性,將訪問頻度高的數據遷移至讀寫性能高的 Tier 存放,而將訪問頻度低的數據遷移到性能低的 Tier 存放。
圖 2 分層存儲的數據遷移
基于 Block Device 的分層存儲方案
該方案完整地實現了以上提到的分層存儲中所有的工作,包括虛擬化,IO 性能統計以及數據的遷移。
方案結構
該方案的結構包括一個 Linux 設備驅動程序和若干用戶態的控制程序,如圖 3 所示。
驅動程序實現存儲設備的虛擬化,IO 性能監測統計以及數據的遷移;
用戶態控制程序負責創建、刪除虛擬設備,手動觸發數據遷移,以及設置獲取設備狀態。
該方案由于 Storage Tiering 所有的功能都在 Linux 內核實現,且需要維護虛擬設備到物理設備的地址映射表,以及保證數據一致性,所以實現難度和工作量比較大,但可擴展性和靈活性也相對較大。
圖 3 基于 Block Device 的分層存儲方案
方案實現
該方案的實現主要包括以下內容:
1、管理設備的注冊
管理設備主要用于與用戶態程序的 IOCTL 交互,可以是一個字符設備或者 Misc 設備。Linux 下可以通過 register_chrdev 或 misc_register 注冊,并實現所需要的 IOCTL 接口。
2、虛擬塊設備的創建
用戶態控制程序通過 IOCTL 向控制設備發起創建虛擬設備的請求,并傳入所有的物理磁盤(DEV1,DEV2)的參數,如設備名,磁盤大小,虛擬磁盤的塊大小等;驅動程序收到該請求后,進行必要的參數檢查,然后調用 register_blkdev 創建一個新的塊設備(VDEV)。并設置新設備的相關參數,如 IO 處理函數,隊列大小,設備容量等。
3、虛擬設備地址與物理設備地址映射
虛擬設備地址到物理設備的地址映射表在虛擬設備創建是被初始化,并在數據遷移過程中被修改。
虛擬設備和物理設備都被分成固定大小的塊,塊大小可以固定或通過 IOCTL 由用戶指定,但一旦確定,不能更改,一個 Block 是熱度統計以及數據遷移的最小單位;每個 Block 包含若干個 sector(512 Byte)。
當 VDEV 收到一個 bio,可以由 bi_sector 和 bi_size 找出所對應的 VDEV 的 Block 以及 Block 內的偏移量,通過查詢映射表,找到各個 VDEV Block 所對應的物理設備以及 Block,然后讀取物理設備 Block 內的偏移量,如圖 4 所示。
地址映射表以及其他的元數據需要存儲在物理設備上,以便機器重啟時能重構這個虛擬的塊設備,且需要采取一定的備份策略,防止斷電或磁盤損壞造成數據丟失。
4、IO 熱度統計
IO 熱度統計也以 Block 為基本單位,每個 Block 內的任何一個 sector 被訪問,該 Block 的熱度都為增加。由于大 IO 以及順序 IO 在性能在傳統硬盤和 SSD 上的差異并不是特別大,所以在進行熱度統計是應該考慮排除大 IO 和順序 IO。
5、數據遷移
可以采用自動方式或手動方式。自動方式由驅動內的定時器驅動,每隔一定的時間,啟動數據遷移的掃描,將 IO 熱度統計中的熱數據向高性能存儲設備遷移,冷數據向低性能存儲設備遷移;手動方式由用戶指定,將某塊數據向高性能存儲設備遷移或低性能設備遷移。手動數據遷移方式增加了更大的靈活性和可擴展性。
圖 4 虛擬設備與物理設備的地址映射
開源實現
BTier 基于 Block Device 的分層存儲方案的開源實現。BTier 最大支持 16 個設備的虛擬化,這些設備被 BTier 簡單地捆綁成一個 btier 塊設備,因此,其中任何一個設備的失效,都會導致整個 btier 的失效。
編譯并以模塊形式安裝 BTier 之后,會創建一個名為 tiercontrol 的字符設備;
然后使用 BTier 提供的 btier_setup 應用可以創建一個新的塊設備 btiera,然后就可以對 btiera 設備進行所有塊設備的讀寫操作,包括分區和創建文件系統。
BTier 還提供了豐富的 sysfs 接口,進行控制和信息獲取,如數據遷移的開關,間隔時間,IO 統計信息等。
不過 BTier 每個 Tier 層僅支持 1 個物理設備,同層多個設備的虛擬化需要借助其他的方法,在虛擬化上面,BTier 還有可以改善的空間。
基于 LVM 的分層存儲方案
Linux 的邏輯卷管理(LVM)提供了存儲虛擬化,可以將多個物理卷(PV)建成一個卷組(VG),然后再在 VG 里創建虛擬卷(VG)。而且 LVM 提供了在不同物理卷之間遷移數據的 API。因此,基于 LVM 的分層存儲方案借助 LVM 的虛擬化和數據遷移的能力,實現會更簡單。
方案結構
該方案中,數據一致性的問題以及數據遷移時 IO 中斷的問題都由 LVM 進行處理,重點在于如何分析并統計 IO 的熱度信息,并且不涉及內核態的開發。該方案的結構如圖 5 所示。
圖 5 基于 LVM 的分層存儲方案
方案實現
該方案的實現主要包括以下內容:
1、創建虛擬設備
使用 pvcreate 將所有的物理磁盤創建成物理卷(PV);再使用 vgcreate 將所有的 VG 創建成一個卷組(VG);最后使用 lvcreate 在創建出來的 VG 上建虛擬卷。
2、IO 熱度統計
IO 熱度統計可以使用 blktrace 工具,或者實現一個設備驅動來檢測 IO 的熱度。使用 blkparse 可以解析 blktrace 的輸出,然后分析這些 IO 的分布以及讀寫頻度,從而得到 IO 的熱度統計信息。
3、數據遷移
根據 IO 的熱度統計信息,使用 LVM 提供的 pvmove 工具,可以在屬于同一個 VG 里的不同 PV 之間進行數據遷移,將熱數據和冷數據分布存放在不同的物理卷上。
開源實現
LVMTS(LVM Tired Storage)是一個使用 SSD 和 HDD 來創建混合存儲的方案,完全在用戶態實現,主要由幾個守護進程構成。
Lvmtscd 負責監測 blktrace 的輸出并統計塊設備的訪問頻度,并將這些統計信息記錄在文件中;
Lvmtsd 負責根據用戶配置的信息,啟動其他的守護進程,并完成數據遷移。
實際使用中發現,LVMTS 并不是太穩定,而且在 IO 分析統計上并不是太完善,可開發的空間仍然很大。
總結
在 Linux 上實現 Storage Tiering 分層存儲,方法有很多,包括使用 Linux Device Mapper 機制等。本文對比較常用的兩種方案的實現進行了大概的分析,以及各個方案的優劣,在實際實現中,還有很多細節需要考慮,如 Thin Provision,SSD Trim 等的支持。
評論
查看更多