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 结合,看下生产环境中是怎么使用的?

每天5分钟复习OpenStack(十三)存储缓存技术Bcache的更多相关文章

  1. 五分钟学后端技术:如何学习Redis、memcache等常用缓存技术

    原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 本文思维导图 什么是缓存 计算机中的缓存 做后端开发的同学,想必对缓存都不会陌生了,平时我们可能会使用Redis,MemCache这类 ...

  2. Django笔记三十三之缓存操作

    本文首发于公众号:Hunter后端 原文链接:Django笔记三十三之缓存操作 这一节介绍一下如何在 Django 中使用 redis 做缓存操作. 在 Django 中可以有很多种方式做缓存,比如数 ...

  3. 【恒天云技术分享系列10】OpenStack块存储技术

    原文:http://www.hengtianyun.com/download-show-id-101.html 块存储,简单来说就是提供了块设备存储的接口.用户需要把块存储卷附加到虚拟机(或者裸机)上 ...

  4. 配置Ceph集群为OpenStack后端存储

    配置Ceph存储为OpenStack的后端存储 1  前期配置 Ceph官网提供的配置Ceph块存储为OpenStack后端存储的文档说明链接地址:http://docs.ceph.com/docs/ ...

  5. 创建OpenStack的存储云

    OPENSTACK内部 OpenStack是一个开源的云平台项目,是由NASA发起,Rackspace在2010作为一个项目进行主导.源代码是由OpenStack基金会管理并在准许Apache许可下发 ...

  6. [RN] React Native 使用 AsyncStorage 存储 缓存数据

    React Native 使用 AsyncStorage 存储 缓存数据 AsyncStorage是一个简单的.异步的.持久化的Key-Value存储系统,它对于App来说是全局性的.这是官网上对它的 ...

  7. 网站缓存技术总结( ehcache、memcache、redis对比)

    网站技术高速发展的今天,缓存技术已经成为大型网站的一个关键技术,缓存设计好坏直接关系的一个网站访问的速度,以及购置服务器的数量,甚至影响到用户的体验. 网站缓存按照存放的地点不同,可以分为客户端缓存. ...

  8. ASP.NET Core 缓存技术 及 Nginx 缓存配置

    前言 在Asp.Net Core Nginx部署一文中,主要是讲述的如何利用Nginx来实现应用程序的部署,使用Nginx来部署主要有两大好处,第一是利用Nginx的负载均衡功能,第二是使用Nginx ...

  9. ASP.NET 缓存技术分析

    缓存功能是大型网站设计一个很重要的部分.由数据库驱动的Web应用程序,如果需要改善其性能,最好的方法是使用缓存功能.可能的情况下尽量使用缓存,从内存中返回数据的速度始终比去数据库查的速度快,因而可以大 ...

  10. SXT分布式缓存技术公开课的观后感

    最近几天在研究Redis,Redis作为最近比较流行的缓存技术,其特点还是很明显的,Redis使用Key-Value的结构来存储数据,Redis也是内存型的数据库,数据一开始是保存在内存中的,通过某些 ...

随机推荐

  1. 记录--try...catch知识补全

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 说到try...catch都觉得非常熟悉了,不就是用来捕捉代码块中的错误嘛,平时也用得比较多的.然而因为了解不够多,我的面试却栽在了一个简 ...

  2. 记录--vue3 setup 中国省市区三级联动options最简洁写法,无需任何库

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 在写页面的时候,发现表单里面有一个省市区的 options 组件要写,因为表单很多地方都会用到这个地址选择,我便以为很简单嘛. 虽然很简单 ...

  3. 在 PostgreSQL 中,解决图片二进制数据,由于bytea_output参数问题导致显示不正常的问题。

    在 PostgreSQL 中,bytea_output 参数控制在查询结果中 bytea 类型的显示格式.默认情况下,bytea_output 的值为 hex,这意味着在查询结果中,bytea 类型的 ...

  4. 美团一面:说一说Java中的四种引用类型?

    引言 在JDK1.2之前Java并没有提供软引用.弱引用和虚引用这些高级的引用类型.而是提供了一种基本的引用类型,称为Reference.并且当时Java中的对象只有两种状态:被引用和未被引用.当一个 ...

  5. 舒服了,学习了,踩到一个 Lombok 的坑!

    你好呀,我是歪歪. 踩坑了啊,最近踩了一个 lombok 的坑,有点意思,给你分享一波. 我之前写过一个公共的服务接口,这个接口已经有好几个系统对接并稳定运行了很长一段时间了,长到这个接口都已经交接给 ...

  6. archlinux调整分区及ext4文件系统大小

    参照 https://wiki.archlinuxcn.org/wiki/Parted 1.防止数据丢失 有重要数据的话先备份,防止系统崩了数据没了 可以的话先在虚拟机练习一下 2.注意点 修改分区的 ...

  7. Django实现WebSocket在线聊天室(channels库)

    1.Django实现WebSocket在线聊天室 1.1 安装channels pip install channels==2.3 (saas) F:\Desktop\Python_Study\CHS ...

  8. 使用OHOS SDK构建assimp

    参照OHOS IDE和SDK的安装方法配置好开发环境. 从github下载源码. 执行如下命令: git clone https://github.com/assimp/assimp.git 进入源码 ...

  9. C# Replace方法

    例子: string tStw = "Run Status"; string tStw1 = tStw.Replace("Run Status", " ...

  10. 如何跑各种check

    如何进行 Fastcheck? 首先,导入环境变量: export CODE_BASE=/data/openGauss-server export BINARYLIBS=/data/openGauss ...