文章

centos7 使用bcache

简单介绍下bcache,bcache是linux内核块设备层的cache。主要是使用SSD盘在IO速度较慢的HDD盘上面做一层缓存,从而来提高HDD盘的IO速率。一个缓存设备(SSD)可以同时为多个后端设备(HDD)提供缓存。既然是缓存,那自然就会想到缓存策略,bcache支持三种缓存策略:

writeback:回写策略,所有的数据将先写入缓存盘,然后等待系统将数据回写入后端数据盘中。

writethrough:直写策略(默认策略),数据将会同时写入缓存盘和后端数据盘。

writearoud:数据将直接写入后端磁盘。

bcache比较灵活,缓存策略可以随时修改,也可以针对不同的bcache设备设置不同的缓存策略。以下会按照安装、配置和使用这几个部分来说明具体使用bcache的过程。 https://lakelight.net/2017/12/20/centos7-bcache.html

https://www.itread01.com/content/1548985342.html 好的文档 ,包含所有bcache内容

https://ypdai.github.io/2018/07/13/bcache%E9%85%8D%E7%BD%AE%E4%BD%BF%E7%94%A8/

http://www.yangguanjun.com/2018/03/26/lvm-sata-ssd-bcache/

https://markrepo.github.io/maintenance/2018/09/10/bcache/

https://www.cnblogs.com/zimufeng/p/6640439.html 官方翻译说明文档

https://hgoldfish.com/blogs/article/106/ bcache 使用

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

https://wiki.archlinux.org/index.php/Bcache_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)

https://gist.github.com/mikulely/e2931b7cce388dbff006622a3eef7b42

http://qingqiuyuxiang.com/show.php?id=248

安装使用配置bcache

yum install git libuuid libuuid-devel libblkid-devel -y git clone http://evilpiepirate.org/git/bcache-tools.git cd bcache-tools/ make make install

创建后端低速设备 我们把/dev/sdb配置为后端低速设备(一般是HDD、SATA盘等)

[root@lab01 bcache-tools]# make-bcache -B /dev/sdb
UUID:            ac23506f-396d-4ac1-8949-d1e5c79ef207
Set UUID:        d40d7d90-d15f-4744-a56e-29d0ed5446f4
version:        1
block_size:        1
data_offset:        16

可以看到,在sdb(HDD)磁盘下,出现了bcache0节点,这个bcache0可以理解为就是/dev/sdb磁盘了

[root@lab01 bcache-tools]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 20G 0 disk ├─sda1 8:1 0 500M 0 part /boot └─sda2 8:2 0 19.5G 0 part ├─centos-root 253:0 0 17.5G 0 lvm / └─centos-swap 253:1 0 2G 0 lvm [SWAP] sdb 8:16 0 20G 0 disk └─bcache0 252:0 0 20G 0 disk sdc 8:32 0 20G 0 disk sr0 11:0 1 4G 0 rom

现在,可以像普通磁盘一样,对bcache0进行格式化操作了。

[root@lab01 bcache-tools]# 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 [root@lab01 bcache-tools] mkdir /testbcache [root@lab01 bcache-tools] mount /dev/bcache0 /testbcache [root@lab01 bcache-tools]# 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% /testbcache

创建前端缓存磁盘(SSD) 我们把/dev/sdc配置为前端高速设备(一般是SSD)

[root@lab01 bcache-tools]#  make-bcache -C /dev/sdc
UUID:            9c5a00ff-4c32-4d0b-a6d2-ccd21e17e230
Set UUID:        8cae4fac-1312-4b0a-8bf7-2142dae5a334
version:        0
nbuckets:        40960
block_size:        1
bucket_size:        1024
nr_in_set:        1
nr_this_dev:        0
first_bucket:        1

建立映射关系 把我们创建好的后端低速设备和前端高速设备建立联系,这样高速设备才能为低速设备提供缓存作用。

首先需要获取该缓存盘(/dev/sdc)的cset.uuid,通过bcache-super-show命令查看:

[root@lab01 bcache-tools]# bcache-super-show /dev/sdc sb.magic ok sb.first_sector 8 [match] sb.csum D2BA585E4E51AD5C [match] sb.version 3 [cache device] dev.label (empty) dev.uuid 9c5a00ff-4c32-4d0b-a6d2-ccd21e17e230 dev.sectors_per_block 1 dev.sectors_per_bucket 1024 dev.cache.first_sector 1024 dev.cache.cache_sectors 41942016 dev.cache.total_sectors 41943040 dev.cache.ordered yes dev.cache.discard no dev.cache.pos 0 dev.cache.replacement 0 [lru] cset.uuid 8cae4fac-1312-4b0a-8bf7-2142dae5a334

上面的cset.uuid后面的8cae4fac-1312-4b0a-8bf7-2142dae5a334就是我们需要的cset uuid,因为我们要和bcache0设备(也就是/dev/sdb设备)建立联系,从而是该缓存设备(/dev/sdc),为bcache0设备提供缓存服务,所以执行下面命令

[root@lab01 bcache-tools]# echo "8cae4fac-1312-4b0a-8bf7-2142dae5a334" > /sys/block/bcache0/bcache/attach

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

[root@lab01 bcache-tools]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 20G 0 disk ├─sda1 8:1 0 500M 0 part /boot └─sda2 8:2 0 19.5G 0 part ├─centos-root 253:0 0 17.5G 0 lvm / └─centos-swap 253:1 0 2G 0 lvm [SWAP] sdb 8:16 0 20G 0 disk └─bcache0 252:0 0 20G 0 disk /testbcache sdc 8:32 0 20G 0 disk └─bcache0 252:0 0 20G 0 disk /testbcache sr0 11:0 1 4G 0 rom

此时可以看到,sdc下也出现了bcache0设备,即表示缓存添加成功。还记得我们之前将bcache0(也就是/dev/sdb)挂载到了/testbcache目录下,此时如果对/testbcache进行读写操作时,bcache缓存设备就会起缓存作用了。

快速配置方式 上面我们配置大概分了三个步骤:创建后端设备、创建前端缓存设备、建立他们之间的映射关系。那有没有一步到位的方式,当然有。

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

上面这条命令,就自动的完成了那三个步骤,执行完看到的结果大概是这样的

... sdb 254:16 0 50G 0 disk └─bcache1 250:1 0 50G 0 disk sdc 254:32 0 50G 0 disk └─bcache0 250:0 0 50G 0 disk sdd 254:48 0 50G 0 disk └─bcache2 250:2 0 50G 0 disk sde 254:64 0 10G 0 disk ├─bcache0 250:0 0 50G 0 disk ├─bcache1 250:1 0 50G 0 disk └─bcache2 250:1 0 50G 0 disk ...

可以看到前端缓存设备sde同时为后端设备sdb、sdc、sdd提供缓存作用。

注:还可以在make-bcache的时候加入-w和-b参数,主要是提高缓存性能

  • w block size 默认2K,一般需要block size = 后端设备的扇区大小。
  • b bucket size,一般需要bucket size = 前端缓存设备的erase block size大小。* 修改缓存策略 查看缓存策略,可以看到默认的策略是writethrough,也就是直写模式
[root@lab01 bcache-tools]# cat /sys/block/bcache0/bcache/cache_mode [writethrough] writeback writearound none

修改缓存策略

[root@lab01 bcache-tools]# echo writeback > /sys/block/bcache0/bcache/cache_mode

然后查看是否生效

[root@lab01 bcache-tools]# cat /sys/block/bcache0/bcache/cache_mode writethrough [writeback] writearound none

注:就算机器重启之后缓存策略也不会失效的。

增加后端设备或前端缓存设备 有时候我们已经配置好了bcache,比如配置好了sde为sdb、sdc提供缓存作用,然后我现在想让sde为sdd也提供缓存作用。可以按照以下步骤进行:

配置后端设备:make-bcache -B /dev/sdd,假设生成bcache设备号为bcache2 建立映射关系:echo “8cae4fac-1312-4b0a-8bf7-2142dae5a334” > /sys/block/bcache2/bcache/attach ok,完成。增加缓存设备也同理,先创建前端缓存设备,然后查看该缓存设备的cset uuid,然后根据cset uuid和后端设备建立映射关系即可。

恢复(还原到配置bcache之前) 我们经过上面的测试之后,也许我不需要bcache配置了,需要恢复到配置之前的环境,bcache肯定支持还原啦。

解除缓存盘和后端盘关系 要将缓存盘从当前的后端磁盘删除,只需将缓存盘的cset.uuid detach到bcache设备即可实现

[root@lab01 bcache-tools]# echo "8cae4fac-1312-4b0a-8bf7-2142dae5a334" > /sys/block/bcache0/bcache/detach 操作完成后,可以通过lsblk命令查看结果 [root@lab01 bcache-tools]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 20G 0 disk ├─sda1 8:1 0 500M 0 part /boot └─sda2 8:2 0 19.5G 0 part ├─centos-root 253:0 0 17.5G 0 lvm / └─centos-swap 253:1 0 2G 0 lvm [SWAP] sdb 8:16 0 20G 0 disk └─bcache0 252:0 0 20G 0 disk /testbcache sdc 8:32 0 20G 0 disk sr0 11:0 1 4G 0 rom

可以看到sdc下面已经没有bcache0了。

删除前端缓存盘 这里要注意,在注销缓存盘前,要确认该缓存设备没有被任何的后端设备使用,否则你懂的,会有数据丢失的风险。

通过缓存盘的cset.uuid,在/sys/fs/bcache//unregister写入1,即可进行注销操作

[root@lab01 bcache-tools]# echo 1 >/sys/fs/bcache/8cae4fac-1312-4b0a-8bf7-2142dae5a334/unregister

然后ls查看/sys/fs/bcache/,如果没有8cae4fac-1312-4b0a-8bf7-2142dae5a334这个目录,就表示注销成功了。

删除后端盘 同理,要删除后端缓存盘,首先需要解除该后端盘和它使用的缓存盘之间的映射关系

[root@lab01 bcache-tools]# umount /testbcache/ [root@lab01 bcache-tools]# echo 1 > /sys/block/bcache0/bcache/stop [root@lab01 bcache-tools]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 20G 0 disk ├─sda1 8:1 0 500M 0 part /boot └─sda2 8:2 0 19.5G 0 part ├─centos-root 253:0 0 17.5G 0 lvm / └─centos-swap 253:1 0 2G 0 lvm [SWAP] sdb 8:16 0 20G 0 disk sdc 8:32 0 20G 0 disk sr0 11:0 1 4G 0 rom

可以看到,环境已经恢复到配置bcache之前的了。 Bcache使用 下面在CentOS机器上,介绍如何使用bcache。 硬盘信息

# fdisk -l | grep dev ... Disk /dev/vdb: 107.4 GB, 107374182400 bytes, 209715200 sectors Disk /dev/vdc: 107.4 GB, 107374182400 bytes, 209715200 sectors Disk /dev/vdd: 53.7 GB, 53687091200 bytes, 104857600 sectors

这里使用三块盘:vdb、vdc、vdd。 其中vdb、vdc是容量型磁盘,vdd是性能型磁盘,实验用vdd通过bcache加速vdb和vdc。 使用步骤 与bcache相关的命令有:make-bcache和bcache-super-show

# make-bcache Please supply a device Usage: make-bcache [options] device C, --cache Format a cache device B, --bdev Format a backing device b, --bucket bucket size w, --block block size (hard sector size of SSD, often 2k) o, --data-offset data offset in sectors -cset-uuid UUID for the cache set -writeback enable writeback -discard enable discards -cache_replacement_policy=(lru|fifo) h, --help display this help and exit # bcache-super-show Usage: bcache-super-show [-f] <device>

创建backing device

# make-bcache -B /dev/vdb UUID: c602abab-bf5a-4b51-b7f6-1492d34239f4 Set UUID: 423e1910-f61a-45fa-8cdf-a23aca3b5eb8 version: 1 block_size: 1 data_offset: 16 # bcache-super-show /dev/vdb sb.magic ok sb.first_sector 8 [match] sb.csum 1376BA45B5F924B [match] sb.version 1 [backing device] dev.label (empty) dev.uuid c602abab-bf5a-4b51-b7f6-1492d34239f4 dev.sectors_per_block 1 dev.sectors_per_bucket 1024 dev.data.first_sector 16 dev.data.cache_mode 0 [writethrough] dev.data.cache_state 1 [clean] cset.uuid 4b60c663-7720-4dea-a17a-e9316078e796

创建cache device

# make-bcache -C /dev/vdd UUID: 050998ce-403c-45d7-a89b-492379644c1b Set UUID: 4b60c663-7720-4dea-a17a-e9316078e796 version: 0 nbuckets: 102400 block_size: 1 bucket_size: 1024 nr_in_set: 1 nr_this_dev: 0 first_bucket: 1 # bcache-super-show /dev/vdd sb.magic ok sb.first_sector 8 [match] sb.csum 68CDDDC337A2E296 [match] sb.version 3 [cache device] dev.label (empty) dev.uuid 050998ce-403c-45d7-a89b-492379644c1b dev.sectors_per_block 1 dev.sectors_per_bucket 1024 dev.cache.first_sector 1024 dev.cache.cache_sectors 104856576 dev.cache.total_sectors 104857600 dev.cache.ordered yes dev.cache.discard no dev.cache.pos 0 dev.cache.replacement 0 [lru] cset.uuid 4b60c663-7720-4dea-a17a-e9316078e796

绑定backing device到cache device

# echo "4b60c663-7720-4dea-a17a-e9316078e796" > /sys/block/bcache0/bcache/attach # lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT ... vdb 253:16 0 100G 0 disk └─bcache0 251:0 0 100G 0 disk vdc 253:32 0 100G 0 disk vdd 253:48 0 50G 0 disk └─bcache0 251:0 0 100G 0 disk

查看bcache相关信息

# state # cat /sys/block/bcache0/bcache/state clean

state的几个状态:

  • no cache:该backing device没有attach任何caching device
  • clean:一切正常,缓存是干净的
  • dirty:一切正常,已启用回写,缓存是脏的
  • inconsistent:遇到问题,后台设备与缓存设备不同步 2、缓存数据量
# cat /sys/block/bcache0/bcache/dirty_data 0. 0k

3、缓存模式

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

4、writeback信息

# cat /sys/block/bcache0/bcache/writeback_ writeback_delay writeback_percent writeback_rate_debug writeback_rate_p_term_inverse writeback_running writeback_metadata writeback_rate writeback_rate_d_term writeback_rate_update_seconds

解绑backing device的cache device

# echo "697b764f-b3ef-4675-8761-d9518a12089c" > /sys/block/bcache0/bcache/detach # lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT ... vdb 253:16 0 100G 0 disk └─bcache0 251:0 0 100G 0 disk vdc 253:32 0 100G 0 disk vdd 253:48 0 50G 0 disk # cat /sys/block/vdb/bcache/state no cache

解绑后设备可以继续使用,只是没有cache device的加速

添加新backing device

# make-bcache -B /dev/vdc UUID: cc790e62-b3eb-4237-8265-dd1b619e15c0 Set UUID: edb2b1d0-9eeb-4a8a-b811-3dafd676fac0 version: 1 block_size: 1 data_offset: 16 # echo "4b60c663-7720-4dea-a17a-e9316078e796" > /sys/block/bcache1/bcache/attach # lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT ... vdb 253:16 0 100G 0 disk └─bcache0 251:0 0 100G 0 disk vdc 253:32 0 100G 0 disk └─bcache1 251:1 0 100G 0 disk vdd 253:48 0 50G 0 disk └─bcache1 251:1 0 100G 0 disk

使用bcache device

# mkfs.ext4 /dev/bcache1 # mount /dev/bcache1 /mnt/ # df -h Filesystem Size Used Avail Use% Mounted on ... /dev/bcache1 99G 61M 94G 1% /mnt # umount /mnt/

注销bcache device

# echo 1 > /sys/block/vdc/bcache/stop # echo 1 > /sys/block/vdb/bcache/stop # echo 1 > /sys/fs/bcache/10057a1c-15a2-4631-a6d2-f4652d37645d/unregister # lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT ... vdb 253:16 0 100G 0 disk vdc 253:32 0 100G 0 disk vdd 253:48 0 50G 0 disk

echo的数字不重要,可为任何值 ;)

快捷创建bcache device

# make-bcache -B /dev/vdb /dev/vdc -C /dev/vdd UUID: 09f971eb-6063-4f94-bdac-d7d7117c0e0f Set UUID: 697b764f-b3ef-4675-8761-d9518a12089c version: 0 nbuckets: 102400 block_size: 1 bucket_size: 1024 nr_in_set: 1 nr_this_dev: 0 first_bucket: 1 UUID: b45301fa-8932-4194-9518-ab681f37d9c9 Set UUID: 697b764f-b3ef-4675-8761-d9518a12089c version: 1 block_size: 1 data_offset: 16 UUID: 2c0452f7-76de-4319-bd3c-2a73b4fa4b68 Set UUID: 697b764f-b3ef-4675-8761-d9518a12089c version: 1 block_size: 1 data_offset: 16 [root@lvm-centos-tst ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT ... vdb 253:16 0 100G 0 disk └─bcache0 251:0 0 100G 0 disk vdc 253:32 0 100G 0 disk └─bcache1 251:1 0 100G 0 disk vdd 253:48 0 50G 0 disk ├─bcache0 251:0 0 100G 0 disk └─bcache1 251:1 0 100G 0 disk

遇到的问题 make-bcache命令有提示 之前做过bcache的device,重做bcache有提示

# make-bcache -B /dev/vdb Already a bcache device on /dev/vdb, overwrite with --wipe-bcache # lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT ... vdb 253:16 0 100G 0 disk └─bcache0 251:0 0 100G 0 disk

虽说有提示,但实际bcache device已经创建成果 针对上述情况,可以通过写device前一部分数据的方法解决 可以通过dd命令来清理device的前部分数据:

# dd if=/dev/zero of=/dev/vdb bs=1M count=100 oflag=direct # dd if=/dev/zero of=/dev/vdd bs=1M count=100 oflag=direct

再创建bcache device,就不会报错了:

# make-bcache -B /dev/vdb UUID: c602abab-bf5a-4b51-b7f6-1492d34239f4 Set UUID: 423e1910-f61a-45fa-8cdf-a23aca3b5eb8 version: 1 block_size: 1 data_offset: 16 # make-bcache -C /dev/vdd UUID: 050998ce-403c-45d7-a89b-492379644c1b Set UUID: 4b60c663-7720-4dea-a17a-e9316078e796 version: 0 nbuckets: 102400 block_size: 1 bucket_size: 1024 nr_in_set: 1 nr_this_dev: 0 first_bucket: 1

设备没umount就直接注销 没有umount,注销bcache device后,设备依旧可以使用,umount后设备消失

# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT ... vdb 253:16 0 100G 0 disk └─bcache0 251:0 0 100G 0 disk /mnt vdc 253:32 0 100G 0 disk vdd 253:48 0 50G 0 disk └─bcache0 251:0 0 100G 0 disk /mnt # mount | grep bcache /dev/bcache0 on /mnt type ext4 (rw,relatime,seclabel,data=ordered) # echo 1 > /sys/fs/bcache/4b60c663-7720-4dea-a17a-e9316078e796/unregister # echo 0 > /sys/block/vdb/bcache/stop # lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT ... vdb 253:16 0 100G 0 disk └─bcache0 251:0 0 100G 0 disk /mnt vdc 253:32 0 100G 0 disk vdd 253:48 0 50G 0 disk # ls /sys/block/vdb/bcache ls: cannot access /sys/block/vdb/bcache: No such file or directory # cd /mnt/ # touch tstfile # umount /mnt/ # lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT ... vdb 253:16 0 100G 0 disk vdc 253:32 0 100G 0 disk vdd 253:48 0 50G 0 disk
本文由作者按照 CC BY 4.0 进行授权