使用dm-cache組合SSD與HDD實現高性價比存儲


前言:

  先有業務場景與需求,后有解決方案,從上家公司離職已經快三個月了,最近比較閑,整理下困擾上家公司的一個業務場景與解決辦法,快忘了都:

業務場景:公司的IDC與阿里雲的CDN平台合作,給優酷做CDN緩存,計費方式是根據流量來算,什么概念呢,就是在下午6:00到凌晨12:00,這段時間屬於CDN的使用高峰期,在這段時間內所占用的帶寬和流量會被CDN平台計算,然后結算付款。問題是,IDC機房的高帶寬下,很難將流量跑起來,而且在zabbix的流量圖上,中間還會有斷層,說明了兩個問題:1.流量跑的不穩定。2.有原因限制了流量的速度,可能是帶寬,可能是CDN的進程,可能是磁盤的讀寫速度。

解決辦法:既然有了具體的矛盾點,那么就需要逐一排查,具體的排查方法不再贅述,最終的結果是在磁盤的讀寫上動刀,解決了這個問題,讓公司的IDC資源獲得了更高的收益。具體怎么解決的呢,基於公司的硬件條件,大部分磁盤為300G的ssd與2T的hdd,在flashcache,b-cache,dm-cache上斟酌了一下,最終選擇了dm-cache。

dm-cache是什么呢?

答:在存儲系統中,硬盤因其存儲介質訪問需要尋道操作的緣故,速度緩慢。新生的永久性內存(Persistent RAM或者稱之為非易失性內存,固態存儲設備(SSD)通常被用作硬盤的高速緩存設備,以提高存儲系統的吞吐率。這種架構采用分層存儲管理(Hierarchy Storage Management)的思想,結合了PRAM,SSD高速度與HDD的低成本大容量的特性。另外,這種解決方案也可用於提高SAN(Storage Area Network)的性能,並能減輕其負荷。簡單的來說,就是將ssd作為hdd的緩存,來提高hdd寫的速度。

理論架構如下:

dm-cache設計成由3個物理存儲設備來混合成一個邏輯卷的形式。操作模式和緩存策略決定了緩存數據的性能。這三個物理設備分別為:
  • 原始設備:提供主要的慢速存儲(通常是一個硬盤或者SAN)
  • 緩存設備:提供高速原始設備數據的緩存(通常是一個SSD)
  • 元數據設備:記錄硬盤塊在緩存中的位置,臟標志以及執行緩存策略所需的內部數據。通常采用能夠隨機訪問的PRAM作為其載體。現有的PRAM有BBU-DIMM,PCM,MRAM。NVDIMM比起其他PRAM,速度快,容量高,是現今的最佳選擇。
塊大小值緩存的最小單位,在創建混合卷的時候配置。推薦大小為256到1024KB,但必須是64的倍數。采用塊大小大於硬盤扇區是綜合考慮了元數據大小和緩存空間浪費兩方面的因素。過小的塊會極具增加元數據在內核空間和元數據設備中占據的空間。太大的塊又會造成緩存空間的浪費,因為大的數據塊往往只有一部分有較高的緩存命中率。
dm-cache支持寫回,寫通和旁路三種模式。在寫回模式中,寫操作僅僅將數據寫入緩存,並將其標記為臟數據,然后在適當的時機由后台的內核線程寫入硬盤。寫通模式則將更新的數據寫入硬盤才結束本次I/O操作。旁路模式將所有讀寫操作不經過緩存設備,直接作用於原始設備。該模式允許混合卷在緩存設備與原始設備狀態不一致的情況下被激活,適用於執行第三方快照功能的情形。 [2]
dm-cache的做法:
1.計算metadata所需block的大小:
metadata的大小為 4MB+(16B * nr_blocks) 計算方法(nr_blocks是cache設備的block的數量。) root@xxxx:~$ sudo blockdev --getsize64 /dev/sdb  ###我的ssd卡為sdb   #fdisk  -l 查詢 239444426752 將其轉換為block數,並計算metadata所需分配的空間大小。 4MB+(16B * nr_blocks) 套用方法 4194304 + (16 * 239444426752 / 262144) =18808832
18808832 / 512
=36736 因此要給metadata分配36736個block。(注意,如果計算結果不是整數,應該向上取整。)

2.建立ssd-metadata dm設備並清空:

root@xxxx:~$ dmsetup create ssd-metadata --table '0 36736 linear /dev/sdb 0' root@xxxx:~$ sudo dd if=/dev/zero of=/dev/mapper/ssd-metadata

3.計算剩余的塊數分配給ssd-cache:

239444426752 / 512
=467664896
467664896 - 36736
=467628160

4.建立ssd-cache:

root@xxxx:~$ dmsetup create ssd-cache --table '0 467628160 linear /dev/sdb 36736'

5.獲得origin設備的扇區數:

root@xxxx:~$ blockdev --getsz /dev/sdb 467664896

6.建立origin設備(256kB):

root@xxxx:~$ dmsetup create hdd-origin --table '0 467664896 cache /dev/mapper/ssd-metadata /dev/mapper/ssd-cache /dev/sdb 512 1 writeback default 0'

7.驗證:

root@xxxx:~$ sudo ls -l /dev/mapper/hdd-origin lrwxrwxrwx 1 root root 7 April  10 18:16 /dev/mapper/hdd-origin -> ../dm-2 root@xxxx:~$ sudo dmsetup status /dev/mapper/hdd-origin 0 467664896 cache 8 817/***** 512 0/****** 0 43 0 0 0 0 0 1 writeback 2 migration_threshold 2048 smq 0 rw –

上面最后一排信息的具體含義如下:

Der Device-Mapper stellt über dmsetup status den aktuellen Status des Caches zur Verfügung. sudo dmsetup status /dev/mapper/dmcache_test Beispielausgabe: 0 8388608 cache 34/1280 1781667 761103 200117 225373 0 0 3567 1 1 writethrough 2 migration_threshold 2048 4 random_threshold 4 sequential_threshold 512 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └──────────└───────────└───────────└─<policy args>* │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─<#policy args> │ │ │ │ │ │ │ │ │ │ │ │ └────────────└─<core args>* │ │ │ │ │ │ │ │ │ │ │ └─<#core args> │ │ │ │ │ │ │ │ │ │ └─<feature args>* │ │ │ │ │ │ │ │ │ └─<#feature args> │ │ │ │ │ │ │ │ └─<#dirty> │ │ │ │ │ │ │ └─<#blocks in cache> │ │ │ │ │ │ └─<#promotions> │ │ │ │ │ └─<#demotions> │ │ │ │ └─<#write misses> │ │ │ └─<#write hits> │ │ └─<#read misses> │ └─<#read hits> └─<#used metadata blocks>/<#total metadata blocks>

 

8.掛載:

root@xxxx:~$ mkdir /mnt/cache #此處可能會產生錯誤,可以忽略不計 root@xxxx:~$ mount /dev/mapper/hdd-origin /mnt/cache

9.配置開機自動加載並掛載,需要手動配置兩個文件放到/etc/init下:

root@xxxx:~$ sudo vim /etc/init/ssd-cache-wait.conf # Start monitoring with inotifywait (will block) after the filesystem is # mounted, when the filesystem is unmounted, teardown the dm devices. start on mounted MOUNTPOINT=/mnt/cache script inotifywait -e unmount $MOUNTPOINT dmsetup suspend hdd-origin dmsetup remove hdd-origin dmsetup remove ssd-cache dmsetup remove ssd-metadata end script root@xxxx:~$sudo vim /etc/init/ ssd-cache.conf # This would be handy, but it assumes the source device is already # available, which in this case it isn't. #start on mounting MOUNTPOINT=/mnt/cache # Run after /proc and /dev are finalized start on virtual-filesystems task script # Setup the /dev/mapper/hdd-origin entity so that mountall will automount it after reading fstab dmsetup create ssd-metadata --table '0 36736 linear /dev/nvme0n1p1 0' dmsetup create ssd-cache --table '0 467664896 linear /dev/nvme0n1p1 36736' dmsetup create hdd-origin --table '0 467628160 cache /dev/mapper/ssd-metadata /dev/mapper/ssd-cache /dev/sda2 512 1 writeback default 0' dmsetup resume hdd-origin end script

10.刪除dm-cache的辦法:

停用dm-cache umount /dev/mapper/hdd-origin dmsetup remove hdd-origin dmsetup remove ssd-metadata dmsetup remove ssd-cache
並刪除/etc/init下的文件就行

結語:

  不得不說這套方案是非常的不錯的,SSD的價格相對還是較貴的,尤其是作為存儲來說,算上使用壽命的話,整體價格和HDD還是有不小的差距,而這套方案的優勢就在於,在速度與價格上實現了折中,大大降低了海量存儲的成本,當然,如果是內部的私有存儲,還是結合ceph等開源分布式存儲更好。

文章參考鏈接如下:

https://blog.csdn.net/Agoni_xiao/article/details/83151629

https://www.centos.bz/2018/02/lvm%E4%B9%8Bcache%E5%8A%A0%E9%80%9F/

https://www.jianshu.com/p/edfd6e7deee1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM