每天5分钟复习OpenStack(十四)Bcache技术<2>

Bcache是Linux内核块设备层Cache,支持将一个或多个快速设备(如SSD NVME)作为一个或多个慢速设备(SATA HDD)的缓存设备.

阅读本文章你将学会:

  1. sgdisk 分区工具使用。
  2. Bcache添加、删除 缓存盘和数据盘。
  3. Bcache状态的查询。
  4. Bcache的缓存替换策略。
  5. Bcache的缓存模式。

部署环境说明

系统版本centos7.9 2009
内核版本3.10.0-1160.114.2.el7.x86_64
系统盘sda
缓存盘sde
数据盘sdb、sdc、sdd
IP地址192.168.1.100

整个部署过程我们将按如下步骤执行:

  1. 安装新版内核
  2. Bcache 配置和使用
  3. sgdisk 分区工具使用
  4. ceph环境搭建

1 安装新版内核

#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

#3 查看内核菜单 
grep -i menuentry /boot/grub2/grub.cfg   |awk  '/centos/{print $1,$2,$3,$4}'
menuentry 'CentOS Linux (5.4.274-1.el7.elrepo.x86_64)
menuentry 'CentOS Linux (3.10.0-1160.71.1.el7.x86_64)
menuentry 'CentOS Linux (0-rescue-45b1851918a94e34bf77d7b2a0654430)

安装新内核之后,将会增加一行新菜单,菜单的默认启动是新版内核5.4菜单栏,如果想修改为旧版内核怎么办?

grub2-set-default 1 命令将帮助你自定义默认启动菜单。<注意>此时菜单是从0开始计数。

#5 重启
reboot 

#6 卸载旧版内核工具
rpm -e --nodeps  `rpm -qa |grep kernel |grep 3.10`

#7 检查
rpm -qa |grep kernel 
kernel-lt-5.4.274-1.el7.elrepo.x86_64

2 Bcache

2.1 编译安装工具包

#1 下载工具包
git clone https://evilpiepirate.org/git/bcache-tools.git

#最新版本下载地址
https://git.kernel.org/pub/scm/linux/kernel/git/colyli/bcache-tools.git/

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

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

#4 设置命令快捷键 bcache bcache-super-show
ln -sv /root/bcache-tools/make-bcache /usr/bin/bcache
ln -sv /root/bcache-tools/bcache-super-show /usr/bin/bcache-super-show

2.2 内核加载模块

#1 加载bcache 模块
modprobe bcache

#2 查看bcache 模块
lsmod |grep bcache

#3 设置模块开机自启动
cat > /etc/sysconfig/modules/bcache.modules << EOF
#!/bin/sh
modprobe bcache > /dev/null 1>&1
EOF

#4 加上执行权限
chmod 755 /etc/sysconfig/modules/bcache.modules

2.3 Bcache 配置

2.3.1 bcache 命令参数

# bcache 命令参数说明
# -C, --cache             Format a cache device #格式化缓存盘,
# -B, --bdev              Format a backing device #格式化 后端盘
--cache_replacement_policy=(lru|fifo) 
--writeback         enable writeback  #指定缓存模式为 writeback 

现在我们一条命令设置 缓存盘同时设置数据盘
bcache -C /dev/sde1 -B /dev/sdb
lsblk 查看对应关系


查看数据盘

#1 查看数据盘 sdb 
bcache-super-show /dev/sdb
sb.magic                ok
sb.first_sector         8 [match]
sb.csum                 E4399F0A8400142 [match]
sb.version              1 [backing device] #说明是后端设备 也就是数据盘

dev.label               (empty)
dev.uuid                94474839-81c7-4360-8739-875598992934 #自身的uuid 
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               cefe99b4-845e-4d66-8eb9-360ebdb93a7d  #后端设备对应的 缓存集合id 

查看缓存盘

#2 查看缓存盘 sde1 
bcache-super-show /dev/sde1
sb.magic                ok
sb.first_sector         8 [match]
sb.csum                 43D6BBB18C00DB9B [match]
sb.version              3 [cache device] #缓存设备 

dev.label               (empty)
dev.uuid                fc2fce6e-bfc7-408e-b433-2eac61d5079f #自身uuid 
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               cefe99b4-845e-4d66-8eb9-360ebdb93a7d #缓存设备所属的缓存集合id 与上面cset.uuid 一致。

在上面的参数中有选项指定 --cache_replacement_policy=(lru|fifo)

缓存替换策略:

bcache 中,缓存替换策略决定了缓存中的哪些数据块会被替换。当新的数据块需要被缓存但缓存空间不足时,缓存替换策略会决定哪一个旧的数据块会被移除缓存以腾出空间。bcache 支持两种主要的缓存替换策略:lru(Least Recently Used,最近最少使用)和 fifo(First In First Out,先进先出)。

LRU: 缓存替换策略基于一个简单的原则:最近最少使用的数据块最可能在未来一段时间内不再被访问。因此,当缓存空间不足时,LRU 策略会移除最近最少使用的数据块。

优点:

  • 能够有效利用缓存,适应常见的访问模式,例如局部性原理
  • 对于重复访问频繁的数据,LRU 可以将其保存在缓存中,减少访问延迟。

缺点

  • 在一些访问模式下(如循环访问大数据集),LRU 可能表现不佳。
  • 需要维护数据块的访问历史记录,可能导致较高的开销。

FIFO: 缓存替换策略基于时间顺序:最早进入缓存的数据块会最先被移出。当缓存空间不足时,FIFO 策略会移除最早被缓存的数据块。

优点:

  • FIFO` 实现简单,不需要维护复杂的访问历史记录。
  • 在某些简单的访问模式下,FIFO 可能表现良好。

缺点

  • FIFO 无法适应复杂的访问模式,例如热点数据。
  • 可能导致缓存命中率低,因为它不考虑数据的访问频率。

生产环境我们怎么选了?

  • 如果系统的访问模式比较复杂且有较强的局部性原理(即某些数据块被频繁访问),建议使用 LRU 策略,因为它能更有效地利用缓存。(数据库使用场景,电子商务站点数据等场景)
  • 如果系统的访问模式相对简单且不容易预测,或者您需要一个实现简单、开销较低的策略,可以考虑使用 FIFO 策略。((监控、日志系统等结构化数据场景)
访问模式总结

Wirteback : 写入数据时,写入缓存设备就返回成功,缓存设备由后台程序自动刷新到后端磁盘中。读/写都能使用缓存。

Wirtethrough: 写入数据时,缓存设备和后端同时写入成功才返回成功。仅能使用读缓存。

Writearound: 写入数据时,直接绕过缓存设备,直接写入后端磁盘,防止SSD 因写IO满而无法缓存读请求。 仅能使用读缓存。

2.3.2 bcahe 使用

当设置了缓存盘和后端盘之后bcache 就可以像使用普通盘一样使用bcache ,此时我们格式化,并挂载,并写入文件。

 #1 创建文件系统
 mkfs.xfs /dev/bcache0 
 #2 挂载
 mount /dev/bcache0  /data/
 #3 写文件验证
 dd if=/dev/zero of=/data/f1 bs=1M count=100

bcache 的状态:

  • no cache: 该backing device没有attach任何caching device
  • clean: 缓存集是干净的,没有缓存脏数据,此时模式一般是Writethrough
  • dirty:缓存集的一部分,存在缓存的脏数据。此时的模式一般是 Writeback
  • inconsistent: 遇到问题,后台设备与缓存设备不同步

开始默认的模式是Writethrough ,此时状态是clean

改变模式为writeback

写入数据之后

根据上面的图片可知 echo <模式 > /sys/block/bcache0/bcache/cache_mode 则可以查看和改变模式。同理
echo <缓存集> /sys/block/bcache0/bcache/detach 则可以剥离设备

2.3.2.1 删除数据盘完整操作
#1 获取后端设备的缓存集uuid 
bcache-super-show /dev/sdb |grep cset.uuid #获取缓存集uuid 

#2 剥离设备
echo cefe99b4-845e-4d66-8eb9-360ebdb93a7d > /sys/block/bcache0/bcache/detach  

[root@192-168-48-128 mnt]# bcache-super-show /dev/sdb |grep cset.uuid
cset.uuid               cefe99b4-845e-4d66-8eb9-360ebdb93a7d

#3 停止设备
echo  1 >  /sys/block/bcache0/bcache/stop 

#4 格式化数据
dd if=/dev/zero of=/dev/sdb bs=1M count=1 conv=sync
wipefs -af /dev/sdb

【注意】上述只是删除了后端数据盘的数据,此时缓存设备还没有删除。

2.3.2.2 删除缓存设备完整操作
#1 获取缓存设备的uuid 
 bcache-super-show /dev/sde1 |awk '/cset.uuid/{print $2}'
 cefe99b4-845e-4d66-8eb9-360ebdb93a7d
 
#2 剥离缓存设备
echo 1 > /sys/fs/bcache/cefe99b4-845e-4d66-8eb9-360ebdb93a7d/unregister 

#3 格式化数据
dd if=/dev/zero of=/dev/sde1 bs=1M count=1 conv=sync
wipefs -af /dev/sde1
2.3.2.3 添加设备

此时我们将缓存设备的第4个分区sde4作为bcache 的缓存设备,而将sdb sdc sdd 三块盘做为数据盘来使用,他们分别对应bcache0 bcache1 bcache2 。

#1 添加缓存设备同时添加后端磁盘
bcache -C /dev/sde4 -B /dev/sdb --writeback --wipe-bcache

#2 只添加后端磁盘
bcache -B /dev/sdc --writeback --wipe-bcache
bcache -B /dev/sdd --writeback --wipe-bcache

#3 注册设备,使用其显示块设备,(lsblk 如果已经显示为bcache1 bcache2,可以不用执行)
echo /dev/sdb > /sys/fs/bcache/register
echo /dev/sdc > /sys/fs/bcache/register
echo /dev/sdd > /sys/fs/bcache/register

#4 查看缓存设备对应的缓存集合
#查看缓存设备的集合
[root@mon01 ~]# bcache-super-show /dev/sde4
sb.magic                ok
sb.first_sector         8 [match]
sb.csum                 EB598382C6FDDDE2 [match]
sb.version              3 [cache device]

dev.label               (empty)
dev.uuid                9bb977e9-507d-4e44-80f6-5af00bdc4a5b
dev.sectors_per_block   1
dev.sectors_per_bucket  1024
dev.cache.first_sector  1024
dev.cache.cache_sectors 83881984
dev.cache.total_sectors 83883008
dev.cache.ordered       yes
dev.cache.discard       no
dev.cache.pos           0
dev.cache.replacement   0 [lru]

cset.uuid               b41fd054-a5f0-48d9-bb5d-4ed570c0ec47


#bcache0 已经附加到缓存集中,此时只需要附加 bcache1 和bcache2 既可
#将缓存设备的缓存集合 发送到 /sys/block/bcache1/bcache/attach
echo b41fd054-a5f0-48d9-bb5d-4ed570c0ec47  > /sys/block/bcache1/bcache/attach
echo b41fd054-a5f0-48d9-bb5d-4ed570c0ec47  > /sys/block/bcache2/bcache/attach
2.3.2.4 检查状态

bcache-super-show /dev/sdb
bcache-super-show /dev/sdc
bcache-super-show /dev/sdd

2.4 分区工具

2.4 缓存盘分区
#1 安装gdisk工具
yum install gdisk 

#2 使用sgdisk 工具来分区

sgdisk工具参数说明

sgdisk --new=1:0:+20GB \
       --change-name=1:'ceph journal' \
       --partition-guid=1:$(uuidgen) \
       --typecode=1:45b0969e-9b03-4f30-b4c6-b4b80ceff106 \
       --mbrtogpt \
       -- /dev/sde

-n, --new=partnum:start:end  #创建一个新的分区 指定分区编号partnum ,star end 指定起始位置 此时是从0开始+20G
-c, --change-name=partnum:name #改变分区的名字 修改分区1 的名字为 ceph journal 
-u, --partition-guid=partnum:guid #设置分区的guid的编号,此时为随机生成uuid,由uuidgen 命令自动生成。
-t, --typecode=partnum:{hexcode|GUID} # 修改指定分区号的 类型代码 此时45b0969e-9b03-4f30-b4c6-b4b80ceff106 在这里表示 Ceph 的 Journal 分区类型。
也可以表示ROCKDB 和WAL类型
-g, --mbrtogpt 转换分区格式由 MBR 变成 GPT  

缓存盘分区:
此时我们将缓存盘sd4 划分了4个分区,其中sde1 sde2 sde3 三个分区分别对应接下来要部署的ceph 的三个osd 磁盘的 block.db 。而sde4 作为bcache 缓存设备的缓存盘来使用。

#1 设置变量
typecode=45b0969e-9b03-4f30-b4c6-b4b80ceff106

#2 创建第一个分区
sgdisk --new=1:0:+20GB --change-name=1:'DB and WAL' --partition-guid=1:$(uuidgen) --typecode=1:$typecode --mbrtogpt  -- /dev/sde

#3 创建第二个分区
sgdisk --new=2:0:+20GB --change-name=2:'DB and WAL' --partition-guid=2:$(uuidgen) --typecode=2:$typecode --mbrtogpt  -- /dev/sde

#4 创建第三个分区
sgdisk --new=3:0:+20GB --change-name=3:'DB and WAL' --partition-guid=3:$(uuidgen) --typecode=3:$typecode --mbrtogpt  -- /dev/sde

#最后一个分区使用使用剩余所有的磁盘
sgdisk --new=4:0: --change-name=4:'bcache' --partition-guid=4:$(uuidgen) --typecode=4:$typecode --mbrtogpt  -- /dev/sde

写在最后:

如果执行到这里,说明Bcache的所有的操作已经完成,接下来只需要部署一个ceph 集群,然后再将Bcache 作为ceph 存储的数据盘即可完成一个在生产环境中使用的最小化的Ceph模型。

这里我们提起剧透下部署完成后的截图。

如果有兴趣可以自行思索完成,如果没有完成也不要气馁,下一章将介绍完整的部署流程。
在这里插入图片描述

  • 12
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值