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