每天5分钟复习OpenStack(十三)存储缓存技术Bcache

Ceph作为一个分布式存储,在项目中常见的形态有两者,一种是采用 SSD 或NVME 磁盘做Ceph的日志盘,使用SATA磁盘来做数据盘。这样的好处是比较经济实惠。另一种则是全部采用 SSD 或NVME磁盘,其性能更好,但是其价格比较昂贵。在第一种形态中,我们能像中间件那样加上一层缓存层,从而实现给数据盘加速的功能吗?Bcache就是这样一种缓存技术。

1. bcache 是什么

  • Bcache是Linux内核块设备层Cache,支持将一个或多个速度较快的磁盘设备(如SSD)作为读写速度相对较慢的磁盘设备的Cache.它使得固态硬盘作为硬盘驱动器的缓存,既解决了固态硬盘容量太⼩的问题,又解决了硬盘驱动器运行速度太慢的问题。

2. 三种缓存策略

bcache从3.10版本开始被集成进内核,⽀持3种缓存策略,分别是 WritebackWritethroughWritearoud , 默认使⽤Writethrough,缓存策略可被动态修改。

  • Writethrough (直写策略): 数据写入时, 必须SSD和HDD盘都写入成功, 写入请求才算完成, 写入请求才返回. 因此对于写入, 该策略并未有性能提升. 适用于读多写少的场景, 可以保证数据的强一致性

  • Writeback (回写策略): 数据写入时, 只要SSD中写入成功, 写入请求就立即返回. SSD中的脏数据会由后台线程定时刷写到HDD盘中. 因此对于写入, 该策略会有明显的性能提升(除非到了SSD的性能瓶颈). 但是可能会造成数据丢失, 比较适用于底层有独立供电的RAID卡的服务器或者对数据一致性要求不是很高的场景

  • Writearound (绕写策略): 数据写入时, 绕过SSD, 直接写入到HDD盘中. 可以防止SSD因写I/O而填满, 导致以后不可重新读取. 缺点是: 当数据第一次读取, 由于写入时绕过了SSD, 因此会有SSD从HDD加载数据的操作

3. 两种角色

Cache device : (前端)缓存盘, 一般为SSD高速磁盘设备,对应的命令就是 make-bcache -C xxx

Backing device : 后端(数据)盘, 一般为HDD低速磁盘设备,对应的命令是 make-bcache -B xxx

4. 实战

(Bcache从Linux-3.10开始正式并入内核主线,默认centos的内核在3.10版本上bug比较多,建议升级到4.x内核,此环境中我们直接将内核本升级到4.14的版本。然后编译安装bcache)

4.1 检查是否能正常加载bcache模块

lsmod | grep bcache
modprobe bcache

此时如果出现 modprobe: FATAL: Module bcache not found.

不要慌,在3.10版本之前的内核中大概率会出现,因为此时内核没有包含该bcache模块。

请参照4.2.1编译安装新版内核。如果能正常加载则请跳过 4.2

4.2 编译内核

4.2.1 下载内核源码

mkdir -pv /root/kernel
cd /root/kernel 
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.9.102.tar.xz .

#该路径下有所有Linux内核源码哦 
https://mirrors.edge.kernel.org/pub/linux/kernel/

4.2.2 安装依赖包

安装依赖关系
yum -y install rpm-build m4 gcc xmlto asciidoc openssl-devel hmaccalc python-devel newt-devel perl-ExtUtils-Embed elfutils-devel zlib-devel binutils-devel bison audit-libs-devel java-devel numactl-devel pciutils-devel ncurses-devel createrepo genisoimage net-tools git bc

4.2.3 解压包

xz -d linux-4.9.102.tar.xz
tar -xvf linux-4.9.102.tar

4.2.4 配置模块

cp /boot/config-3.10.0-1160.71.1.el7.x86_64  /root/kernel/linux-4.9.102/.config
make menuconfig

修改Device Driver->Mutiple device driver support让Linux编译时生成bcache模块

4.2.5 编译 (笔记本性能一般的建议晚上放后台执行,本人笔记本编译耗时7小时才编译完成。)

make -j 4 # cpu 个数 

4.2.6 生成默认的内核配置

make -j 4 moduels
make -j 4 modules_install
make install
cat /boot/grub2/grub.cfg 
grub2-set-default 'CentOS Linux (4.9.103) 7 (Core)'
reboot 
#重启就可以看见新内核的选项 ,当然你也可以编辑grub2.cfg 文件删除之前的旧的内核菜单。

每次都需要编译很麻烦,有没有不编译的方法呢?

yum 一键无脑安装

#默认最新版本的kernel都可以直接yum install 安装,
http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/

#1 下载
wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-5.4.274-1.el7.elrepo.x86_64.rpm

#2 安装
yum install kernel-lt-5.4.274-1.el7.elrepo.x86_64.rpm

无脑安装是挺好的,可是只有最新的内核才能yum安装,有没有可能我们自己制作一个内核的rpm包来安装。

内核源码直接就是支持编译成rpm包的,只需要两步既可

cd linux-4.9.102
make rpm && make rpm-pkg

编译完成之后显示如下图所示(注意此时的编译过程也是依赖编译环境的性能的,如果性能不好,将会十分耗时)

4.3 编译安装bcche

#1 克隆源码
git clone https://evilpiepirate.org/git/bcache-tools.git

#2 安装依赖包
cd bcache-tools/
yum install libblkid-deve

#3 编译成二进制文件
make && make install

编译完成后生成二进制文件如下

生成命令快捷捷

cp make-bcache /usr/sbin/
cp bcache-super-show /usr/bin/

4.4 加载bcache 模块

modprobe bcache
lsmod |grep bcache

#开机自动加载bcache 模块
echo bcache >  /etc/modules-load.d/bcache.conf

5 写在最后

最近有小伙伴私信我,建议我控制下篇幅的长度,因为要保障读者在5分钟左右读完的篇幅,因此接下来的文章中,本人将尽量控制文章的字数。但是对于Bcache 这种实践比较多的文章,强烈建议读者还是自己亲自实践,有些知识看上去以为自己明白了,实际实操时会有一些额外的心得和收获。

下一章我们将Ceph和Bcache 结合,看下生产环境中是怎么使用的?