Flashcache是Facebook技術團隊的一個開源項目,最初目的是爲加速MySQL的數據庫引擎InnoDB,是一個開源的混合存儲方案。html
Cache是容量與性能以前取平衡的結果, 以更低的成本,得到更高的收益 ,是系統設計時應該遵循的原則。算法
傳統機械硬盤幾十年來,容量不斷翻倍的增加,相比較而言,性能的增加就慢的像蝸牛了。對於依賴IO性能的應用,典型的如數據庫,一直在等待新的技術來拯救數據庫
Flash disk(SSD/FusionIO等)的出現,改變了這一切。Flash disk將硬盤從機械產品變成了電氣產品,功耗更小,性能更好,時延更優緩存
Flashcache利用了Linux的device mapping機制,將Flash disk和普通硬盤的塊設備作了一層映射,在OS中變現爲一塊普通的磁盤,使用簡單。安全
經過在文件系統和設備驅動之間新增了一層緩存層,用來實現對熱點數據的緩存。
一般用SSD固態硬盤做爲緩存,經過將傳統硬盤上的熱門數據緩存到SSD上,而後利用SSD優秀的讀性能,來加速系統。架構
固態硬盤雖然說沒有傳統硬盤那樣的機械結構,不存在磁頭老化、磁盤壞道等問題,但因爲採用了閃存做爲存儲介質,其有限的擦寫次數是一大硬傷。以32nm工藝的閃存芯片爲例,固態硬盤常見的閃存顆粒理論擦寫壽命約爲5000-10000次。固態硬盤相比機械硬盤仍是「脆弱」了些:傳統硬盤的將數據記錄在磁層上,理論上能夠經受無數次的讀寫操做而不會有磁失效的危險,顯然閃存作不到這種程度。app
若是說機械硬盤壞了還能夠作數據恢復的話,固態硬盤就連這個「後悔藥」都沒得吃了,爲何呢?由於固態硬盤的工做原理與機械硬盤不一樣。傳統硬盤的將數據記錄在磁層上,理論上能夠經受無數次的讀寫操做而不會有磁失效的危險,所以即使是硬盤已經損壞,仍能夠經過專業工具讀取磁層柱面信息來恢復。可是固態硬盤不一樣,其內部沒有任何機械結構,數據被零散地分散在各個閃存之中,要從損壞後的閃存芯片中數據恢復,從目前來說幾乎是不可能的。由於二者存儲原理不一樣,固態硬盤刪除文件時不是像機械硬盤那樣僅僅刪除文件的索引,而是所有刪除。框架
Device Mapper 是Linux 2.6後內核中全面引入的塊設備新架構,是一種從邏輯設備到物理設備的映射框架機制。Device mapper 進一步體現了在 Linux 內核設計中策略和機制分離的原則,將全部與策略相關的工做放到用戶空間完成,內核中主要提供完成這些策略所須要的機制,即Device mapper 用戶空間相關部分主要負責配置具體的策略和控制邏輯,好比邏輯設備和哪些物理設備創建映射,怎麼創建這些映射關係等等,而具體過濾和重定向 IO 請求的工做由內核中相關代碼完成。工具
Device mapper在內核中向外提供了一個從邏輯設備到物理設備的映射架構,只要用戶在用戶空間制定好映射策略,按照本身的須要編寫處理具體IO請求的target driver插件,就能夠很方便的實現一個相似LVM的邏輯卷管理器。 性能
經過Device Mapper框架,能夠統1、靈活地管理系統中全部的真實或虛擬的塊設備,也能夠方便的根據須要自定義並實現本身的塊設備存儲資源管理策略。
當前許多比較流行的 Linux 邏輯卷管理器都是基於該機制實現的:
Mapped device 是一個邏輯抽象,能夠理解成爲內核向外提供的邏輯設備,它經過映射表描述的映射關係和 target device 創建映射。
中間的一層賦值創建映射,定義對BIO請求的處理規則,以及Target deviced構建和刪除。
最下面的Target Devices層是mapped device虛擬邏輯設備所映射的真實設備物理地址空間。
它將SSD固態硬盤劃分紅預先定義大小的緩存塊(將目標硬盤也劃分爲相同大小的硬盤塊,默認大小是4KB)。同時,將每512個緩存塊分爲一組(set)。最後每一個硬盤塊映射到SSD一個肯定組中的某個緩存塊。
每一個cache set的還有個超級塊(super Block),存放緩存相關的信息,如緩存大小,多少緩存塊等
硬盤上的塊地址是磁盤塊號(Disk Block Number,dbn),對硬盤的I/O請求最後都轉化爲一個具體的磁盤塊號。將一個具體的磁盤塊號映射到某一個組是直接映射。
肯定了將這個磁盤塊映射到一個具體組後,再將這個磁盤塊號映射到該組的某一個緩存塊。
這樣兩次映射後,硬盤上的一個塊就跟固態硬盤上的一個惟一數據緩存塊對應了。當上層請求下達時,根據磁盤塊號來查找對應的固態硬盤上的緩存塊是否已經緩存,若是是,則表示命中,可直接讀寫。若是沒有緩存,則仍要讀寫硬盤,同時將該硬盤塊緩存至固態硬盤上。
元數據自己使用管理緩存數據塊的,包括
超級快(super Block):存放緩存相關的信息,如緩存大小,多少緩存塊,數據緩存塊的狀態(上次是否正常關閉),緩存的目標設備(硬盤,陣列,邏輯卷)版本號等。
元數據塊(metadata Block):若干個元數據塊,用來管理若干的緩存數據塊(Data Block)
緩存命中
當 I / O 操做開始從緩存而不是從非易失存儲中檢索數據時(如磁盤設備或子系統),緩存命中發生。除了提供來自內存的快速響應以外,緩存命中還縮短了 I / O 路徑的距離。如圖所示。
緩存未命中
另外一種狀況是,雖然搜索了緩存,但沒有發現數據,所以數據必須從非易失存儲讀取,這就是緩存未命中。由亍搜索緩存時須要花費時間,因此緩存未命中增長了 I / O 操做的時間。緩存未命中工做過程如圖所示:
Step 1.獲取flashcache最新的源碼包flashcache-master.zip並解壓,進入解壓後目錄進行 安裝
#cd flashcache-master
#make
#make install
Step 2.執行命令,初始化flashcache
# modprobe flashcache
Step 3.查看kernel message,確認是否初始化成功
# dmesg | tail
Step 1.調用lsblk查看塊設備信息
Step 2.能使用flashcache的設備必須是沒有mount到任何目錄的裸磁盤,若是已經mount了,必須先執行umount命令,(umount /dev/sdb1)。 /dev/sdb1上若是沒有文件系統,先執行命令mke2fs /dev/sdb1來建立文件系統。
Step 3.執行命令,建立flashcache 卷(這裏使用了ramdisk /dev/ram0代替ssd, 必須確保該ramdisk也沒有被mount)
flashcache_create相關參數說明:
-p:緩存模式
-s:緩存大小,可選項,若是未指定則整個SSD設備被用於緩存,默認的計數單位是扇區(sectors),可是能夠接受k/m/g單位。
-b:指定塊大小,可選項,默認爲4KB,必須爲2的指數。默認單位爲扇區。也能夠用K做爲單位,通常選4KB。
-f:強制建立,不進行檢查
-m:設備元數據塊大小,只有writeback須要存儲metadata塊,默認4K
Step 4.建立flashcache後,如要使用該設備,須要掛載設備,執行如下命令進行掛載
# mount /dev/mapper/ram0cache /mnt
Step 5.執行命令,查看flashcache 狀態
# dmsetup status
建立一個新的Flashcache卷
# flashcache_create
刪除一個flashcache卷
# dmsetup remove
加載一個已經存在的flashcache卷
# flashcache_load
清空一個已經存在的flashcache捲上的緩存
# flashcache_destroy
查看緩存相關的統計數據
# dmsetup status/dmsetup table
(1)flashcache_create
功能:建立一個新的flashcache卷。
命令語法:
flashcache_create [-v] -p back|around|thru [-s cache size] [-w] [-b block size] cachedevname ssd_devname disk_devname
-v: 查看詳細狀況
-p: 緩存模式 writeback,writethrough,writearound三種。
-s:緩存大小,可選項,若是未指定則整個SSD設備被用於緩存,默認的計數單位是扇區(sectors),可是能夠接受k/m/g單位。
-b:指定塊大小,可選項,默認爲4KB,必須爲2的指數。默認單位爲扇區。也能夠用K做爲單位,通常選4KB。
-f:強制建立,不進行檢查。
-w: 寫緩存模式. 只對寫入緩存,不對讀取緩存
舉例:
flashcache_create -p back -s 1g -b 4k cachedev /dev/sdc /dev/sdb
建立一個1GB的flashcache volume,block size爲4k。使用ssd/dev/sdc對磁盤/dev/sdb作緩存. flashcache volume的名字是"cachedev"。
緩存模式:
Writethrough - 最安全的模式,全部的寫操做在緩存的SSD的同時,也會馬上被寫入磁盤。若是SSD寫的性能不如磁盤(2008-2010年生產的早期的SSD),會限制系統寫性能。全部的磁盤讀操做都會被緩存(tunable)。
Writearound - 很安全,寫入時繞過SSD直接寫入磁盤。磁盤塊只有在被讀取以後纔會被緩存到SSD。全部的磁盤讀操做都會被緩存(tunable)。
Writeback - 最快但最不安全,數據先寫到SSD,隨後基於各類策略寫到普通硬盤。全部的磁盤讀操做都會被緩存(tunable)。
Writeonly - Writeback的變種,只緩存寫,不緩存讀
持久性:
Writethrough Writearound 沒有持久性,在斷電或重啓後,緩存數據會丟失,Writeback具備持久性,在斷電或重啓後,緩存數據不會丟失
(2)flashcache_load
功能:加載一個已經存在的flashcache卷
命令語法:
flashcache_load ssd_devname [cachedev_name]
舉例:flashcache_load /dev/ssd
若是想要修改已經存在的flashcache卷的名字,能夠指定[cachedev_name]參數,對Writethrough和Writearound模式來講,這個命令沒有用處,每次都必須從新執行flashcache_create
通常是爲了重啓後可繼續使用。
(3) dmsetup remove
功能:刪除/卸載一個flashcache卷
命令語法:
dmsetup remove cachedev_name
舉例:
dmsetup remove cachedev
刪除名爲cachedev的flashcache卷
3. flashcache_destroy
功能:清空一個已經存在的flashcache捲上的緩存,全部數據都會丟失!!!
命令語法:
flashcache_destroy ssd_devname
舉例:
flashcache_destroy /dev/sdc
清空/dev/sdc中的緩存. 全部數據都會丟失!!!
對Writethrough和Writearound模式來講,沒有必要使用
(4) dmsetup status/dmsetup table
功能:查看緩存相關的統計數據
舉例:
dmsetup status cachedev
dmsetup table cachedev
查看名爲cachedev的flashcache卷中緩存信息
(5) Cache統計信息
可使用 「dmsetup status」命令來查詢cache的統計信息。
「dmsetup table」命令能夠dumps出來achce相關的統計信息。
舉例:
dmsetup status cachedev
dmsetup table cachedev
另外proc文件系統中也有相應的狀態和錯誤的統計報告:
flashcache 卷的錯誤信息報告在
/proc/flashcache/<cache name>/flashcache_errors 裏
順序I/O性能,Flashcache並不特別佔優點。緩存該類順序I/O,相反會浪費SSD固態盤的空間和增長負擔。
IOPS (Input/Output Operations Per Second),即每秒進行讀寫(I/O)操做的次數。決定IOPS的主要取決於陣列的算法,cache命中率,以及磁盤個數。
Flashcache使用SSD做爲緩存,讀寫速度完勝普通磁盤,尤爲是遇到非連續的散片數據,SSD能體現出極快的讀寫速度。而傳統機械硬盤因爲磁頭尋道等緣由,傳輸速度偏慢。
==========
SSD的順序I/O的性能與磁盤(尤爲是RAID盤)性能並不特別佔優點,緩存該類順序I/O,相反會浪費SSD固態盤的空間和負擔。
參考文獻
[1] 基於flashcache的混合存儲方案設計與實現