Linux下块设备缓存之Bcache使用


title: Linux下块设备缓存之Bcache使用
date: 2017-11-09 20:30:00
tags: Linux,Bcache


由于项目需要,将原来的磁盘缓存方案由flashcache替换成Bcache,故针对Bcache作了一番了解。所以记录下学习成果,防止遗忘。文中所有的操作都基于CentOS 7环境,以下不再赘述。

Bcache简介

Bcache是Linux内核块设备层cache,支持多块HDD使用同一块SSD作为缓存盘。它让SSD作为HDD的缓存成为了可能。由于SSD价格昂贵,存储空间小,而HDD价格低廉,存储空间大,因此采用SSD作为缓存,HDD作为数据存储盘,既解决了SSD容量太小,又解决了HDD运行速度太慢的问题。
注:Bcache是从Linux-3.10开始正式并入内核主线的,因此,要使用Bcache,需要将内核升级到3.10及以上版本才行。

Bcache缓存策略

Bcache支持三种缓存策略,分别是:writeback、writethrough、writearoud,默认使用writethrough,缓存策略可动态修改。

  • writeback 回写策略:回写策略默认是关闭的,如果开启此策略,则所有的数据将先写入缓存盘,然后等待系统将数据回写入后端数据盘中。
  • writethrough 写通策略:默认的就是写通策略,此模式下,数据将会同时写入缓存盘和后端数据盘。
  • writearoud :选择此策略,数据将直接写入后端磁盘。

bcache-tools的安装与使用

bcache-tools的安装

要使用Bcache,必须安装bcache-tools工具包,由于CentOS 7的源中没有bcache-tools,因此,需要手动下载源码包进行编译。源码在这:bcache-tools,下载之后,需要安装libblkid-devel依赖包方可进行编译,通过以下命令即可安装:

yum install libblkid-devel

安装libblkid-devel包成功之后,直接编译bcache-tools安装即可。

bcache-tools的使用

使用磁盘作为Bcache磁盘前,请先确保磁盘是空的,或者磁盘中的数据无关紧要。如果磁盘中有文件系统,将会出现如下错误:

[root@localhost ~]# make-bcache -C /dev/sdc
Device /dev/sdc already has a non-bcache superblock, remove it using wipefs and wipefs -a
[root@localhost ~]# 

此时,需要使用wipefs命令,擦除磁盘中的超级块中的数据,这将使得原磁盘中的数据无法继续使用,也无法进行还原,因此,使用此命令前,请确保磁盘中的数据已经备份

  • 擦除磁盘中的超级块信息:
[root@localhost ~]# wipefs -a /dev/sdc
/dev/sdc: 2 bytes were erased at offset 0x00000438 (ext4): 53 ef
[root@localhost ~]# 
  • 创建Bcache后端磁盘(HDD):
[root@localhost ~]# make-bcache -B /dev/sdb
UUID:           774756de-38e1-42dd-9fcc-5c363db7b319
Set UUID:       2edf6ef1-652d-4bb3-b5b3-663725a70ccd
version:        1
block_size:     1
data_offset:        16
[root@localhost ~]# 
  • 创建Bcache缓存磁盘(SSD):
[root@localhost ~]# make-bcache -C /dev/sdc
UUID:           8c36cd15-5ada-4cfe-a6c4-dd7ce96e30be
Set UUID:       b506d850-19c5-4260-945e-108764632bee
version:        0
nbuckets:       20480
block_size:     1
bucket_size:        1024
nr_in_set:      1
nr_this_dev:        0
first_bucket:       1
[root@localhost ~]# 
  • 查看Bcache磁盘:
[root@localhost ~]# lsblk /dev/sdb
NAME      MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb         8:16   0  10G  0 disk 
└─bcache0 253:1    0  10G  0 disk 
[root@localhost ~]# 

可以看到,在sdb(HDD)磁盘下,出现了bcache0节点,现在,可以像普通磁盘一样,对其进行格式化操作了。

Bcache磁盘配置

格式化Bcache磁盘并挂载

要使用bcache磁盘,需要先将磁盘进行格式化,可以使用mkfs.ext4将bcache磁盘格式化成ext4,操作如下:

[root@localhost ~]# mkfs.ext4 -F /dev/bcache0
mke2fs 1.42.9 (28-Dec-2013)
Discarding device blocks: done                            
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
655360 inodes, 2621438 blocks
131071 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2151677952
80 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done 

[root@localhost ~]# 

此时,即可进行挂载,如下:

[root@localhost ~]# mount /dev/bcache0 /mnt
[root@localhost ~]#

添加缓存盘

要为bcache后端磁盘添加缓存盘,在创建缓存盘成功之后,首先需要获取该缓存盘的cset.uuid,通过bcache-super-show命令查看:

[root@localhost ~]# bcache-super-show /dev/sdc
sb.magic        ok
sb.first_sector     8 [match]
sb.csum         E9D2701DC04A0A13 [match]
sb.version      3 [cache device]

dev.label       (empty)
dev.uuid        000771bd-5c58-4713-9fba-23312efb01a8
dev.sectors_per_block   1
dev.sectors_per_bucket  1024
dev.cache.first_sector  1024
dev.cache.cache_sectors 20970496
dev.cache.total_sectors 20971520
dev.cache.ordered   yes
dev.cache.discard   no
dev.cache.pos       0
dev.cache.replacement   0 [lru]

cset.uuid       d0079bae-b749-468b-ad0c-6fedbbc742f4
[root@localhost ~]# 

如上命令结果所示,最后一行即为该缓存盘的cset.uuid,只要将此缓存盘的cset.uuid attach到bcache磁盘即可实现添加缓存操作,命令如下:

[root@localhost ~]# echo "d0079bae-b749-468b-ad0c-6fedbbc742f4" >/sys/block/bcache0/bcache/attach 
[root@localhost ~]# 

操作完成后,可以通过lsblk命令查看结果:

[root@localhost ~]# lsblk /dev/sdb /dev/sdc
NAME      MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb         8:16   0  10G  0 disk 
└─bcache0 253:1    0  10G  0 disk /mnt
sdc         8:32   0  10G  0 disk 
└─bcache0 253:1    0  10G  0 disk /mnt
[root@localhost ~]# 

此时可以看到,sdc下也出现了bcache0设备,即表示缓存添加成功。

删除缓存盘

要将缓存盘从当前的后端磁盘删除,只需将缓存盘的cset.uuid detach到bcache磁盘即可实现,命令如下:

[root@localhost ~]# echo "d0079bae-b749-468b-ad0c-6fedbbc742f4" >/sys/block/bcache0/bcache/detach 
[root@localhost ~]# 

操作完成后,可以通过lsblk命令查看结果:

[root@localhost ~]# lsblk /dev/sdb /dev/sdc
NAME      MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb         8:16   0  10G  0 disk 
└─bcache0 253:1    0  10G  0 disk /mnt
sdc         8:32   0  10G  0 disk 
[root@localhost ~]# 

此时可以看到,sdc下的bcache0设备不见了,即表示缓存删除成功。

注销缓存盘

注销缓存前,请先确保当前缓存盘没有作为缓存使用,即通过lsblk看不到缓存磁盘下面的bcahe设备,如果当前磁盘正在使用,而进行注销操作,可能导致缓存盘的数据不能及时写入后端磁盘,造成数据丢失。
通过缓存盘的cset.uuid,在/sys/fs/bcache/<cset.uuid>/unregister写入1,即可进行注销操作,操作如下:

[root@localhost ~]# echo 1>/sys/fs/bcache/d0079bae-b749-468b-ad0c-6fedbbc742f4/unregister 
[root@localhost ~]# 

操作完成后,通过ls查看/sys/fs/bcache/d0079bae-b749-468b-ad0c-6fedbbc742f4,如果该目录不存在,则表示注销成功。

停用bcache后端磁盘

停用后端磁盘前,请先确保当前磁盘没有附加缓存盘使用,如果当前磁盘正在使用缓存磁盘而进行操作,可能导致缓存盘的数据不能及时写入后端磁盘,造成数据丢失。

  1. 卸载后端磁盘
[root@localhost ~]# umount /dev/bcache0
[root@localhost ~]# 
  1. 停用缓存磁盘
[root@localhost ~]# echo 1>/sys/block/bcache0/bcache/stop
[root@localhost ~]# 

操作完成后,通过lsblk命令查看结果:

[root@localhost ~]# lsblk /dev/sdb
NAME      MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb         8:16   0  10G  0 disk 
[root@localhost ~]# 

此时,sdb设备下并无bcache磁盘,即表示bcache后端磁盘已经停用。

Bcache使用之系统配置

配置/etc/fstab

/etc/fstab文件保存着Linux系统启动过程中,使用的挂载配置,文件中的每一行都对应着系统中的一个挂载点,有关fstab文件的说明,在此不做介绍。
要想bcache磁盘在系统重启时,进行自动挂载,需要将配置写入fatab文件中,操作如下:

获取bcache设备的UUID

由于bcache<N>设备在每次重启后,N的值并不是固定的,有可能重启后,原先的bcahe0变为bcache1,而bcache1却变成了bcache0,。所以,不能将/dev/bcache<N>作为磁盘挂载,需要使用该磁盘的UUID进行挂载,通过以下命令可以获取磁盘的UUID:

[root@localhost ~]# blkid /dev/bcache0 
/dev/bcache0: UUID="3b015acd-904a-4a91-9b98-43d4bbd19f2e" TYPE="ext4" 
[root@localhost ~]# 

注:此UUID为磁盘进行格式化之后,生成了文件系统的UUID,并非上面所说的bcache缓存盘的cset.uuid。

将UUID配置写入/etc/fstab

[root@localhost ~]# echo "`blkid /dev/bcache0 |awk '{print $2}'|sed  's/\"//g'`    /mnt                       ext4     defaults        0 0" >>/etc/fstab 
[root@localhost ~]# 

配置bcache内核模块开机自动加载

此步骤仅仅针对将bcache编译成内核模块的系统,由于bcache以内核模块的形式存在,那么系统启动后,将不会自动加载bcache模块,那么我们上面配置的bcache将无法自动加载,所以,需要修改系统配置,使得bcache模块开机自动加载。为了完成此功能,只需要在/etc/sysconfig/modules增加bcache.modules文件,文件内容如下:

#!/bin/sh

modprobe bcache >/dev/null 2>&1

exit 0

添加bcache.modules文件后,需要增加其可执行权限才能正常加载bcache模块,命令如下:

[root@localhost ~]# chmod +x bcache.modules 
[root@localhost ~]# 

Bcache注意事项

writeback

使用Bcache磁盘,当缓存使用writeback写回策略,在停用后端磁盘或者注销缓存磁盘时,一定要保证缓存盘已经完全从后端磁盘移除,否则可能导致数据丢失,甚至磁盘损坏。在缓存还在工作时,不能将磁盘进行热插拔,这将导致数据异常。

make-bcache

  • 如果使用make-bcache命令出现了如下打印,那就说明当前磁盘已经是bcache磁盘,
[root@localhost ~]# make-bcache -B /dev/sdb
Already a bcache device on /dev/sdb, overwrite with --wipe-bcache
[root@localhost ~]# 

加上 --wipe-bcache参数就可以了:make-bcache -B /dev/sdb --wipe-bcache

  • make-bcache支持快速创建后端磁盘和缓存磁盘,并自动化建立绑定两者的绑定关系,命令如下:
[root@localhost ~]# make-bcache -B /dev/sdb -C /dev/sdc --wipe-bcache
UUID:           8e8da86d-7cda-4e06-b05b-dd7309c33cf6
Set UUID:       ff92c353-bfcf-4f51-b2b8-8eb7792d491e
version:        0
nbuckets:       20480
block_size:     1
bucket_size:        1024
nr_in_set:      1
nr_this_dev:        0
first_bucket:       1
UUID:           4df35dfa-00f7-4c27-9838-e6853cdfaf48
Set UUID:       ff92c353-bfcf-4f51-b2b8-8eb7792d491e
version:        1
block_size:     1
data_offset:        16
[root@localhost ~]# 

通过lsblk命令查看结果:

[root@localhost ~]# lsblk /dev/sdb /dev/sdc
NAME      MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb         8:16   0  10G  0 disk 
└─bcache3 253:3    0  10G  0 disk 
sdc         8:32   0  10G  0 disk 
└─bcache3 253:3    0  10G  0 disk 
[root@localhost ~]# 

此时,sdc已经作为sdb的缓存盘了,无需再进行添加缓存的操作了。

经典的Device busy

通常,在操作过程中,由于没有完全的注销缓存或者停用后端磁盘而导致出现:Can't open dev /dev/sd<x>: Device or resource busy错误,此时,只需要找到磁盘所在的节点,缓存盘则注销,后端磁盘则停用即可。

总结

Bcache作为新的缓存方案,给系统运行速度带来了极大地改善,因此,选择Bcache作为缓存是不二之选。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 197,966评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,170评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 144,909评论 0 327
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,959评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,851评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,583评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,956评论 3 388
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,590评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,878评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,892评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,719评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,501评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,957评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,124评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,440评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,003评论 2 343
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,211评论 2 339

推荐阅读更多精彩内容

  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,118评论 2 34
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,530评论 18 139
  • Azure 虚拟机使用磁盘来存储 VM 操作系统、应用程序和数据。 创建 VM 时,请务必选择适用于所需工作负荷的...
    ITknight阅读 515评论 0 0
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,195评论 25 707
  • 心想生自在人生【自在大学】自在经11期14:狂野想象 2017-11-23 心想生自在人生合伙人 点击上方蓝字关注...
    米妙和阅读 259评论 0 0