本文为Ceph中国行•武汉站上,杉岩数据高级研发工程师花瑞做的内容分享,闲言少叙,直接上干货。
目前在使用Ceph中使用SSD的方式主要有两种:cache tiering与OSD cache,众所周知,Ceph的cache tiering机制目前还不成熟,策略比较复杂,IO路径较长,在有些IO场景下甚至还会导致性能下降,promotion的粒度较大也有较多的负面影响。所以在SSD的使用上,我们选择了给OSD所在块设备加速的方式。
在Linux内核块层,使用SSD给HDD块设备加速,目前较为成熟的方案有:flashcache,enhanceIO,dm-cache,bcache等。
2.1特性对比
在这几种开源方案中,前三种的cache块索引算法都比较相近,都是基于hash索引,主存数据块到缓存块采用的是组相联的映射方式。下表以flashcache/enhanceIO为例,与bcache作了简单对比。
Bcache与其它几种方式最大的不同之处在于,它采用一棵相对标准的B+树作为索引,命中率会有很大提高,同时,它在架构设计上考虑了SSD本身的一些特性,在最大程度上发挥SSD性能的同时,也保护了SSD的寿命,也就是对SSD闪存介质的亲和性较好。
2.2可管理性/可维护性对比
Bcache官方给出的性能对比数据,可参考以下链接:
http://www.accelcloud.com/2012/04/18/linux-flashcache-and-bcache-performance-testing/
下图是杉岩在单机环境做的一个简单的测试,表现了在尽量能命中cache的情况下,二者的性能差异。集群环境下,性能差异接近单机版,在读写都能命中缓存的情况下,比较接近纯SSD集群的性能。
前面介绍了bcache在Ceph中为OSD加速的方案。现在我们来介绍一下bcache的内部逻辑,便于我们理解bcache性能优势的来源。
3.1 SSD上数据的Layout
如图所示,bcache将SSD空间分成若干个bucket(典型值为512K,最好与SSD本身擦除块大小一致)。缓存数据与元数据都是按bucket来管理的:
3.2 Bcache的索引
Bcache用B+树来管理缓存数据与HDD上数据块的对应关系,B+树所索引的k-v结构在bcache中称为bkey。如下图所示:
3.3 垃圾回收
前面介绍bcache的分配器是以bucket为单位的COW式的分配,对与已经在SSD中的数据以及元数据,覆盖写时是写到新的空间中的,这样无效的旧数据就会在其所在的bucket内形成“空洞”,但是由于bcache空间回收的单位是bucket,因此需要一个异步的垃圾回收(GC)线程来实现对这些数据的标记与清理,并将含有较多无效数据的多个bucket压缩成一个bucket。
GC分为两个阶段:
3.4 刷脏机制
使用bcache的writeback模式时,bcache会为缓存池中的每个HDD启动一个刷脏线程,负责将SSD中的脏数据刷到后端的HDD盘。
Bcache的内部实现比较复杂,代码复杂度也比flashcache/enhanceIO等要高出不少,而且已经合入内核主线,在高版本内核(4.8及以上)上还是比较稳定可靠的,但是在Ceph系统中为OSD加速,还有一些问题需要解决:
4.1功能问题
4.2性能问题
我们在使用bcache加速ceph OSD时,采取如上图所示的方式:
我们通过大量测试及分析使得bcache在ceph的生产环境上得以稳定运行,既最大限度地发挥了SSD的性能,同时,也提升了SSD的使用寿命,节省用户投资,为客户提供了更具性价比的混合存储方案。