Bcache是Linux内核块设备层Cache,支持将一个或多个快速设备(如SSD NVME)作为一个或多个慢速设备(SATA HDD)的缓存设备.
阅读本文章你将学会:
- sgdisk 分区工具使用。
- Bcache添加、删除 缓存盘和数据盘。
- Bcache状态的查询。
- Bcache的缓存替换策略。
- Bcache的缓存模式。
部署环境说明
系统版本 | centos7.9 2009 |
---|---|
内核版本 | 3.10.0-1160.114.2.el7.x86_64 |
系统盘 | sda |
缓存盘 | sde |
数据盘 | sdb、sdc、sdd |
IP地址 | 192.168.1.100 |
整个部署过程我们将按如下步骤执行:
- 安装新版内核
- Bcache 配置和使用
- sgdisk 分区工具使用
- 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模型。
这里我们提起剧透下部署完成后的截图。
如果有兴趣可以自行思索完成,如果没有完成也不要气馁,下一章将介绍完整的部署流程。