ceph cache teir配置模式以及参数说明

这里简单解释一下ceph的cache tier
这里可以叫做ceph的缓存层,为了提高整个ceph集群的IO能力,可以在普通机械硬盘上加一层高速的SSD缓存,客户端读写数据的时候直接请求到SSD高速缓存上,所以直接感官就是读写响应更快了。
ceph cache teir配置模式以及参数说明_第1张图片

几种配置模式

  • writeback mode:当配置为writeback模式时,ceph客户端将数据写入到缓存层并且从缓存层得到已经写入的确认信息。在缓存层中的数据会及时迁移到存储层并且刷新缓存层。当读取数据时,如果数据在缓存层,那么直接在缓存层操作数据,如果缓存没有所需数据,则从存储层将数据读取到缓存层,然后发送给客户端。

  • readproxy mode :当配置为此模式时,如果数据在缓存层,则直接操作缓存中的数据,如果不在缓存层,则去存储层操作。假如突然禁用了缓存模式,这种模式则很有用,因为可以直接可以请求存储层。而且在这种模式下,就算缓存耗尽,ceph集群也会从存储层继续提供读写,这样只是IO性能下降了,但是IO还可以继续响应。

  • readonly mode:当配置为readonly模式时,Ceph客户端在写数据的时候,直接将数据写入到后端存储层。当读取数据时,Ceph会将请求的对象从存储层复制到缓存层。当在存储层中更新对象时,Ceph不会将这些更新同步到缓存层中相应的对象,所以这个模式在生产环境不推荐使用。

  • none: 禁用缓存模式。

创建一个有缓存层的池
ceph osd tier add {storagepool} {cachepool}

当添加了缓存层后,需要将强求重新定向到缓存层
ceph osd tier set-overlay {storagepool} {cachepool}

缓存层配置参数:
ceph osd pool set {cachepool} {key} {value}

Ceph生产环境缓存层的hit_set_type算法使用了Bloom Filter,此参数含义是启用缓存层的命中集合跟踪
ceph osd pool set {cachepool} hit_set_type bloom
可以设置为bloom, explicit_hash, explicit_object

hit_set_count:缓存层存储的命中集(hitset)数量,设置越大,ceph-osd进程占用内存的量越大。
hit_set_period:缓存层中命中集(histset)多久被覆盖重写,也就是存储的时间周期
如下设置

eph osd pool set {cachepool} hit_set_count 12
ceph osd pool set {cachepool} hit_set_period 14400
ceph osd pool set {cachepool} target_max_bytes 1000000000000

min_read_recency_for_promote:在处理一个对象的读操作时检查多少个 HitSet ,检查结果将用于决定是否异步地提升对象。它的取值在 0 和 hit_set_count 之间,如果设置为 0 ,对象会一直被提升;如果设置为 1 ,就只检查当前 HitSet ,如果此对象在当前 HitSet 里就提升它,否则就不提升;设置为其它值时,就要挨个检查此数量的历史 HitSet ,如果此对象出现在 min_read_recency_for_promote 个 HitSet 里的任意一个,那就提升它。min_write_recency_for_promote和min_read_recency_for_promote 类似

ceph osd pool set {cachepool} min_read_recency_for_promote 2
ceph osd pool set {cachepool} min_write_recency_for_promote 2

注意:min_read_recency_for_promote和min_write_recency_for_promote的值越高,统计的周期越长,ceph-osd进程消耗的RAM越多。特别是,当代理忙于刷新或逐出缓存对象时,所有hit_set_count HitSet都会加载到内存中。

cache尺寸

  • Flushing:将脏数据从缓存层刷入存储层。
  • Evicting:识别没有修改的(干净的)对象,并将最近最少用的对象其驱逐出缓存层。

高速缓存层可以通过指定总字节数或对象来刷新或逐出对象。
指定字节数:
ceph osd pool set {cachepool} target_max_bytes {#bytes}

在1T时开始刷新或者驱逐
ceph osd pool set hot-storage target_max_bytes 1099511627776

指定对象总数:
ceph osd pool set {cachepool} target_max_objects {#objects}

在对象达到1000000时开始刷新或者驱逐
ceph osd pool set hot-storage target_max_objects 1000000

注意:ceph不能自动决定缓存层的大小,所以需要配置固定的大小,否则,刷新和驱逐不会工作。如果上面2个参数都指定了,那么那个参数先达到,就先触发刷新或者驱逐。另外,在刷新和驱逐的时候,客户端的请求会被阻塞。

相关脏数据刷新和移除参数
缓存层也可以指定在以上arget_max_objects和arget_max_bytes固定大小的情况下,更具这个池子脏数据的百分比进行刷新和驱逐。
当脏数据超过池子指定的百分比,会发生刷新操作,如脏数据达到池子40%会触发普通刷新
ceph osd pool set {cachepool} cache_target_dirty_ratio 0.4

当脏数据达到池子指定的百分比,会发生高速刷新操作,如达到池子的60%会触发高速刷新,这个值通常设置为cache_target_dirty_ratio和cache_target_full_ratio之间。
ceph osd pool set {cachepool} cache_target_dirty_high_ratio 0.6

当脏数据达到这个参数指定的百分比,会移除未修改(干净)的数据,如达到80%会移除数据
ceph osd pool set {cachepool} cache_target_full_ratio 0.8

缓存时间
设置脏数据刷新到存储层的最小时间,比如设置10分钟后执行刷新
ceph osd pool set {cachepool} cache_min_flush_age 600

设置对象被驱逐的最小时间,比如设置30分钟后驱逐对象
ceph osd pool {cache-tier} cache_min_evict_age 1800

移除缓存池
根据使用的模式不同,移除方式也不同

移除一个read-only的缓存池,因为这个模式不存储数据修改,禁用后直接移除即可

  1. 上面讲过,禁用设置为none即可
    ceph osd tier cache-mode {cachepool} none

  2. 从存储层移除缓存池
    ceph osd tier remove {storagepool} {cachepool}

移除WRITEBACK模式的缓存池
因为这个模式下存在被修改的数据,所以需要先把这些修改的数据刷新到存储层,然后再禁用移除。

  1. 修改缓存池到proxy模式,
    ceph osd tier cache-mode {cachepool} proxy

  2. 确保缓存池被回刷
    rados -p {cachepool} ls
    如果缓存池仍然有对象存在,可以通过手动刷新,刷新到存储池
    rados -p {cachepool} cache-flush-evict-all

  3. 移除重定向,使客户端不再去缓存层交互
    ceph osd tier remove-overlay cold-storage

  4. 最后,移除缓存池
    ceph osd tier remove {storagepool} {cachepool}

参考:http://docs.ceph.com/docs/master/rados/operations/cache-tiering/

你可能感兴趣的:(#,storage)