btrfs on top of bcache

留学咨询专家王觉菊老师

bcache是用ssd拯救机械硬盘的低速度。

可以是一对一的cache

也可以是一个cache盘对多个被cache盘的一对多cache,不可以多个cache盘对一个被cache盘来作cache,也就是不可以多对一的cache。

经过广泛的阅读,以及在原来基于btrfs的nas系统被恶心了之后,决定直接上对btrfs提供原生支持的opensuse。

自己来配置。当然,借助于opensuse的yast 2这个可视化的工具,以及里面提供的patitioner(磁盘分区)套件,管理起磁盘来就很容易了。

读了以下suse官方的blog,他们说了,从leap15。1开始就可以方便的使用他们的这个磁盘分区工具来创建和管理bcache了。

我的bcache是这样的,因为想提升NAS的读取效率(NAS的使命就是存很多文件让人读阿),所以,在一组的机械盘之前,设置一个ssd固态硬盘作为bcache,成为一个bcache 组,这个固态盘就叫做bcache set device,因为它要cache一个set(一组,最少一个)的机械硬盘。

创建bcache之前,要确保你被cached磁盘没有数据,没有分区,没有文件系统,当然,也就要没有mount。当然,这个bcache set devices也要如此三无。

然后,就开始了。

这个固态盘是,dev/sdb

其他三个硬盘如下:

dev/sdc

dev/sde

dev/sdf

其中,dev/sde和dev/sdf是同一个容量同一个品牌同一个型号的机械盘。

先作sdc,选择,backing device  为dev/sdc,cache device 为dev/sdb

直接下一步,ok了。

就出现了一个dev/bcache0

然后,继续如上操作,在sde,sdf

于是,就出现了 dev/bcache1, dev/bcache2

上个图

sdb             8:16   0   477G  0 disk
├─bcache0     253:0    0   7.3T  0 disk
│ └─bcache0p1 253:1    0   7.3T  0 part
├─bcache1     253:128  0   4.6T  0 disk
└─bcache2     253:256  0   4.6T  0 disk
sdc             8:32   1   7.3T  0 disk
└─bcache0     253:0    0   7.3T  0 disk
  └─bcache0p1 253:1    0   7.3T  0 part
sdd             8:48   1   7.3T  0 disk
sde             8:64   1   4.6T  0 disk
└─bcache1     253:128  0   4.6T  0 disk
sdf             8:80   1   4.6T  0 disk
└─bcache2     253:256  0   4.6T  0 disk

所以,可以看到,sdb,有一组的cache,bcache0,bcache1,bcache2,当然随着被cache的机械盘的增加,还可以有bcache3,bcache4……

实际上纯粹的read cache,我觉得一个512G的固态盘可以给很多个机械盘作cache的。

然后大家可以看到,sdc,是bcache0,sde,bcache1,sdf,bcache2。

这是什么意思呢,就是说,在创建了bcache之后,这个固态硬盘(其中的部分)和这个机械硬盘,就组成了一个整体的读写体系,可以看成一个物理磁盘了。

其实,现在硬盘厂商在机械盘上也是这么搞的,比如,像我们买硬盘,希捷的8T酷狼,256M缓存,就是这个256M的cache啦,当然,他们的内部电路,闪存芯片,这些我们不考虑,我们之考虑做成之后的成果。(这点我还要再研究一下)

现在我们在这个机械盘的前面,加一个bcache,组成了一个bcache磁盘序列。

我们可以把这个作缓存的盘看成是分成了,0,1,2,3,……这么多个cache的部分,

所以,sdb0+sdc=bcache0

              sdb1+sde=bcache1

              sdb2+sdf=bcache2

       ……

然后,我们以后的操作,对于系统而言,就是bcache0,bcache1,bcache2,bcache3……这些是一个磁盘了。

所以,在fdisk -l里面,我们可以看到,dev/bcache0 这样的存在。就是,sdb,sdc,sde,sdf,它们是一个盘,但是,bcache0,1,2,也是一个盘,如下,fdisk -l。但是我们现在实际操作的就是,dev/bcache0,dev/bcache1,dev/bcache2,这三个盘(组合)了。

Disk /dev/sdb: 477 GiB, 512110190592 bytes, 1000215216 sectors
Disk model: Samsung SSD 850
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/sdc: 7.3 TiB, 8001563222016 bytes, 15628053168 sectors
Disk model: ST8000VN0022-2EL
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/sdd: 7.3 TiB, 8001563222016 bytes, 15628053168 sectors
Disk model: ST8000VN0022-2EL
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/sde: 4.6 TiB, 5000981078016 bytes, 9767541168 sectors
Disk model: ST5000LM000-2AN1
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/sdf: 4.6 TiB, 5000981078016 bytes, 9767541168 sectors
Disk model: ST5000LM000-2AN1
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes

Disk /dev/bcache0: 7.3 TiB, 8001563213824 bytes, 15628053152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: A59107A9-9414-4CA4-AD81-3D69DEADE6F2

Device         Start         End     Sectors  Size Type
/dev/bcache0p1  2048 15628053118 15628051071  7.3T Linux filesystem


Disk /dev/bcache1: 4.6 TiB, 5000981069824 bytes, 9767541152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/bcache2: 4.6 TiB, 5000981069824 bytes, 9767541152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

所以,上面我们就把bcache盘组的创建搞完了。

不过要注意的一点是,因为我是要用btrfs,所以,在cache的策略方面我选择的是writeback。

一共有三种cache策略,writethrough,writearound,writeback。

writethrough,cache和后端都确认写入,才完成写入;写完之后立即要读取的app适合。但是写入速度最慢。不存在数据丢失问题。这个一般是默认选项。所以,这个不能翻译成写过去(write through),应该翻译成,写透(write through,写得透透的,cache和data盘都写入了,就算写透了,才确认)

writearound,cache写入,就算完成写入,对于写入速度要求很高,而对于数据的完整性风险耐受性比较高的app适合。如果在中间出现断电,或者cache盘出错的情况下,那么,data盘可能就有些数据没有写入。一般ssd出错的机会比较小,但是,断电的可能性对于家庭用户的很高。这个writearound可以翻译成,得空再写。

writeback,直接写入后端的机械盘。所以,存在的问题是,cache里面开始没有data的cache,所以,写入之后立即要读取就会和data机械盘一样的速度了。所以,这个writeback直译就行,写后端。所以,其实writeback改称,writebackend会更容易区分一些。

当然,这种cache和数据的写入策略,也不只是bcache的独有。其他cache系统也要讲究它的写入策略。但是,好像其他cache系统不如bcache这么热。

看了一些资料,对于btrfs这种cow(copy on write)的文件系统,(当然,在yast的分区工具里面,已经可以选择对btrfs分区设置no-cow,就是不要copy on write了,因为copy on write限制了文件系统的性能),在bcache里面再作一个writethrough,也就是有点多余了,这个是stackoverflow和reddit上面有些大神的观点,我对与btrfs和zfs这种cow还没有仔细去学习他们的运作原理,所以就跟着人家弄,所以,我的bcache都是采用的writeback策略,直接写入后端。

然后,就是创建文件系统了。现在有几个bcache0,1,2的高性能固态与机械硬盘的bache组合盘了,但是还没有文件系统。所以,我们就可以在这上面创建文件系统了。

比如,看我上面的lsblk信息,可以看出来,我的bcache1和bcache2,是一个btrfs文件系统,做了raid0。

bcache0也是一个btrfs文件系统,没有raid,就是single了。

那么,这个是btrfs的raid 在bcache之上 (on top of)。也就是,bcache1 和bcache2组成了raid0。当然也可以选raid1,但raid10的话两个盘不够玩的了。另外,btrfs这个文件系统的raid5/6还没有生产化,openSuse的yast的图形界面是不支持的。当然,你要用command就肯定没问题了。btrfs的那些tools的命令,自己搞起来。

但是btrfs的raid5/raid6据说存在write hole,写入洞的问题,所以,可能导致一些大麻烦。官方不建议生产环境下使用。据说zfs也有这种问题。各种软raid 5和raid6据说都有。不知道那些raid卡的是不是有。另外,看了一些资料,据说raid 5在如今这种硬盘数据动辄数个数十个Tb的情况下,如果有硬盘出问题了,还盘之后要重建(balance)很麻烦,特别慢。所以,好像很多有钱的克金玩家都高ceph这种分布式blocks存储系统了。要真的搞设备,太贵了,也麻烦,几个文件服务器下来,然后再就是那些硬盘,还有如果搞ceph再用1000M的家庭局域网,就有些恶搞了。肯定得上光纤了。可是家用用光纤干啥呢?烧得荒嘛。如果只是想学习,用vm群组玩一下ceph也是可以的。

回到上面的btrfs raid on top of  bcache,还有人问过,是不是可以bcache on top of mdadm raid。也就是,机械盘b,c,d,e,……先组成一个raid,那么这个raid就是一个dev/sdr了。然后,再用一个固态盘去bcache它,组成一个bcache+raid=bcacheraid的组合。看了下stackoverflow和reddit等大神云集的地方,他们的讨论是可以这么玩。既然可以cache单个盘,当然也可以cache多个盘合成的阵列,阵列反正是看作一个盘阿。还有,现在的硬盘,不就是以前多个硬盘的碟片,用raid0封装到一个硬盘的盒体里嘛。现在一般一个硬盘里面最多好像是7个碟片(?)。

不过我不知道bcache on top of raid的意义在于哪里?是对于write back的性能要求特别高吗?也许是吧,4个盘(256M缓存)作raid0的话,写入速度就差不多可以达到一般sata固态盘的水平了吧(?)。

不管了,反正我现在是btrfs raid 0 on top of bcache了。

要玩bcache on top of raid也不够盘玩阿。

最好玩的是,bcache on top of raid,然后再btrfs raid on top of bcache。那btrfs到真正的数据硬盘,就是2层raid了。

有点意思。想到这个,竟然有点小期待呢。

 

标签

分类