缓存层模式
后端存储无论是erasure-coded或者经济性的存储层。ceph objecter控制对象的存储位置,tiering agent控制什么时间将对象从缓存层刷入到后端存储。管理员配置不同的缓存模式及
- writeback
ceph客户端将数据写入缓存层并从缓存层获取相应的ACK。之后数据会从缓存层写入到后端存储。当ceph客户端需要存储层中的数据时,cache tiering agent会将数据迁移到缓存层。然后再将数据发送到ceph客户端。此后,ceph客户端可以使用缓存层执行I/O,直到数据变为非活动状态。(对图片、视频编辑,事务性处理很有用。) - readproxy
该模式下会使用缓存中现存的所有的对象,如果请求的对象并未在缓存层中,将会将请求代理到后端的存储。这对于从writeback转换到禁用缓存非常有用,因为它允许工作负载在缓存耗尽时正常工作,而无需向缓存添加任何新对象。 - readonly
仅在读操作时使用缓存,写操作时直接写入到后端存储。该模式适用于不需要存储系统强制一致性的只读工作负载。后端存储中对对象进行更新时,并不会导致缓存中的数据更改。该功能目前出于实验阶段,若使用需要添加–yes-i-really-really-mean-it-mean-it. - none
禁用缓存。
提醒事项
缓存层会降低大部分负载的性能表现。用户需要在使用这些特性的时候特别注意。
- 负载
缓存层提升性能是高度依赖负载类型的。因为将数据迁移到缓存和迁出缓存需要开销,只有在大多数请求只涉及少数对象时,它才能发挥出其优势。缓存池应足够大,以捕获工作负载的工作集,以避免抖动。 - 难以衡量基准
用于用户衡量性能的大多数基准都会显示缓存层带来的糟糕的表现,因为只有很少的一部分的请求是一个小的对象集,这就需要花费很长的时间使得缓存层变得“warm up”,这样的开销会很大。 - 通常会更慢
对于不支持缓存分级的工作负载,性能通常比未启用缓存分级的正常RADOS池要慢。 - librados object enumeration(对象枚举)
在这种情况下,librados级别的对象枚举API并不一致。如果应用程序直接使用librados并依赖于对象枚举,那么缓存分层可能无法正常工作。(这对于RGW、RBD或cepfs来说不是问题。) - complexity
启用缓存分层意味着在RADOS集群中使用了大量额外的机制和复杂性。这增加了您在系统中遇到其他用户尚未遇到的错误的可能性,并将您的部署置于更高的风险级别。 - 较好的负载类型
RGW time-skewed:如果RGW工作负载是几乎所有的读操作都指向最近写入的对象,那么一个简单的缓存分层配置可以很好地工作,即在一段可配置的时间后,将最近写入的对象从缓存中删除到后端存储层。 - 较差的负载类型
replicated cache的erasure-coded RBD存储:这是比较普遍的情况,表现并不是很好。即使是合理倾斜的工作负载也会向cold对象发送一些小的写操作,因为小的写操作还不被erasure-coded所支持。为了满足一个小的(通常是4 KB)写操作,整个(通常是4 MB)对象必须迁移到缓存中。只有少数用户成功地部署了这种配置,而且它只适用于他们,因为他们的数据非常冷(备份),而且他们对性能不敏感。 - replicated cache的replicated RBD存储:后端存储采用副本机制比采用erasure-coded性能会好一点,但是依然依赖负载类型,同时很难验证。用户需要对他们的负载有很好的理解,需要仔细调整缓存分级的参数等。
存储池设置
设置缓存层,你必须拥有2个存储池。一个作为后端的存储,一个作为缓存存储池。
设置后端存储池:设置后端存储池包含以下两种特别的场景
- 标准存储:replicated pool
- erasure coding:erasure pool以较小的性能代价更有效的存储数据
在标准存储的场景中,你可以设置CRUSH故障域。Ceph OSD守护进程在规则中的所有存储驱动器都具有相同的大小、速度(rpm和吞吐量)和类型时执行最佳。有关创建规则的详细信息,请参阅CRUSH Maps。创建规则后,需要创建后端存储池。
在擦除编码场景中,池创建参数将自动生成适当的规则.
在后面的示例中,我们将把后备存储池称为冷存储。
设置缓存存储池
创建缓存存储池的步骤和创建标准存储池的步骤一致,不同的部分在于缓存的磁盘驱动采用性能更好的磁盘,依赖服务器和CRUSH rule。当设置了规则,它应该考虑具有高性能驱动器的主机,而忽略没有高性能驱动器的主机。
官网链接