前言:
先有業務場景與需求,后有解決方案,從上家公司離職已經快三個月了,最近比較閑,整理下困擾上家公司的一個業務場景與解決辦法,快忘了都:
業務場景:公司的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寫的速度。
理論架構如下:
-
原始設備:提供主要的慢速存儲(通常是一個硬盤或者SAN)
-
緩存設備:提供高速原始設備數據的緩存(通常是一個SSD)
-
元數據設備:記錄硬盤塊在緩存中的位置,臟標志以及執行緩存策略所需的內部數據。通常采用能夠隨機訪問的PRAM作為其載體。現有的PRAM有BBU-DIMM,PCM,MRAM。NVDIMM比起其他PRAM,速度快,容量高,是現今的最佳選擇。
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