Ceph Cache Tiering
Ceph 缓存分层的基本思想是冷热数据分离,用相对快速/昂贵的存储设备如SSD盘,组成一个Pool来作为Cache层,后端用相对慢速/廉价的设备来组建冷数据存储池( Storage层)。
分布式的集群一般都采用廉价的PC与传统的机械硬盘进行搭建,所以在磁盘的访问速度上有一定的限制,没有理想的IOps数据。当去优化一个系统的I/O性能时,最先想到的就是添加快速的存储设备作为缓存,热数据在缓存被访问到,缩短数据的访问延时。Ceph也从Firefly 0.80版本开始引入这种存储分层技术,即Cache Tiering。
Ceph 缓存分层的理论基础,就是存储的数据是有热点的,数据并不是均匀访问的。也就是80%的应用只访问20%的数据,那么这20%的数据就称为热点数据,如果把这此热点数据保存到固态硬盘等性能比较高的存储设备上,那么就可以减少响应的时间。所以Cache Tiering的做法就是,用固态硬盘等相对快速、昂贵的存储设备组成一个存储池作为缓存层存储热数据,然后用相对慢速、廉价的设备作为存储后端存储冷数据( Storage层)。缓存层使用多副本模式, Storage层可以使用多副本或纠删码模式。
在Ceph 缓存分层中有一个分层代理,当保存在缓存层的数据变冷或不再活跃时,该代理把这些数据刷到Storage层,然后把它们从缓存层中移除,这种操作称为刷新(Flush)或逐出(Evict)。
如图所示, Ceph的对象管理器(Objecter,位于osdc即OSD客户端模块) 决定往哪里存储对象,分层代理决定何时把缓存内的对象"刷回" Storage层,所以缓存层和Storage层对Ceph客户端来说是完全透明的。需要注意的是, Cache Tiering是基于存储池的,在缓存层和Storage层之间的数据移动是两个存储池之间的数据移动。
目前Cache Tiering主要支持如下几种模式。
- 写回模式:对于写操作,当请求到达缓存层完成写操作后,直接应答客户端之后由缓存层的代理线程负责将数据写入storage层。对于读操作则看是否命中缓存层,如果命中直接在缓存层读,没有命中可以重定向到storage层访问,如果Object近期有访问过,说明比较热,可以提升到缓存层中。
- forward模式:所有的请求都重定向到Storage层访问。
- readonly模式:写请求直接重定向到Storage层访问,读请求命中缓存层则直接处理,没有命中缓存层需要从Storage层提升到缓存层中进而完成请求,下次再读取直接命中缓存。
- readforward模式:读请求都重定向到Storage层中,写请求采用写回模式。
- readproxy模式:读请求发送给缓存层,缓存层去Storage层中读取,获得Object后,缓存层自己并不保存,而是直接发送给客户端,写请求采用写回模式。
- proxy模式:对于读写请求都是采用代理的方式,不是转发而是代表客户端去进行操作,缓存层自己并不保存。
这里提及的重定向、提升与代理等几种操作的具体含义如下。
- 重定向:客户端向缓存层发送请求,缓存层应答客户端发来的请求,并告诉客户端应该去请求Storage层,客户端收到应答后,再次发送请求给Storage层请求数据,并由Storage层告诉客户端请求的完成情况。
- 代理:客户端向缓存层发送读请求,如果未命中,则缓存层自己会发送请求给Storage层,然后由缓存层将获取的数据发送给客户端,完成读请求。在这个过程中,虽然缓存层读取到了该Object,但不会将其保存在缓存层中,下次仍然需要重新向Storage层请求。
- 提升:客户端向缓存层发送请求,如果缓存层未命中,则会选择将该Object从Storage层中提升到缓存层中,然后在缓存层进行读写操作,操作完成后应答客户端请求完成。在这个过程中,和代理操作的区别是,在缓存层会缓存该Object,下次直接在缓存中进行处理。