管理ceph缓存池

目录

  • 缓存池简介

    • 缓存池原理
    • 缓存池的工作模式
  • 配置缓存池
    • 1. 创建一个缓存池
    • 2. 设置缓存层
    • 3. 缓存层相关参数说明
    • 4. 测试缓存池
  • 删除缓存池
    • 1. 删除read-only缓存池
    • 2. 删除writeback缓存池

缓存池简介

缓存池原理

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

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

[email protected]:~# 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

原文地址:https://www.cnblogs.com/breezey/p/11080532.html

时间: 2024-08-06 11:49:35

管理ceph缓存池的相关文章

定长单元的批次内存缓存池的简洁实现

问题描述: 1.内存管理计算机编程中一个基本问题,其目的在于: 1)一次可分配多个单元块,缓存维护,以改善反复的小对象申请的性能开销: 2) 管理以分配的内存,有效减少碎片的产生: 3) 保证软件使用的内存透明,了解峰值,了解使用情况,便于优化查错: 2.常用的内存管理机制有以下: 1) 变长块,依靠链表维护,一个节点一块申请了的内存,内存块大小不等,等接到一个申请时,先查维护的链表,若有可从链表取出.这种方法有很多缺点:1,当申请的内存块要遍历链表节点找到大小合适的块,最坏情况下需要把链表所有

Mysql InnDB 缓存池(Buffer Pool)

InnoDB通过在内存中维护缓存池(Buffer Pool)来对数据和索引进行缓存,从而提高数据库性能.了解Mysql内存缓冲池的原理,并针对性地进行调优,能够最大化其带来的性能优势. 通常,在保证服务器上其他应用程序有足够内存的情况下,可以给buffer pool分配尽可能多的内存空间.越大的buffer pool能够使mysql越能够像内存数据库一样提供服务.其大小通过innodb_buffer_pool_size配置.对于64 bit 机器,可以将buffer pool 配置为多个部分,以

Android数据库源码分析(3)-连接缓存池SQLiteConnectionPool

本系列主要关注安卓数据库的线程行为,分为四个部分: (1)SQLiteOpenHelper的getReadableDatabase和getWritableDatabase (2)SQLiteDatabase的实现以及多线程行为 (3)连接缓存池SQLiteConnectionPool (4)SQLiteDatabase多线程实践 本篇主要关注SQLiteConnectionPool(连接池)在并发下的行为. 上文提到,SQLiteDatabase会在每个线程中使用一个SQLiteSession,

iOS开发:一个瀑布流的设计与实现(已实现缓存池功能,该功能使得瀑布流cell可以循环利用)

一个瀑布流的实现有三种方式: 继承自UIScrollView,仿写UITableView的dataSource和delegate,创造一个缓存池用来实现循环利用cell 写多个UITableview(UITableView的cell宽度是与UITableView宽度一样的,那么每行可以摆设多个宽度相等的UITableView,从而实现瀑布流),不过这种方法是最差的,因为不能有效的做到循环利用cell 可以自定义UICollectionViewCell的布局,从而实现瀑布流,UICollectio

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

SQL Server 2014缓存池扩展 (Buffer Pool Extension)功能可以将缓存池扩展到较快的SSD存储上.为内存比较紧张的系统提供了新的扩展途径. Buffer Pool 扩展可以带来以下好处: 提高随机I/O的吞吐量 降低I/O延迟 提高单位时间内处理事务的吞吐量 显著地提高读性能 以软件方式为客户实现了类似于混合硬盘的效果. 缓存池扩展支持以下两种模式: CW:只向SSD写入干净页. DW:双重写,即同时向SSD和硬盘写入脏页. 下面2张图里,C: 干净页  D:脏页

cocos2d 缓存池 对象重复使用

1.缓冲池简单描述 我们知道一个游戏比如跑酷类型的游戏,游戏元素会不断重复.游戏元素会不断从屏幕右边创建出来,当一个元素移出左边屏幕时,又会消失掉.如果不断地new 对象,release 对象 会有性能影响.如何优化呢?就涉及到缓存池的概念. 再举一个例子:一个主角在一个竞技场中不断杀怪.每次有5个怪出现,杀死一个又会出来一个.每次出怪就new 怪,死亡怪就release怪,会很浪费的.已经死亡的怪,我们简单地给他补满血不就可以重复使用了嘛!像拍电影,一个人不是真正死亡,只是看起来死了,还是可以

SQL Server 2014里的缓存池扩展

在今天的文章里我想谈下SQL Server 2014里引入的缓存池扩展(Buffer Pool Extensions).我们都知道,在SQL Server里,缓存池是主要的内存消耗者.当你从你存储里读取数据时,数据会在缓存池里缓存.SQL Server在计划缓存里缓存执行计划,也是缓存池的一部分.你拥有的物理内存越多,你的缓存池就会越大(通过[最大服务器内存]设置配置). 很多SQL Server用户会碰到数据库服务器里物理内存受限的问题:所有内存槽都被占用了,因此你如何想给物理服务器增加额外的

tableView循环引用以及缓存池中的两个常见Bug

一.直接看Bug:unable to dequeue a cell with identifier cell_id - must register a nib or a class for the identifier or connect a prototype cell in a storyboard 二.使用tableView的cell重用机制后cell中不显示detailTextLabel. * *  本文中大量涉及tableView的重新引用机制 *  在tableView上下滑动的时

一个依靠STL vector的接口进行申请和回收管理的内存池类( c++ 封装)

其他出现两次,只有一个出现一次的那道题我就不更了,直接抑或,最后的结果就是那个数.为什么可以这样做呢?因为一个32位int,如果所有数都出现了两次,那么为1的那些位统计的个数一定是2的倍数,抑或之后全变成0.一个数出现了一次,它为1的那些位上,1的个数必定是奇数,抑或之后一定还是1. 我之前知道出现两次这个题的解法,但是理解的不够深,以为抑或是关键,其实不是,出现了偶数次才是关键.理解了这点,推广到出现3次上,如果所有的出现了三次,那么为1的那些位1的个数一定是三的倍数,那如果有一个数出现了一次