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