北屋教程网

专注编程知识分享,从入门到精通的编程学习平台

Ceph添加SSD缓存(ceph cache tiering)

1. 缓存池工作原理

Ceph 从 Firefly 版本开始就支持缓存分层特性,所谓的缓存分层其实就是在更快的磁盘(通常是 ssd 或者 NVME)上创建一个存储池,然后将这个存储池放置在常规复制池或者纠删码存储池的前端去充当缓存,被充当缓存的这个存储池也叫做 Cache Pool。


2. 缓存层的工作模式

Ceph 缓存池主要有以下两种工作模式:

WRITEBACK:回写模式,也是 Ceph 缓冲池的默认工作模式,此时它的读写过程如下:

写入数据: 客户端将数据写入缓存池,然后会立即收到写入确认。缓存池会根据你配置的策略(比如每隔半小时),将数据回写到真实存储数据的后端存储池。并最终由缓存代理将其从缓存层中删除。

读取数据: 处理来自客户端的读操作时,首先由缓存分层代理将数据从存储层迁移至缓存层,然后再将其返回给客户端。只到数据变得不再活跃或者成为冷数据时,再将其从缓存池中删除。


READ-ONLY POOL:它只适用于处理客户端的读操作(弱一致性)。客户端的写操作不涉及缓存分层,所有的客户端写都在存储层上完成。

写入数据: 不缓存,直接写入后端的数据存储池。

读取数据: 如果缓存池中有命中缓存,则直接返回数据,否则缓存分层代理将请求的数据从后端存储层复制到缓存层,再返回给客户端。 然后缓存池会基于你配置的策略,将不活跃的对象从缓存池中删除。


3. 环境说明

操作系统: Centos7.6

Ceph 版本: 14.2.13 nautilus (stable)

节点架构: 1 mon(ceph-admin),1 mgr(ceph-admin),4 osd(ceph-admin、node1、noce2、node3)

ssd osd:需要三块


4. 配置 crush class

Ceph LUMINOUS版本后有磁盘智能分组功能不用配置,请跳过这一步。


如果没有,那么接下来你可能会问,缓存池是创建在 SSD 磁盘上的,那我如何在指定的 OSD(ssd 磁盘)上去创建存储池呢?首先我们得给磁盘,也就是 OSD 分组。


ceph 从 LUMINOUS 版本开始新增了个功能叫 crush class,又被称之为磁盘智能分组。因为这个功能就是根据磁盘类型自动进行属性关联,然后进行分类减少了很多的人为操作。 在这个功能之前,如果我们需要对 ssd 和 hdd 进行分组的时候,需要大量的修改 crushmap,然后绑定不同的存储池到不同的crush树上面,而这个功能让我们简化了这种逻辑。


ceph中的每个设备都可以选择一个class类型与之关联,通常有三种class类型:

Hdd、ssd、nvme


4.1 启用 ssd class

默认情况下,我们所有的 osd crush class 类型都是 hdd。

你也可以使用下面的命令来列出当前集群中所有启用的 osd crush class

[root@ceph-admin ~]# ceph osd crush class ls

[

"hdd"

]


查看crush class,多出了一个名为ssd的class:

[root@ceph-admin ~]# ceph osd crush class ls

[

"hdd",

"ssd"

]

4.2 创建基于 ssd 的 class rule

创建一个 class rule,取名为 ssd_rule,使用 ssd 的 osd:

[root@ceph-admin ~]# ceph osd crush rule create-replicated ssd_rule default host ssd


查看集群rule:

[root@ceph-admin ~]# ceph osd crush rule list

replicated_rule

ssd_rule


5.配置缓存池

我们先创建一个常规存储池 data

[root@ceph-admin ~]# ceph osd pool create data 64 64


5.1 创建一个缓存池

我们在步骤 4 中已经创建了一个基于 ssd 的 crush_rule,我们创建一个存储池,使用该crush rule即可。

[root@ceph-admin ~]# ceph osd pool create cache 64 64 ssd_rule

你也可以选择把一个已经创建好的存储池迁移到 ssd osd 上:

[root@ceph-admin ~]# ceph osd pool get cache crush_rule


验证迁移是否成功:

root@ceph1:~# ceph osd pool get cache crush_rule

crush_rule: ssd_rule


5.2 设置缓存层

WRITEBACK 缓存池配置:

将 cache pool 放置到 data pool 前端

[root@ceph-admin ~]# ceph osd tier add data cache


设置缓存模式为 writeback

[root@ceph-admin ~]# ceph osd tier cache-mode cache writeback


将所有客户端请求从标准池引导至缓存池

[root@ceph-admin ~]# ceph osd tier set-overlay data cache


READ-ONLY 缓存池配置

[root@ceph-admin ~]# 将 cache pool 放置到 data pool 前端

ceph osd tier add data cache

设置缓存模式为 readonly

[root@ceph-admin ~]# ceph osd tier cache-mode cache readonly

通过下面的命令可以查到 data pool 和 cache pool 的详细信息

root@ceph1:~# ceph osd dump |egrep 'data|cache'


对缓存池做一些基本的配置:

ceph osd pool set cache hit_set_type bloom

ceph osd pool set cache hit_set_count 1

ceph osd pool set cache hit_set_period 3600 # 1 hour

ceph osd pool set cache target_max_bytes 60000000000 # 60G

ceph osd pool set cache target_max_objects 10000000

ceph osd pool set cache min_read_recency_for_promote 1

ceph osd pool set cache min_write_recency_for_promote 1


5.4 缓存池的相关参数配置

(1). 命中集合过滤器,默认为 Bloom 过滤器,这种一种非常高效的过滤器(看官方文档的意思,好像目前只支持这一种filter):

ceph osd pool set cache hit_set_type bloom

ceph osd pool set cache hit_set_count 1

设置 Bloom 过滤器的误报率

ceph osd pool set cache hit_set_fpp 0.15

设置缓存有效期,单位:秒

ceph osd pool set cache hit_set_period 3600 # 1 hour

(2). 设置当缓存池中的数据达到多少个字节或者多少个对象时,缓存分层代理就开始从缓存池刷新对象至后端存储池并驱逐:

当缓存池中的数据量达到1TB时开始刷盘并驱逐

ceph osd pool set cache target_max_bytes 1099511627776

当缓存池中的对象个数达到100万时开始刷盘并驱逐

ceph osd pool set cache target_max_objects 10000000


(3). 定义缓存层将对象刷至存储层或者驱逐的时间:

ceph osd pool set cache cache_min_flush_age 600

ceph osd pool set cache cache_min_evict_age 600


(4). 定义当缓存池中的脏对象(被修改过的对象)占比达到多少(百分比)时,缓存分层代理开始将object从缓存层刷至存储层:


ceph osd pool set cache cache_target_dirty_ratio 0.4


(5). 当缓存池的饱和度达到指定的值,缓存分层代理将驱逐对象以维护可用容量,此时会将未修改的(干净的)对象刷盘:

ceph osd pool set cache cache_target_full_ratio 0.8


(6). 设置在处理读写操作时候,检查多少个 HitSet,检查结果将用于决定是否异步地提升对象(即把对象从冷数据升级为热数据,放入快取池)。它的取值应该在 0 和 hit_set_count 之间, 如果设置为 0 ,则所有的对象在读取或者写入后,将会立即提升对象;如果设置为 1 ,就只检查当前 HitSet ,如果此对象在当前 HitSet 里就提升它,否则就不提升。 设置为其它值时,就要挨个检查此数量的历史 HitSet ,如果此对象出现在
min_read_recency_for_promote 个 HitSet 里的任意一个,那就提升它。

ceph osd pool set cache min_read_recency_for_promote 1

ceph osd pool set cache min_write_recency_for_promote 1


5.3 删除writeback缓存池:

由于回写缓存可能具有修改的数据,所以必须采取措施以确保在禁用和删除缓存前,不丢失缓存中对象的最近的任何更改。


(1). 将缓存模式更改为转发,以便新的和修改的对象刷新至后端存储池:

ceph osd tier cache-mode cache forward --yes-i-really-mean-it


(2). 查看缓存池以确保所有的对象都被刷新(这可能需要点时间):

rados -p cache ls


(3). 如果缓存池中仍然有对象,也可以手动刷新:

rados -p cache cache-flush-evict-all


(4). 删除覆盖层,以使客户端不再将流量引导至缓存:

ceph osd tier remove-overlay data


(5). 解除存储池与缓存池的绑定:

ceph osd tier remove data cache


6.删除read-only只读模式的缓冲层

因为只读模式的缓冲池中没有变动的数据,所以你可以删除缓存池中的数据,不用担心数据丢失。

1.修改缓存模式为none废除缓存

ceph osd tier cache-mode {cachepool} none

例子:

ceph osd tier cache-mode cache none


2.删除覆盖层,使客户端不再直接和缓存交互,这一步很重要,否则下一步无法执行

ceph osd tier remove-overlay {storagetier}

例子:

ceph osd tier remove-overlay data


3.从存储池(the backing pool)上移除缓冲池(the cache pool)

ceph osd tier remove {storagepool} {cachepool}

例子:

ceph osd tier remove data cache

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言