该文首次发表于’盛大游戏G云’微信公众号上,现贴到本人博客,方便大家交流学习
带掉电保护的Rbd Cache方案
Ceph是一款开源的统一存储,在单一的系统上提供块、对象及文件存储接口。近年随着公有云/私有云的快速普及,凭借其自身良好的稳定性、扩展性及与Openstack的深度整合,Ceph Rbd块存储被大量的使用,作为VM的数据存储。有Ceph Rbd部署实践经验的IT工程师们对Rbd Cache一定不会陌生,它是Ceph Rbd客户端缓存,开启后能显著提高快设备i/o性能,但是它存在两个问题:
- 由于以内存作为缓存,缓存空间不能太大
- 还是因为以内存做缓存,所以存在掉电数据丢失的风险
为了克服原生Rbd Cache存在的上述不足,盛大游戏G云对Rbd Cache进行了改良,我们的方案是:用高速非易失存储介质(如:SSD、SAS)替换内存作为Rbd Cache,通过用空间换时间的方式,保证i/o性能并规避上述的缺陷。下文将对原生Rbd Cache及改良后的方案分别加以说明。
下文称未经修改的Ceph Rbd Cache为原生Rbd Cache,改良后的方案称为G云版Rbd Cache,引用的对象术语及代码片段来自Hammer Ceph-0.94.1
原生Rbd Cache
根据上述逻辑图,Rbd Cache是Ceph块存储客户端库librbd内实现的一个缓存层,主要提供读缓存和写合并功能,用来提高读写性能,默认情况下Rbd Cache处于开启状态。需要注意的是:Ceph既支持以内核模块方式动态地为Linux主机提供块设备,也支持以Qemu Block Driver的形式为VM提供虚拟块设备,本文描述的是第二种形式。下面我们来看看Rbd Cache的内部实现
上述逻辑图并未完整画出i/o流经的所有组件,还请读者注意。
Rbd Cache的实现机制
librbd模块内默认以4MB为单位对虚拟磁盘进行切分,每个4MB的chunk称为一个Object
,以ObjectExtent
为单位进行数据缓存;应用i/o通常会有不同的大小,每个i/o请求的数据以Object
为单位缓存到一个或多个ObjectExtent
中。Rbd Cache常用配置参数如下:
- rbd cache size : librbd能使用的最大缓存大小
- rbd cache max dirty : 缓存中允许的脏数据最大值,用来控制回写大小,不能超过rbd cache size
- rbd cache target dirty :开始执行回写的脏数据阀值,不能超过rbd cache max dirty
- rbd cache max dirty max :缓存中脏数据的最大缓存时间,用来避免因脏数据未达到