参考链接:
https://docs.ceph.com/en/latest/rados/operations/cache-tiering/#
Cache Tiering
Cache Tiering 是 Ceph 中一种自动分层存储的技术,其中有两种存储池:高速池(缓存池,由 SSD 等高速设备组成)作为缓存层、低速池(数据池,由 HDD 等低速设备组成)作为数据层。对于客户端来说,Cache Tiera 是无感知的,它们把数据发给 Objector Handles,并不关心数据是写到高速池或是低速池。这些内部数据流动由 tiering agent 来自动处理。数据分层的好处在于提高热点数据存储性能并且降低了存储成本(不需要全部使用SSD就能得到近似 SSD 性能)。缺点在于占用一定计算性能、数据IO。
自动分层存储的核心点在于:
- 数据访问行为的追踪、统计与分析
- 数据迁移
mode 模式
- writeback:写数据时直接写入缓存池,缓存池的数据会及时刷新到数据池;读数据也会直接访问缓存时,如果未命中,则会从数据池中把数据迁移到缓存池,在由缓存池返回给客户端。总结:客户端的读写请求都通过缓存池。
- readproxy: 读数据时,如果数据不在缓存池中,则会把客户端的读请求转发到数据层,由数据层返回数据给客户端。写操作直接使用数据池。
- readonly:读操作时使用缓存层,如果数据不在缓存池中,则会把响应数据从数据池中复制到缓存池中,再由缓存池返回给客户端。写操作直接使用数据池。
- none:禁用缓存层。
创建 Cache Tier
需要使用 crush 来指定一组全是 SSD 设备的 rule,创建 cache pool 池时需要指定该 crush rule。
设置缓存层和数据层。一个数据池可以设置多个缓存池,但是一个缓存池只能作为一个数据池的缓存。
那么有必要指定缓存的大小吗?这要视情况而定,如果你希望缓存池用到的 SSD 设备还能用于存储其他池的数据,那么应当为缓存池指定大小。
# 使用一整个存储池
ceph osd tier add {storagepool} {cachepool}
# 使用部分存储池,需要指明大小,单位 byte。(相当于设置 target_max_bytes)
ceph osd tier add-cache {storagepool} {cachepool} {cachesize}
# 从cachepool 中分配 1MB 空间做为 slowpool 的缓存
ceph osd tier add-cache slowpool cachepool 1024000
设置缓存层的模式。
ceph osd tier cache-mode {cachepool} {cache-mode}
# mode:writeback、readproxy、readonly、none
将所有客户端流量从数据池引导到缓存池。
ceph osd tier set-overlay {storagepool} {cachepool}
配置 Cache Tier
命令格式
ceph osd pool set {cachepool} {key} {value}
目标大小与类型
设置 hit_set_type 类型为布隆过滤器。
ceph osd pool set {cachepool} hit_set_type bloom
设置 hit_set_count 和 hit_set_period
hit_set_count:一段时间最多保留多少个 hit_set,访问记录
hit_set_period:hitSet覆盖的时间范围
ceph osd pool set {cachepool} hit_set_count 1
ceph osd pool set {cachepool} hit_set_period 3600
ceph osd pool set {cachepool} target_max_bytes 1000000000000
Cache 大小
Cache 代理主要提供两种功能:
- Flushing: 代理找出修改过(或脏)的对象、并把它们转发给存储池做长期存储。
- Evicting:代理找出未修改(或干净)的对象、并把最近最少使用过的对象从缓存池删除。
绝对大小
缓存分层代理根据缓存对象的字节总数刷新或者删除操作(用于削减缓存池大小),可指定最大字节数:
ceph osd pool set {cachepool} target_max_bytes {bytes}
# 用下列命令配置在达到 1TB 时缓存池满,不再接收读写请求:
ceph osd pool set hot-storage target_max_bytes 1000000000000
或者指定最大对象数量,超过此数量后,执行刷新或删除操作:
ceph osd pool set {cachepool} target_max_objects {#objects}
# 用下列命令配置对象数量达到 1M 时缓存池满,不再接收读写请求:
ceph osd pool set hot-storage target_max_objects 1000000
注意:Ceph不能自动确定缓存池的大小,所以这里需要配置绝对大小,否则f将无法工作。如果同时配置了 target_max_bytes 和 target_max_objects,那么缓存代理会在缓存池达到任何一个阈值后,立刻执行刷新或删除操作。当达到最大字节数或最大对象数后,客户端的请求将被阻塞。
相对大小
设置脏数据的最大比率,当达到该比率时,就会执行刷新或者删除操作。
ceph osd pool set {cachepool} cache_target_dirty_ratio {0.0..1.0}
#设置脏对象达到缓存池容量的 40% 就开始至执行刷新或删除
ceph osd pool set hot-storage cache_target_dirty_ratio 0.4
当缓存池利用率达到总容量的一定比例时,缓存分层代理会赶出部分对象以维持空闲空间。
ceph osd pool set {cachepool} cache_target_full_ratio {0.0..1.0}
# 设置为0.8
ceph osd pool set hot-storage cache_target_full_ratio 0.8
当脏对象达到容量的一定比例时,需要快速刷掉对象,可以设置这样一个高速刷新值,其大小在 cache_target_dirty_ratio 和 cache_targe_full_ratio 之间。
ceph osd pool set {cachepool} cache_target_dirty_high_ratio {0.0..1.0}
# 设置为 0.6 表示:脏对象达到缓存存储池容量的 60% 时,将开始更激进地刷回脏对象。显然,其值最好在 dirty_ratio 和 full_ratio 之间
ceph osd pool set hot-storage cache_target_dirty_high_ratio 0.6
缓存时长
设置每个脏对象的的缓存时间(单位为秒),超过该时间才能执行刷新操作。
ceph osd pool set {cachepool} cache_min_flush_age {#seconds}
# 设置脏对象至少延迟 10 分钟才能被刷新
ceph osd pool set hot-storage cache_min_flush_age 600
设置每个干净对象至少在缓存层中存活多久(单位为秒)。
ceph osd pool {cache-tier} cache_min_evict_age {#seconds}
# 设置干净对象至少存活30分钟
ceph osd pool set hot-storage cache_min_evict_age 1800
删除 Cache Tier
删除 readonly 模式的 Cache Tier
由于只读缓存池不含任何脏数据,因此直接禁用 Cache Tier 不会导致任何数据丢失。
# 1. 直接把模式改为 none
ceph osd tier cache-mode {cachepool} none
# 2. 删除缓存池标志,cachepool 依然存在,但不再作为 storagepool 的缓存池
ceph osd tier remove {storagepool} {cachepool}
删除 writeback 模式的 Cache Tier
因为此模式下,缓存层有大量脏数据,因此必须先把所有脏数据都刷新到数据层中。
-
将缓存模式更改为代理模式,以便新的和修改过的对象将刷新到后备存储池。
ceph osd tier cache-mode {cachepool} proxy
-
确保缓存池被刷新,需要手动执行
# 查看缓存池是否有对象 rados -p {cachepool} ls # 手动刷新 rados -p {cachepool} cache-flush-evict-ail
-
删除 overlay,这样客户端不会再访问缓存层
ceph osd tier remove-overlay {storagetier}
-
最后删除 缓存池
ceph osd tier remove {storagepool} {cachepool}