【存儲緩存】-bcache原理及實踐

作者:【吳業亮】

博客:http://blog.csdn.net/wylfengyujiancheng

一、前言

簡單介紹下bcache,bcache是linux內核塊設備層的cache。主要是使用SSD盤在IO速度較慢的HDD盤上面做一層緩存,從而來提高HDD盤的IO速率。一個緩存設備(SSD)可以同時爲多個後端設備(HDD)提供緩存。既然是緩存,那自然就會想到緩存策略,bcache支持三種緩存策略:

  • writeback:回寫策略,所有的數據將先寫入緩存盤,然後等待系統將數據回寫入後端數據盤中。
  • writethrough:直寫策略(默認策略),數據將會同時寫入緩存盤和後端數據盤。
  • writearoud:數據將直接寫入後端磁盤。

bcache比較靈活,緩存策略可以隨時修改,也可以針對不同的bcache設備設置不同的緩存策略。以下會按照安裝、配置和使用這幾個部分來說明具體使用bcache的過程。bcache可以大概分爲兩個部分,一個是linux內核模塊,一個是bcache-tools,bcache內核模塊在linux內核3.10及以上才支持,所以使用bcache,需要將內核升級到3.10及以上版本才行

官網說bcache的性能完全優於flashcache,參考:

http://www.accelcloud.com/2012/04/18/linux-flashcache-and-bcache-performance-testing/

官網介紹:

https://wiki.archlinux.org/index.php/Bcache
https://bcache.evilpiepirate.org/

bcache-tools 源碼:

https://evilpiepirate.org/git/bcache-tools.git

一、升級內核

1、官網下載內核

http://cdn.kernel.org/pub/linux/kernel/

**注意:**編譯前修改.config文件開啓CONFIG_BCACHE

CONFIG_BCACHE=y

2、編譯內核
忽略

3、安裝內核

# rpm  -ivh   kernel-4.18.20-1.x86_64.rpm --force

4、生成grub

# grub2-set-default  0 && grub2-mkconfig -o /etc/grub2.cfg

5、重啓

# reboot

6、加載內核

# modprobe bcache
# lsmod | grep bcache

二、安裝bcache-tools

1、安裝依賴libblkid-devel和gcc

# yum install libblkid-devel gcc -y

2、下載bcache-tools源碼
下載鏈接爲

https://github.com/g2p/bcache-tools/releases。

3、解壓包

# tar -zxvf bcache-tools-1.0.8.tar.gz
# cd /root/bcache-tools-1.0.8

4、安裝

# make
# make install

三、創建bcache設備

1、創建後端低速設備(一般是HDD、SATA盤等)

# make-bcache -B /dev/sdc
UUID:			1eca911e-c9c9-4d9b-84c0-c1da023574ed
Set UUID:		5cf29253-f347-435e-a3db-b99006c8e6e0
version:		1
block_size:		1
data_offset:		16

可以看到,在sdb(HDD)磁盤下,出現了bcache0節點,這個bcache0可以理解爲就是/dev/sdb磁盤了

# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdb               8:16   0   80G  0 disk 
sr0              11:0    1 1024M  0 rom  
fd0               2:0    1    4K  0 disk 
sdc               8:32   0  200G  0 disk 
└─bcache0       252:0    0  200G  0 disk 
sda               8:0    0   80G  0 disk 
├─sda2            8:2    0   79G  0 part 
│ ├─centos-swap 253:1    0    4G  0 lvm  [SWAP]
│ └─centos-root 253:0    0   75G  0 lvm  /
└─sda1            8:1    0    1G  0 part /boot

對bcache0進行格式化操作了。

# mkfs.xfs /dev/bcache0
meta-data=/dev/bcache0           isize=256    agcount=4, agsize=1310720 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0        finobt=0
data     =                       bsize=4096   blocks=5242878, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

掛載目錄

# mkdir /wyl
# mount /dev/bcache0 /wyl
# df -h
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 2.0G     0  2.0G   0% /dev
tmpfs                    2.0G     0  2.0G   0% /dev/shm
tmpfs                    2.0G  8.6M  2.0G   1% /run
tmpfs                    2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/mapper/centos-root   18G  1.6G   16G   9% /
/dev/sda1                497M  170M  328M  35% /boot
tmpfs                    394M     0  394M   0% /run/user/0
/dev/bcache0              20G   33M   20G   1% /wyl

2、創建前端緩存磁盤(SSD)

#  make-bcache -C /dev/sdb
UUID:			51d3daf3-ca90-4bf7-9499-79b98321c43a
Set UUID:		f43c7118-4595-49cf-a17c-1965ee939b4b
version:		0
nbuckets:		163840
block_size:		1
bucket_size:		1024
nr_in_set:		1
nr_this_dev:		0
first_bucket:		1

建立映射關係
把我們創建好的後端低速設備和前端高速設備建立聯繫,這樣高速設備才能爲低速設備提供緩存作用。

首先需要獲取該緩存盤(/dev/sdb)的cset.uuid,通過bcache-super-show命令查看:

# bcache-super-show /dev/sdb
sb.magic		ok
sb.first_sector		8 [match]
sb.csum			AD0668369D7EED63 [match]
sb.version		3 [cache device]

dev.label		(empty)
dev.uuid		51d3daf3-ca90-4bf7-9499-79b98321c43a
dev.sectors_per_block	1
dev.sectors_per_bucket	1024
dev.cache.first_sector	1024
dev.cache.cache_sectors	167771136
dev.cache.total_sectors	167772160
dev.cache.ordered	yes
dev.cache.discard	no
dev.cache.pos		0
dev.cache.replacement	0 [lru]

cset.uuid		f43c7118-4595-49cf-a17c-1965ee939b4b

備建立聯

# echo "f43c7118-4595-49cf-a17c-1965ee939b4b" > /sys/block/bcache0/bcache/attach

操作完成後,可以通過lsblk命令查看結果

# lsblk 
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdb               8:16   0   80G  0 disk 
└─bcache0       252:0    0  200G  0 disk /wyl
sr0              11:0    1 1024M  0 rom  
fd0               2:0    1    4K  0 disk 
sdc               8:32   0  200G  0 disk 
└─bcache0       252:0    0  200G  0 disk /wyl
sda               8:0    0   80G  0 disk 
├─sda2            8:2    0   79G  0 part 
│ ├─centos-swap 253:1    0    4G  0 lvm  [SWAP]
│ └─centos-root 253:0    0   75G  0 lvm  /
└─sda1            8:1    0    1G  0 part /boot

三、快速配置方式

上面我們配置大概分了三個步驟:創建後端設備、創建前端緩存設備、建立他們之間的映射關係。

1、快速創建

# make-bcache -C /dev/sdb -B  /dev/sdc

2、查看

# lsblk 
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdb               8:16   0   80G  0 disk 
└─bcache0       252:0    0  200G  0 disk /wyl
sr0              11:0    1 1024M  0 rom  
fd0               2:0    1    4K  0 disk 
sdc               8:32   0  200G  0 disk 
└─bcache0       252:0    0  200G  0 disk /wyl
sda               8:0    0   80G  0 disk 
├─sda2            8:2    0   79G  0 part 
│ ├─centos-swap 253:1    0    4G  0 lvm  [SWAP]
│ └─centos-root 253:0    0   75G  0 lvm  /
└─sda1            8:1    0    1G  0 part /boot

3、同樣支持多個後端設備

make-bcache -C /dev/sdb -B /dev/sdc /dev/sdd

四、高級功能

1、指定塊大小
在make-bcache的時候加入-w和-b參數,主要是提高緩存性能

-w block size 默認2K,一般需要block size = 後端設備的扇區大小。
-b bucket size,一般需要bucket size = 前端緩存設備的erase block size大小。

2、修改緩存策略
查看緩存策略,可以看到默認的策略是writethrough,也就是直寫模式

# cat /sys/block/bcache0/bcache/cache_mode 
[writethrough] writeback writearound none

修改緩存策略

# echo writeback > /sys/block/bcache0/bcache/cache_mode

然後查看是否生效

# cat /sys/block/bcache0/bcache/cache_mode 
writethrough [writeback] writearound none

注:就算機器重啓之後緩存策略也不會失效的。

五、刪除bcache

1、解除緩存盤和後端盤關係

要將緩存盤從當前的後端磁盤刪除,只需將緩存盤的cset.uuid detach到bcache設備即可實現

查看ssd的cset.uuid

# bcache-super-show /dev/sdb | grep cset.uuid
cset.uuid		f43c7118-4595-49cf-a17c-1965ee939b4b

解除綁定

echo f43c7118-4595-49cf-a17c-1965ee939b4b > /sys/block/bcache0/bcache/detach

查看結果

# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdb               8:16   0   80G  0 disk 
sr0              11:0    1 1024M  0 rom  
fd0               2:0    1    4K  0 disk 
sdc               8:32   0  200G  0 disk 
└─bcache0       252:0    0  200G  0 disk 
sda               8:0    0   80G  0 disk 
├─sda2            8:2    0   79G  0 part 
│ ├─centos-swap 253:1    0    4G  0 lvm  [SWAP]
│ └─centos-root 253:0    0   75G  0 lvm  /
└─sda1            8:1    0    1G  0 part /boot

可以看到sdb下面已經沒有bcache0了。

2、刪除後端盤

# umount /wyl/
# echo 1 > /sys/block/bcache0/bcache/stop
# echo 1 >/sys/fs/bcache/f43c7118-4595-49cf-a17c-1965ee939b4b/unregister
# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdb               8:16   0   80G  0 disk 
sr0              11:0    1 1024M  0 rom  
fd0               2:0    1    4K  0 disk 
sdc               8:32   0  200G  0 disk 
└─bcache0       252:0    0  200G  0 disk 
sda               8:0    0   80G  0 disk 
├─sda2            8:2    0   79G  0 part 
│ ├─centos-swap 253:1    0    4G  0 lvm  [SWAP]
│ └─centos-root 253:0    0   75G  0 lvm  /
└─sda1            8:1    0    1G  0 part /boot

3、驗證

# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdb               8:16   0   80G  0 disk 
sr0              11:0    1 1024M  0 rom  
fd0               2:0    1    4K  0 disk 
sdc               8:32   0  200G  0 disk 
sda               8:0    0   80G  0 disk 
├─sda2            8:2    0   79G  0 part 
│ ├─centos-swap 253:1    0    4G  0 lvm  [SWAP]
│ └─centos-root 253:0    0   75G  0 lvm  /
└─sda1            8:1    0    1G  0 part /boot

4、格式化磁盤

mkfs.xfs /dev/sdb -f 
mkfs.xfs /dev/sdc -f

六、遇到的問題

1、擦除磁盤中的超級塊中的數據

用磁盤作爲Bcache磁盤前,請先確保磁盤是空的,或者磁盤中的數據無關緊要。如果磁盤中有文件系統,將會出現如下錯誤:

# make-bcache -C /dev/sdc
Device /dev/sdc already has a non-bcache superblock, remove it using wipefs and wipefs -a

擦除磁盤中的超級塊信息:

# wipefs -a /dev/sdc
/dev/sdc: 2 bytes were erased at offset 0x00000438 (ext4): 53 ef
#

2、如果使用make-bcache命令出現瞭如下打印,那就說明當前磁盤已經是bcache磁盤,

# make-bcache -B /dev/sdb
Already a bcache device on /dev/sdb, overwrite with --wipe-bcache

加上 --wipe-bcache參數就可以了:

# make-bcache -B /dev/sdb --wipe-bcache
發佈了236 篇原創文章 · 獲贊 121 · 訪問量 83萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章