Ceph Cache tiering 介绍

本文由Ceph中国社区-mingfire翻译、luokexue校稿 英文出处:Ceph Cache tiering Introduction 欢迎加入CCTG

Ceph是一个分布式和统一的存储平台。它在同一个系统中同时支持块、文件和对象存储。这些特点使得它对企业用户具有很大的吸引力。随着类似于SSD这样的快速、高价存储设备的出现,在企业存储市场中存储分层技术变得越来越重要。而Ceph也从Firefly0.80版本开始引入这一特性,即cache tiering.

Cache tiering希望通过使用快速存储设备作为比它存储容量更大的存储池的缓存来提升整体的IO性能。它使用快速昂贵的存储设备(现在大部分是SSD)创建一个存储池。这层为Cache层。而已经存在的后端存储池可以是纠删码池或者是副本池,由慢速便宜的存储设备组成。这层为storage层或者称为base层。Cache层维护有base层的一部分数据。架构如图1所示:

pic1

图 1 cache tiering architecture

Cache 层对客户操作来说是透明的。一旦把Cache层配置在storage层的上方,ceph客户端中”Objecter”组件把所有的IO都发往Cache层。如果Cache层中没有所需要的数据,那么该数据会从storage层提升到Cache层.在数据提升到Cache层后,再对其采取存取或更新操作。在cache tiering中有一个分层代理。当存在cache 层的数据变冷或不再活跃时,该代理把这些数据刷到storage层,最后把它们从cache层中移除。这些操作称为刷新(flush)和逐出(evict)。

在Firefly的初始版本中cache tiering支持模式:writeback模式和read-only模式:

  • Writeback mode:在这个模式中,数据从cache 层中读出和写入。当所访问的数据不在cache层时,数据会从base 层中提升到cache 层。在提升之后,将在cache 层上进行对该数据的所有IO操作,直至该数据变得不再活跃。然后他们会被上文提到的分层代理刷新和逐出到base 层。大部分场景都需要一致的更新数据,这时应该使用这一模式。
  • read-only mode:在这种模式下,写会被转发到base层。但是对于读操作,会在cache层中进行处理。类似于writeback模式,未命中的数据会被提升到cache层。在这种模式下,分层代理不会进行刷新操作,因为写操作总是在base层进行。然而,它还是会根据已定义好的策略对无效的数据进行逐出操作,以移出cache 层。这种模式在大多数是读的场景下可以发挥出更好的性能。

Cache tiering setup

为了设置cache分层,你需要有两个存储池:base层存储池和cache层存储池。假设已有base层存储池,可以按照五步安装cache 层:

  1. 把SSD作为OSD加入到集群当中
  2. 编辑crush map
  3. 创建cache层存储池
  4. 创建cache层
  5. 配置cache层

把SSD作为OSD加入到集群中

这一步是把OSD加入到ceph集群中的常规步骤。可以查阅官方文档来进行这一步(这里 和这里

编辑crush map

需要把新的buckets和rules加入到crush map中,这样cache tier存储池才可以利用SSD。下面是在拥有两个OSD节点的集群上增加新bucket和rule的例子,其中每个OSD节点上有4个SSD.

  • 新bucket

  • 新rules

关于定义bucket,rule以及各个区域的意义,可以查阅文档来获知其中细节。这些buckets和rules随着你的硬件配置而发生改变。但是你可以通过模拟当前crush map中现存的buckets和rules来把它们加入进去。

创建cache 存储池

这与创建一个常规的存储池步骤一样。但是别忘了在创建完存储池之后,设定规则为上一步创定的crush rule。如,为了使用上一步创定的id为3的’cachetier’rule,你应该执行以下命令:

创建cache 层

下面的3个命令用来创建cache层:

第一个命令把cache存储池作为storage存储池的cache层添加。第二个命令设置cache 模式为writeback或read-only。第三个命令设置对storage存储池的overlay属性,这样所有的IO都会发往cache存储池。

配置cache层

命中集配置

命中集记录在最近一段时间cache层被访问的对象。分层代理使用它来决定刷新和逐出操作。在生产环境中,ceph使用bloom filter类型的命中集,该类型集内部实现使用的是“bloom filter”数据结构。Hit_set_count定义了每秒每个命中集应该被访问几次,hit_set_period定义了这样的命中集应该存留多长时间。默认值分别是4和1200秒

cache 大小设置

有几个参数可以用来设置cache层的大小:target_max_bytes和target_max_objects。前者以字节数的方式用来设置cache 层的大小,后者以对象数的方式。无论达到哪一个限制,cache层都认为已满。cache_target_dirty_ratio用来控制什么时候进行刷新操作。当脏数据的字节数或对象数达到该比例时,分层代理开始进行刷新操作。cache_target_full_ratio参数与之相同,不过是达到相应比例后进行逐出操作。

cache tiering还有一些其他参数,如cache_min_flush_age’和‘cache_min_evict_age’。它们默认不需要设置,你可以在需要用的时候设置。

在经过前面的五步后,你可以在不改变客户端的情况下开始运行你的业务场景。你甚至可以在你的业务模型正在执行时同时进行cache tiering。也就是说,你可以在不暂停你的服务情况下,随意添加或移除cache tiering.

References

  1. http://ceph.com/docs/master/
  2. https://github.com/ceph/ceph

Leave a Comment

电子邮件地址不会被公开。