缓存池简介

缓存池原理

ceph的缓存分层特性是在ceph的F版当中正式发布的。所谓的缓存分层其实就是在更快的磁盘(通常是ssd)上创建一个存储池。然后将这个存储池放置在常规的复制池或者纠删码池的前端充当缓存。这样所有的客户端I/O操作都首先由缓存池处理,之后再将数据写回到现有的数据存储池中,使得客户端能够在缓存池上享受更好的性能,而最终数据还是写回到常规池中。

一般来说,缓存池会被构建在更昂贵的或者说速度更快的ssd盘上,这样才能提供更好的I/O性能。而缓存池后端的存储池则由普通的hdd盘组成。在这种类型的设置中,客户端将I/O请求提交至缓存池,不管是读还是写操作,它的请求都能立即获得响应。速度更快的缓存层为客户端请求提供响应。一段时间后,缓存层将所有数据再写回后端的存储存,以便它可以缓存来自客户端的新请求。在缓存层和数据层之间的数据迁移都是自动触发且对客户端透明的。

缓存池的工作模式

缓存池能以以下两种模式进行配置:

  • writeback模式:当缓存池配置为writeback模式时,客户端将数据写至缓存池,然后立即接收写入确认。缓存池基于我们为其设置的flushing/evicting策略,将数据从缓存池迁移至后端存储池,并最终由缓存代理将其从缓存层中删除。处理来自客户端的读操作时,首先由缓存分层代理将数据从存储层迁移至缓存层,然后再将其返回给客户端。只到数据变得不再活跃或者成为冷数据时,再将其从缓存池中删除。

  • read-only模式:当缓存池配置为read-only模式时,它只适用于处理客户端的读操作。客户端的写操作不涉及缓存分层,所有的客户端写都在存储层上完成。在处理来自客户端的读操作时,缓存分层代理将请求的数据从存储层复制到缓存层。缓存池基于我们为其配置的策略,将不活跃的对象从缓存池中删除。这种方法非常适合多个客户端需要读取大量类似数据的场景。

配置缓存池

1. 创建一个缓存池

假设我们已经有了一个基于ssd的crush_rule,我们创建一个存储池,使用该crush rule即可。关于如何创建一个基于ssd的crush_rule,可直接参考《crushmap磁盘智能分组》

下面是创建一个基于ssd的存储池的示例:

# 假设ssd_rule即基于ssd的cursh_rule
ceph osd create pool cache 64 64 ssd_rule

2. 设置缓存层

# 将上面创建的cache池绑定至存储池的前端,cephfs_data即为我们的后端存储池
ceph osd tier add cephfs_data cache # 设置缓存模式为writeback
ceph osd tier cache-mode cache writeback # 将所有客户端请求从标准池引导至缓存池
ceph osd tier set-overlay cephfs_data cache

此时,我们分别查看存储池和缓存池的详情,可以看到相关的缓存配置信息:

root@ceph:~# ceph osd dump |egrep 'cephfs_data|cache'
pool 2 'cephfs_data' replicated size 3 min_size 1 crush_rule 0 object_hash rjenkins pg_num 128 pgp_num 128 last_change 3079 lfor 3079/3079 flags hashpspool tiers 4 read_tier 4 write_tier 4 stripe_width 0 application cephfs
pool 4 'cache' replicated size 3 min_size 1 crush_rule 1 object_hash rjenkins pg_num 64 pgp_num 64 last_change 3100 lfor 3079/3079 flags hashpspool,incomplete_clones tier_of 2 cache_mode writeback target_bytes 1099511627776 hit_set bloom{false_positive_probability: 0.05, target_size: 0, seed: 0} 0s x0 decay_rate 0 search_last_n 0 stripe_width 0

3. 缓存层相关参数说明

  1. 对于生产环境的部署,目前只能使用bloom filters数据结构(看官方文档的意思,好像目前只支持这一种filter):
ceph osd pool set cache hit_set_type bloom
  1. 设置当缓存池中的数据达到多少个字节或者多少个对象时,缓存分层代理就开始从缓存池刷新对象至后端存储池并驱逐:
# 当缓存池中的数据量达到1TB时开始刷盘并驱逐
ceph osd pool set cache target_max_bytes 1099511627776 # 当缓存池中的对象个数达到100万时开始刷盘并驱逐
ceph osd pool set cache target_max_objects 10000000
  1. 定义缓存层将对象刷至存储层或者驱逐的时间:
ceph osd pool set cache cache_min_flush_age 600
ceph osd pool set cache cache_min_evict_age 600
  1. 定义当缓存池中的脏对象(被修改过的对象)占比达到多少时,缓存分层代理开始将object从缓存层刷至存储层:
# 当脏对象占比达到10%时开始刷盘
ceph osd pool set cache cache_target_dirty_ratio 0.4
# 当脏对象占比达到60%时开始高速刷盘
cache_target_dirty_high_ratio: 0.6
  1. 当缓存池的使用量达到其总量的一定百分比时,缓存分层代理将驱逐对象以维护可用容量(达到该限制时,就认为缓存池满了),此时会将未修改的(干净的)对象刷盘:
ceph osd pool set cache cache_target_full_ratio 0.8

4. 测试缓存池

配置好缓存池以后,我们可以先将其驱逐对象的最小时间设置为60s:

ceph osd pool set cache cache_min_evict_age 60
ceph osd pool set cache cache_min_flush_age 60

然后,我们往存储池中写一个数据

rados -p cephfs_data put test /tmp/test.txt

查看存储池,这时应该无法查看到该数据,查看缓存池,则可以看到数据存储在缓存池中:

rados -p cephfs_data ls |grep test
rados -p cache ls |grep test

等60s之后,数据刷盘,此时即可在存储池中看到该数据,则缓存池中,该数据即被驱逐。

删除缓存池

需要说明的是,根据缓存池类型的不同,删除缓存池的方法也不同。

1. 删除read-only缓存池

由于只读缓存不具有修改的数据,因此可以直接禁用并删除它,而不会丢失任何最近对缓存中的对象的更改。

  1. 将缓存模式个性为none以禁用缓存:
ceph osd tier cache-mode cache none
  1. 删除缓存池:
# 解除绑定
ceph osd tier remove cephfs_data cache

2. 删除writeback缓存池

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

  1. 将缓存模式更改为转发,以便新的和修改的对象刷新至后端存储池:
ceph osd tier cache-mode cache forward
  1. 查看缓存池以确保所有的对象都被刷新(这可能需要点时间):
rados -p cache ls
  1. 如果缓存池中仍然有对象,也可以手动刷新:
rados -p cache cache-flush-evict-all
  1. 删除覆盖层,以使客户端不再将流量引导至缓存:
ceph osd tier remove-overlay cephfs_data
  1. 解除存储池与缓存池的绑定:
ceph osd tier remove cephfs_data cache

参考: https://blog.csdn.net/weixin_34364135/article/details/87528549

管理ceph缓存池的更多相关文章

  1. oracle缓存池使用解析

    oracle有三种类型的缓存池,分别是default,keep和recycle.默认情况下只会使用default缓存池,另外两种需要额外配置. keep缓存池相当于是一直很热的default缓存池,缓 ...

  2. Unity3d 动态加载场景物件与缓存池的使用

    聊聊Unity3d动态加载场景物件那些事儿. 众所周知,在策划或美术设计完游戏场景地图后,一个场景中可能会存在成千上万个小的物件,比如石头,木箱子,油桶,栅栏等等等等,这些物件并不是游戏中的道具,仅仅 ...

  3. InnoDB存储引擎--Innodb Buffer Pool(缓存池)

    InnoDB存储引擎--Innodb Buffer Pool(缓存池) Innodb Buffer Pool的概念 InnoDB的Buffer Pool主要用于缓存用户表和索引数据的数据页面.它是一块 ...

  4. SQL Server 2014里的缓存池扩展

    在今天的文章里我想谈下SQL Server 2014里引入的缓存池扩展(Buffer Pool Extensions).我们都知道,在SQL Server里,缓存池是主要的内存消耗者.当你从你存储里读 ...

  5. 缓存池扩展 (Buffer Pool Extension)实践

    SQL Server 2014缓存池扩展 (Buffer Pool Extension)功能可以将缓存池扩展到较快的SSD存储上.为内存比较紧张的系统提供了新的扩展途径. Buffer Pool 扩展 ...

  6. LRU在MySQL缓存池的实现

    MySQL的InnoDB引擎设置有索引及数据缓存池,其中用到的LRU算法来维持缓存的命中率 这里用到了顺序表list来作为缓冲池,每个数据节点称为block 该算法采用“中点插入法”:当插入一个新bl ...

  7. UITableView系列(1)---Apple缓存池机制

    一.概述 关于UITableView的基本使用, 其实十分简单.但是做App最重要的之一就是细致,技术方面要做到细致, 必须深入了解底层, 才能做出优化让程序跑得更快.那么这一系列文章从我实际项目中获 ...

  8. cocos2d 缓存池 对象的再利用

    1.简单的叙述说明池 例如,我们知道,游戏的游戏类型跑酷,游戏元素都在不断重复.游戏的内容将继续从屏幕右侧的创建,当元件在屏幕的左侧的,将消失.假设不变new 对象.release 对象 性能影响.怎 ...

  9. WinSock IOCP 模型总结(附一个带缓存池的IOCP类)

    前言 本文配套代码:https://github.com/TTGuoying/IOCPServer 由于篇幅原因,本文假设你已经熟悉了利用Socket进行TCP/IP编程的基本原理,并且也熟练的掌握了 ...

随机推荐

  1. OpenCV.Net基于傅里叶变换进行文本的旋转校正

    本文描述一种利用OpenCV及傅里叶变换识别图片中文本旋转角度并自动校正的方法,由于对C#比较熟,因此本文将使用OpenCVSharp. 文章参考了http://johnhany.net/2013/1 ...

  2. JMeter之Http协议接口性能测试--基础

    一.不同角色眼中的接口 1.1,开发人员眼中的接口    1.2,测试人员眼中的接口 二.Http协议基本介绍 2.1,常见的接口协议 1.:2. :3. :4.:5.: 6. 2.2,Http协议栈 ...

  3. English--美式发音

    English|美式发音 本文,总结了自己在学习美音的一些感悟,希望大家学习愉快!enjoy~ 前言 目前所有的文章思想格式都是:知识+情感. 知识:对于所有的知识点的描述.力求不含任何的自我感情色彩 ...

  4. tomcat特殊字符处理问题解决方案

    tomcat特殊字符处理问题解决方案 直接加上如下代码,本质是通过反射加上过滤字符 @Configuration public class TomcatConfig { @Bean public Co ...

  5. i春秋四周年福利趴丨一纸证书教你赢在起跑线

    i春秋四周年庆典狂欢已接近尾声 作为压轴福利 CISP-PTE认证和 CISAW-Web安全认证 迎来了史无前例的超低折扣 每个行业都有特定的精英证书,例如会计行业考取的是注册会计师证,建筑行业是一级 ...

  6. PHP json中文

    json_encode 和 json_decode 只支持utf-8编码的字符串,GBK的字符串要用json就得转换成utf-8字符串 看效果 <?php header("Conten ...

  7. dos转unix

    方式一 # yum install dos2unix.x86_64 # dos2unix file 方式二 查看样式: :set ff? //dos/unix 设置: :set fileformat= ...

  8. Spring框架完全掌握(上)

    引言 前面我写了一篇关于Spring的快速入门,旨在帮助大家能够快速地了解和使用Spring.既然是快速入门,讲解的肯定只是一些比较泛的知识,那么对于Spring的一些深入内容,我决定将其分为上.下两 ...

  9. Django框架操作数据库的两种方式

    Django操作数据库的前提操作是成功连接数据库,详情见上篇:https://www.cnblogs.com/kristin/p/10791358.html Django查询数据库的方式一 from ...

  10. Scrum冲刺第一篇

    一.各个成员在 Alpha 阶段认领的任务 负责人和协作者 任务内容 陈嘉欣 设计编码规范 邓镇港 UI设计 肖烈涛 数据库设计 林德泽 设计测试计划 余晓东 用户注册登陆验证模块 陈嘉欣 余晓东 林 ...