安装

1 加载系统的bcache模块:

lsmod | grep bcache
modprobe bcache

2 如果出现错误:

modprobe: FATAL: Module bcache not found.

则需要升级内核:https://www.cnweed.com/archives/4311/
因为bcache在kernel 3.10版本才进入主线,所以我们要保证CentOS的内核版本大于3.10

3 编译安装

yum install -y git gcc-c++ pkgconfig libblkid-devel
git clone https://evilpiepirate.org/git/bcache-tools.git
cd bcache-tools/
make
make install

配置磁盘设备

1 命令介绍
与bcache相关的命令有:make-bcache和bcache-super-show

[root@ceph-node-1 ~]# 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

2 快速创建
-B:指定后端磁盘设备,即要加速的数据盘;-C:指定前端缓存设备,用于加速数据盘,一般用NVME SSD。这里假设/dev/sdc为数据盘,/dev/nvme0n1为缓存盘。

[root@ceph-node-1 ~]# make-bcache -B /dev/sdc -C /dev/nvme0n1
UUID:                   303e696e-6b30-4f06-a75d-294e3d197434
Set UUID:               e5291f51-32ae-4d4e-95ce-0e646d41dfc4
version:                0
nbuckets:               915725
block_size:             1
bucket_size:            1024
nr_in_set:              1
nr_this_dev:            0
first_bucket:           1
UUID:                   0077e0d1-10e2-4f44-aba6-b0fe853f313c
Set UUID:               e5291f51-32ae-4d4e-95ce-0e646d41dfc4
version:                1
block_size:             1
data_offset:            16

除了上面的形式,也可以一次性加入多个后端数据盘:

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

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

-w block size 默认2K,一般需要block size = 后端设备的扇区大小。
-b bucket size,一般需要bucket size = 前端缓存设备的erase block size大小。*

3 单独创建后端磁盘设备(backing device)

[root@ceph-node-1 ~]# make-bcache -B /dev/sdb
UUID:                   fe200976-28c9-4ff8-b55c-ac86a416529e
Set UUID:               7cc6c0bb-fbc3-4933-95ec-f98cc49dbc36
version:                1
block_size:             1
data_offset:            16

*创建后运行lsblk会显示如下类似信息,sdb下会有bcache{编号}类似分区:

[root@ceph-node-1 ~]# lsblk
NAME            MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
nvme0n1         259:0    0 447.1G  0 disk 
└─bcache0       252:0    0 447.1G  0 disk
sdb               8:16   0   3.7T  0 disk
└─**bcache1**       252:0    0   3.7T  0 disk
sdc               8:32   0   3.7T  0 disk 
sda               8:0    0 232.4G  0 disk 

4 单独创建缓存磁盘设备(cache device)

[root@ceph-node-1 ~]# make-bcache -C /dev/nvme0n1

5 查看设备信息

[root@ceph-node-1 ~]# bcache-super-show /dev/nvme0n1
sb.magic                ok
sb.first_sector         8 [match]
sb.csum                 6E2EB2102565945E [match]
sb.version              3 [cache device]

dev.label               (empty)
dev.uuid                303e696e-6b30-4f06-a75d-294e3d197434
dev.sectors_per_block   1
dev.sectors_per_bucket  1024
dev.cache.first_sector  1024
dev.cache.cache_sectors 937701376
dev.cache.total_sectors 937702400
dev.cache.ordered       yes
dev.cache.discard       no
dev.cache.pos           0
dev.cache.replacement   0 [lru]

cset.uuid               e5291f51-32ae-4d4e-95ce-0e646d41dfc4

6 绑定后端数据盘(backing device)到缓存盘(cache device)
命令格式为:echo "{缓存盘cset.uuid,可以通过bcache-super-show查看}" > /sys/block/bcache{后后端数据盘编号,见上文第3步}/bcache/attach

echo "e5291f51-32ae-4d4e-95ce-0e646d41dfc4" > /sys/block/bcache1/bcache/attach

上为示例

修改缓存模式

bcache支持三种缓存模式:

writeback : 写入时先写到Cache中,同时将对应block的元数据dirty bit,但是并不会立即写入后备存储器
writethrough : 写入时将数据同时写入cache和后备存储器,后备存储器写完,才算写操作完成
writearound : 写入的时候,绕过Cache,直接写入后备存储器,即加速盘只当读缓存
下面这张图可以形象说明三者区别:
cache.png

1 查看当前缓存模式

cat /sys/block/bcache{编号}/bcache/cache_mode

2 修改

echo writearound > /sys/block/bcache{编号}/bcache/cache_mode

注意,实际操作时候请把{编号}替换为实际数字,如 bcache0

可以随时修改并会马上生效,修改后不需要做其他操作

后端磁盘停用或重新启用缓存(解绑或绑定)

举例:后端磁盘为“/dev/sdc”,缓存设备为“/dev/nvme0n1”。

1 查看缓存盘的cset-uuid

bcache-super-show /dev/nvme0n1

显示如:cset.uuid e5291f51-32ae-4d4e-95ce-0e646d41dfc4

2 解除缓存操作

echo e5291f51-32ae-4d4e-95ce-0e646d41dfc4 > /sys/block/bcache0/bcache/detach

如果要重新添加

echo e5291f51-32ae-4d4e-95ce-0e646d41dfc4 > /sys/block/bcache0/bcache/attach

注意:bcache{要操作的后端磁盘编号}

注销缓存盘

格式:echo 1 > /sys/fs/bcache/{缓存盘cset-uuid}/unregister
示例:

echo 1  > /sys/fs/bcache/e5291f51-32ae-4d4e-95ce-0e646d41dfc4/unregister

/sys/fs/bcache/目录里e5291f51-32ae-4d4e-95ce-0e646d41dfc消失了,就是注销成功。

停用缓存盘

格式:echo 1 > /sys/fs/bcache/{缓存盘cset-uuid}/stop
示例:

echo 1  > /sys/fs/bcache/e5291f51-32ae-4d4e-95ce-0e646d41dfc4/stop

停用后端设备(数据盘)

格式:echo 1 > /sys/block/bcache{要操作的后端磁盘编号} /bcache/stop
示例:

echo 1 > /sys/block/bcache0/bcache/stop

停用后bcache0分区就不见,可以重新操作格式化重新添加等

擦除磁盘残留数据

sudo wipefs -a /dev/sdc

查看bcache相关信息

1 缓存状态

cat /sys/block/bcache0/bcache/state

state的几个状态:

no cache:该backing device没有attach任何caching device
clean:一切正常,缓存是干净的
dirty:一切正常,已启用回写,缓存是脏的
inconsistent:遇到问题,后台设备与缓存设备不同步

2 缓存数据量

cat /sys/block/bcache0/bcache/dirty_data

Bcache的性能调优

bcache有很多配置选项和可调的参数,默认值适合于典型配置

1) 如果写入性能差,可以尝试将其写策略调为回写策略

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

2) 默认情况下,bcache不会缓存顺序IO和大文件,所以顺序写性能应该没什么提升,可以打开顺序IO缓存:

echo 0 > /sys/block/bcache0/bcache/sequential_cutoff

还可以调整backing设备的顺序IO阈值,默认是4M,也就是说如果bcache设备的连续IO达到4MB以上时是直接读写backing盘,不会走SSD缓存盘,如果要设置成8M,则可如下:

echo 8M > /sys/block/bcache0/bcache/sequential_cutoff

3) 防止cache设备成为瓶颈
这种情况最可能发生在一块缓存磁盘作为多个普通盘的缓存磁盘,写入或读取处理不过来时,就会形成堵塞,这时我们可以关闭拥塞控制项,默认情况下,当读请求超过2ms,写请求超过20ms时就会直接读写backing盘。
关闭读写拥塞控制命令:

echo 0 > /sys/fs/bcache/{cache set uuid}/congested_read_threshold_us
echo 0 > /sys/fs/bcache/{cache set uuid}/congested_write_threshold_us

其他: writeback_percent 参数

该参数为缓存盘拿来存储脏数据的比例,默认为10%;例如的nvme ssd缓存盘容量为400GB,后端设备有4个hdd,则每个hdd的在缓存盘的脏数据最高为10GB,当超过该比例时则开始回写数据到后端设备。

查看当前值命令

more  /sys/block/bcache0/bcache/writeback_percent

修改当前值

echo 40 > /sys/block/bcache0/bcache/writeback_percent 

开发人员限制最高只能40%,当然,你可以通过一些方式来修改限制。但该比例越高,数据就越危险,因为一旦缓存盘发生故障,后端设备可能因为数据不完整而造成部分数据变成只读状态或者丢失,这就是开发人员限制它的原因。

但通常,如果启用了writeback,如果缓存盘坏了则意味着文件系统损坏,可能丢失所有后端设备的数据。目前如果坏了我是删除osd,然后换上新的硬件,格式化后端hdd,重新配置bcache然后添加osd,让ceph开始数据平衡,这个ceph的工作量可能会比较高;那在这个情况下,writeback_percent 可能越大越好,毕竟就无所谓缓存盘挂掉对后端设备的数据影响。

但也许可以换上新的缓存盘、后端设备,添加OSD,然后把原来的后端设备数据dd上去能找回部分数据?我还没试过,我也不知道成不成……

总之如果应用bcache,并启用了writeback则需要认真考虑这点,如果应用于ceph则需要确保同时故障1-2个bcache及其后端设备还能有足够的副本重新平衡数据,对于商业应用建议还需要准备单独的设备建立备份池定期备份以防不测。

如果缓存盘故障

如果你用的是writeback模式,那可以放弃治疗了,找回数据很难且不完整,如果数据非常重要,可以做尝试。如果是其他模式则不会有影响数据安全,换新的缓存盘后,可以先解除原缓存盘的绑定再绑定新盘。

Ceph添加bcache设置后的数据盘:

ceph-deploy osd create ceph-node-1 --data /dev/bcache1

最新的版本Ceph已经可以直接像/dev/bcache1这样添加了

学习参考自
https://support.huaweicloud.com/usermanual-kunpengsdss/kunpengbcache_06_0016.html
https://blog.csdn.net/liangchen0322/article/details/50322635
https://www.cnblogs.com/luohaixian/p/9280141.html
http://www.yangguanjun.com/2018/03/26/lvm-sata-ssd-bcache/
https://ziyablog.com/266/bcache%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/
http://www.tech-g.com/2017/08/10/bcache-how-to-setup/

2021.07.31: Linux内核的详细文档,如果你想了解更多的Bcache参数,这会非常有用
https://www.kernel.org/doc/html/latest/admin-guide/bcache.html

标签: Ceph, Bcache

已有 2 条评论

  1. 灰太狼 灰太狼

    echo writeback > /sys/block/bcache0/cache_mode

    应该是echo writeback > /sys/block/bcache0/bcache/cache_mode

    感谢大佬分析整理,非常详细,帮助很大,感激不尽

添加新评论