缓存池通过创建一个逻辑层,将热点数据从较慢的存储介质(如 HDD)移动到更快速的存储介质(如 SSD)。当客户端请求数据时,首先在缓存池中查找,如果命中缓存,则直接返回数据,否则从后端存储池获取数据,并将数据写入缓存池以备后续访问。
由于长期无人维护,缓存分层在 Reef 版本中已被弃用。
Ceph 支持多种缓存策略,包括:
特点:
工作原理:
特点:
工作原理:
配置 Ceph 缓存池的步骤包括创建缓存池和关联缓存池与后端存储池。以下是基本的配置步骤:
ceph osd pool create my_cache_pool 128
ceph osd tier add libvirt-pool cache_pool
ceph osd tier cache-mode cache_pool writeback
这个命令用于将客户端的数据读写请求重新定向到缓存池上
ceph osd tier set-overlay libvirt-pool cache_pool
ceph osd pool set cache_pool hit_set_type bloom
ceph osd pool set cache_pool hit_set_count 1
ceph osd pool set cache_pool hit_set_period 3600
ceph osd pool set cache_pool target_max_bytes 10737418240
ceph osd pool set cache_pool target_max_objects 10000
ceph osd pool set cache_pool min_read_recency_for_promote 1
ceph osd pool set cache_pool min_write_recency_for_promote 1
ceph osd pool set cache_pool min_read_recency 1
ceph osd pool set cache_pool min_write_recency 1
ceph osd pool set cache_pool target_dirty_ratio 0.4
ceph osd pool set cache_pool cache_target_dirty_high_ratio 0.6
ceph osd pool set cache_pool cache_target_full_ratio 0.8
在 Ceph 中创建缓存池(cache pool)后,数据是否会默认存储到固态盘(SSD)上的 OSD(对象存储守护进程)取决于缓存池的配置和 Ceph 的 CRUSH映射规则。默认情况下,缓存池不会自动将数据存储到特定的设备(如 SSD 上的 OSD)。为了确保缓存池的数据存储在 SSD 上,需要手动修改 CRUSH 规则。
需要确保有一个 CRUSH 规则将缓存池的数据存储到 SSD 上的 OSD。如果没有现成的规则,可以创建一个新的 CRUSH 规则:
ceph osd crush rule dump
这里没有将固态盘识别为ssd的class,需要手动修改他的crush class
ceph osd getcrushmap -o crushmapdump
crushtool -d crushmapdump -o crushmapdump-decompiled
vim crushmapdump-decompiled
device 0 osd.0 class hdd
device 1 osd.1 class hdd
device 2 osd.2 class hdd
device 3 osd.3 class hdd
device 4 osd.4 class hdd
device 5 osd.5 class hdd
device 6 osd.6 class hdd
device 7 osd.7 class hdd
device 8 osd.8 class hdd
device 9 osd.9 class hdd
device 10 osd.10 class hdd
device 11 osd.11 class hdd
device 12 osd.12 class hdd
device 13 osd.13 class hdd
device 14 osd.14 class hdd
device 15 osd.15 class hdd
device 16 osd.16 class hdd
device 17 osd.17 class hdd
device 18 osd.18 class hdd
device 19 osd.19 class hdd
device 20 osd.20 class ssd
device 21 osd.21 class ssd
device 22 osd.22 class ssd
device 23 osd.23 class ssd
device 24 osd.24 class ssd
rule replicated_hdd {
id 1
type replicated
min_size 1
max_size 10
step take default class hdd
step chooseleaf firstn 0 type host
step emit
}
rule replicated_ssd {
id 2
type replicated
min_size 1
max_size 10
step take default class ssd
step chooseleaf firstn 0 type host
step emit
}
或者
ceph osd crush rule create-replicated replicated_ssd default host ssd
ceph osd crush rule create-replicated replicated_hdd default host hdd
image.png
root@node4:~# ceph osd pool set cache_pool crush_rule replicated_ssd
set pool 3 crush_rule to replicated_ssd
root@node4:~# ceph osd pool set libvirt-pool crush_rule replicated_hdd
set pool 2 crush_rule to replicated_hdd
验证缓存池和数据池在不同的rule上
通过上述步骤,可以确保缓存池数据存储在指定的 SSD 设备上,提高访问速度和性能。
删除缓存层的方法取决于它是写回缓存还是只读缓存。
由于只读缓存没有修改的数据,因此可以禁用并删除它而不会丢失缓存中对象的任何最近更改。将缓存模式更改为以none禁用它:
ceph osd tier cache-mode cache_pool none
解除与数据池的绑定
ceph osd tier remove libvirt-pool cache_pool
由于写回缓存可能已修改数据,因此在禁用和删除缓存之前,必须采取措施确保不会丢失对缓存中对象的任何最近更改。将缓存模式更改为proxy,以便新的和修改的对象刷新至后端存储池:
ceph osd tier cache-mode cache_pool proxy
查看缓存池以确保所有的对象都被刷新。
rados -p cache_pool ls
如果缓存池中仍有对象,可以手动刷新它们。
rados -p cache_pool cache-flush-evict-all
删除覆盖层,以便客户端不会将流量引导到缓存池
ceph osd tier remove-overlay libvirt-pool
解除存储池与缓存池的关联
ceph osd tier remove libvirt-pool cache_pool
删除缓存池
ceph osd pool delete cache-pool cache_pool --yes-i-really-really-mean-it