【ceph】ceph分层存储(分层缓存Tiering Cache)--未消化

目录

分层存储概述 

ceph分层存储步骤

警告


分层存储概述 

1,首先肯定要弄清Ceph分层存储的结构 ,结构图大概就是下图所示

         缓存层(A cache tier)为Ceph客户端提供更好的I/O性能,而数据存储在存储层(a backing storage tier)。用相对快速/昂贵的设备(比如SSD)创建pool作为缓存层(A cache tier),用纠删码池或者相对慢速/便宜的设备创建pool作为经济的存储池。Ceph(The Ceph objecter)负责对象存放的位置,分层代理(the tiering agent)确定什么时候把数据对象从缓存层(the cache)存储到存储层(the backing storage tier)。因此对Ceph客户端而言缓存层(the cache tier)和存储层(the backing storage tier)是完全透明的。

2,了解了结构图和基本概念 看到一个关键词  分层代理 

      所谓分层代理其实就是分层存储数据迁移方案,缓存分层代理负责在缓存层与存储层间的数据的自动迁移,然而管理员有权利配置数据如何迁移 有两种数据迁移模式 在下面附上自己见解

回写模式  (Writeback Mode):

如果管理员配置缓存层为回写模式,CEPH客户端把数据写入缓存层,并且收到缓存层的ACK,写入缓存层的数据随后迁移到存储层,然后从缓存层清除,读取的话如果客户端要读取的数据在存储层,代理会把数据先迁移到缓存层,后再发往客户端,客户端与缓存层进行IO 大概流程如下所示

只读模式:

客户端写数据到存储层,读数据的时候,ceph从存储层拷贝需要的数据到缓存层,根据定义好的规则,旧数据从缓存层删除  配上自己大概流程图

 仔细分析两种模式 可以得知  第一种模式客户端只与缓存层进行交互 第二种模式客户端写入时直接与存储层进行交互  

为什么进行这种设计,肯定是有不同的应用场景,第一种回写模式主要用于经常变动的数据,第二种只读模式主要用于不经常变动的数据((比如 提交到社交网站上的照片和视频、DNA数据、X射线映像等),因为数据是从缓存层读取的,因此数据可能是过时的数据,换一句话说数据是弱一致的,因为客户端写入的时候是不经过缓存层的,缓存层并不能保证数据是最新的 而第一种模式可以保证这一点

3,分层存储的目的和缺点

 无疑分层存储的目的在于更好的利用磁盘资源,可以将SSD作为缓冲层,HDD作为后端存储,这样热数据可以在SSD上被快读的读取,大量的冷数据在HDD上存储

个人认为有以下缺点(本人水平为在校研究生 不足之处请指正但请勿喷):

1:使用分层存储可能会引起性能的下降,因为数据要经常移出或读进缓冲,这会增加读取时间,缓冲 的有效应用场景应该是针对大文件,经常读而少写的数据。而且缓存需要足够大。(我们的应用场景是需要经常性频繁的读写小文件,因此觉得这可能不适用)

2:添加缓存层容易引起机制复杂性

3:进行性能测试时会显示出比较差的性能(确定真正的热数据需要昂贵的代价)

因为项目的原因自己有阅读深信服的技术白皮书 看了CEPH的分层存储方案 在这里对深信服的存储技术是怎么做的做一个介绍

1,整体结构

2,首次文件读操作

 

3,二次文件读操作

 4,文件块首次写预缓存

 5,文件块二次写更新缓存

 看完深信服的存储方案,自己学习到了很多,无疑它的存储方案更加适用  贴上上述技术纯属分享 如有违权 请联系我我会及时删除  以上内容为自己心得  转载请注明出处。(原文:Ceph分层存储分析 - 渡江云 - 博客园)

ceph分层存储步骤

第3章 创建池
配置存储分层(cache tiering),需要有2个池(pool)。一个用作存储池(the backing storage pool),另一个用作缓存池(the cache pool).
3.1 设置存储池
设置一个存储池(backing storage pool)通常涉及两种典型情况之一
标准存储(Standard Storage): 在这种情况下,pool把数据的多个副本存储在Ceph集群(the Ceph Storage Cluster)中。
纠删码存储(Erasure Coding): 在这种情况下,pool用纠删码方式存储数据,数据存储节约空间,只是有一点性能损耗。
在标准存储(the standard storage)情况下,你可以创建CRUSH规则来设置参数failure domain (比如 osd, host, chassis, rack, row 等)。在CRUSH规则中,所有的存储设备大小、速度(包括RPM和吞吐量)、类型一样时,Ceph OSD进程运行最佳。创建了CRUSH规则后,就可以创建存储池(backing storage pool)了。
在纠删码存储(the erasure coding)情况下,创建池的参数会自动生成合适的规则。
在后续的例子中,我们假设已经创建了一个存储池(the backing storage pool),名字是cold-storage。
3.2 设置缓存池
设置一个缓存池(a cache pool)的步骤和标准存储池(the standard storage pool)的过程一样,但有如下不同: 缓存层(the cache tier)的驱动器是专有的高性能驱动器,运行在自己的服务器上,并有自己的Crush规则。当我们创建Crush规则时,要考虑有高性能驱动器的主机,而删除低性能驱动器的主机。
在后续的例子中,我们假设已经创建了一个缓存池(the cache pool),名字是hot-storage,一个存储池(the backing pool),名字是cold-storage。

第4章 创建缓存层
创建缓存层(a cache tier)就是把存储池(a backing storage pool)和缓冲池(a cache pool)关联起来。
ceph osd tier add {storagepool} {cachepool}
例子
ceph osd tier add cold-storage hot-storage
设置缓存模式(the cache mode),执行如下命令:
ceph osd tier cache-mode {cachepool} {cache-mode}
例子:
ceph osd tier cache-mode hot-storage writeback
回写模式缓存层是在存储层(the backing storage tier)上添加了一层,所以要求添加一步:你必须直接打通客户端从存储池(the storage pool)到缓冲池(the cache pool)的交互。设置客户端直接和缓冲池(the cache pool)交互,执行如下命令:
ceph osd tier set-overlay {storagepool} {cachepool}
例子:
ceph osd tier set-overlay cold-storage hot-storage

第5章 配置缓存层
存储分层(Cache tiers)有几个配置选项。配置这些参数,你可以用如下方法:
ceph osd pool set {cachepool} {key} {value}
5.1 目标的大小和类型
Ceph产品的存储分层用Bloom Filter作为hit_set_type类型;Bloom filter 是由 Howard Bloom 在 1970 年提出的二进制向量数据结构,它具有很好的空间和时间效率,被用来检测一个元素是不是集合中的一个成员。
ceph osd pool set {cachepool} hit_set_type bloom
例子:
ceph osd pool set hot-storage hit_set_type bloom
The hit_set_count and hit_set_period define how much time each HitSet should cover, and how many such HitSets to store. Currently there is minimal benefit for hit_set_count > 1 since the agent does not yet act intelligently on that information.
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
Binning accesses over time allows Ceph to determine whether a Ceph client accessed an object at least once, or more than once over a time period (“age” vs “temperature”).
注:周期越长,计数越高,ceph-osd 用的内存越多。特别是,当代理主动刷新或清除缓存对象,所有hitsets被加载到RAM。
5.2 缓存大小
分层存储代理(The cache tiering agent)执行2个主要的函数:
刷新(Flushing): 代理识别变动的对象,并把这些变动的对象转存到存储池(the storage pool)中长期保存;
清除(Evicting): 代理识别未变动的对象,并从缓存中删除最近没有使用的对象。
5.2.1 相对大小
缓存代理(The cache tiering agent)刷新/清除对象和缓冲池大小有关。当缓冲池(the cache pool)达到一定比例的变动对象时,缓存代理(the cache tiering agent)会刷新数据,把它们存储到存储池(the storage pool)中。设置cache_target_dirty_ratio执行如下命令:
ceph osd pool set {cachepool} cache_target_dirty_ratio {0.0..1.0}
例如,设置值为0.4,当变动的对象达到缓冲池(the cache pool)容量的40%时,就刷新缓存:
ceph osd pool set hot-storage cache_target_dirty_ratio 0.4
当缓冲池(the cache pool)达到一定百分百的容量时,缓存代理(the cache tiering agent)会清除一些对象来维持一定空闲的存储空间。设置cache_target_full_ratio执行如下命令:
ceph osd pool set {cachepool} cache_target_full_ratio {0.0..1.0}
例如,设置值为0.8,当达到缓冲池(the cache pool)容量的80%时,就会清除缓存中一些未变动的数据:
ceph osd pool set hot-storage cache_target_full_ratio 0.8
5.2.2 绝对大小
缓存代理(The cache tiering agent)能根据总字节数和总对象数刷新/清除对象。设置字节数的最大值,可以执行如下命令:
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
注:如果限制条件你都配置了,当任何一个阈值被触发时,缓存代理(the cache tiering agent)就刷新/清除数据。
5.3 缓存周期
你可以配置对象的最小周期,达到这个周期后,缓存代理(the cache tiering agent)刷新最近变动的对象到存储池(the backing storage pool)中:
ceph osd pool set {cachepool} cache_min_flush_age {#seconds}
例如,刷新变动10分钟的数据,执行如下语句:
ceph osd pool set hot-storage cache_min_flush_age 600
你可以配置对象的最小周期,达到这个周期后,缓存代理(the cache tiering agent)从缓存中清除未变动的对象:
ceph osd pool {cache-tier} cache_min_evict_age {#seconds}
例如,清除30分钟未使用的对象,执行如下语句:
ceph osd pool set hot-storage cache_min_evict_age 1800

第6章 清除缓存层
缓存模式(回写模式writeback cache,只读模式read-only cache)不同,删除缓存层的方法也不同。
6.1 删除只读模式的缓冲层
因为只读模式的缓冲池中没有变动的数据,所以你可以删除缓存池中的数据,不用担心数据丢失。
1.    修改缓存模式为none废除缓存
ceph osd tier cache-mode {cachepool} none
例子:
ceph osd tier cache-mode hot-storage none
2.    从存储池(the backing pool)上移除缓冲池(the cache pool)
ceph osd tier remove {storagepool} {cachepool}
例子:
ceph osd tier remove cold-storage hot-storage
6.2 删除回写模式的缓冲层
因为回写模式(writeback cache)有变动的数据,所以在废除和删除前,首先确保最近修改的数据不丢失。
1.    修改缓存模式为forward,使新增和修改的对象刷新到存储池(the backing storage pool)中。
ceph osd tier cache-mode {cachepool} forward
例子:
ceph osd tier cache-mode hot-storage forward
2.    确认缓冲池(the cache pool)已经刷新,这将花费几分钟时间:
rados -p {cachepool} ls
如果缓冲池(the cache pool)中还有对象,你可以手动刷新他们:
rados -p {cachepool} cache-flush-evict-all
3.    删除覆盖层,使客户端不再直接和缓存交互。
ceph osd tier remove-overlay {storagetier}
例子:
ceph osd tier remove-overlay cold-storage
4.    最后,从存储池(the backing storage pool)上移除缓冲池(the cache tier pool):
ceph osd tier remove {storagepool} {cachepool}
例子:
ceph osd tier remove cold-storage hot-storage
第7章 附录

原文:ceph存储 Ceph存储分层技术_skdkjxy的专栏-CSDN博客

警告

  如果负载过多,分层缓存会降低性能。用户在使用以下特性时需要极其谨慎。

Workload dependent: 缓存是否能提升性能,高度依赖于负载能力。因为将数据移入或移除缓存会导致额外的开销,它只在对数据集的访问有大的偏离时有影响。例如, 众多的请求访问小数量的objects,这时,你的缓存池需要非常大,才能在处理所有请求时,避免数据过渡。

Difficult to benchmark: 用户使用评测性能时,大部分的关于分层缓存bechmarks测试结果,将会是一个糟糕的结果。其中部分原因是很少的bechmarks倾斜于一组小的对象集合的请求这会使缓存经过很长时间后才能“活跃起来”,并且这种“活跃起来”会导致高昂的开销。

Usually slower: 对于并没有友好使用分级缓存的工作负载,性能普遍低于一个没使用分级缓存的普通rados池。

librados object enumeration: 对于librados级别的枚举对象API并不能连贯存在在这种情况中(The librados-level object enumeration API is not meant to be coherent in the presence of the case)。 如果你的应用直接使用rados,并且依赖于枚举对象,分级缓存不能向期待的那样工作. (对于RGW, RBD, or CephFS,没有这个问题)

Complexity: 在使用RADOS集群时,使用分级缓存意味着大量的额外器械和复杂性。这会增加你遇到未知的BUG(可能其他人未遇到过)的可能性, 并且使你的部署拥有更大的风险。

已知的成功的负载方式

RGW time-skewed: 如果RGW工作中遇到的大部分操作是朝向最近写入的数据,一个简单的分级缓存可以工作得很好。

已知的错误的负载方式

    下面的配置使用分层缓存效果不佳。

RBD with replicated cache and erasure-coded base: 这是一个普遍的需求, 但是通常不能很好工作。即使合理的倾斜工作负载,仍然会遇到一些对于冷门object的写操作的情况,并且由于纠删码类型的池还不支持轻微的读写操作,为了适应一些小的写入操作(通常4kb),整个object块(通常4MB)必须被全部迁移到缓存 。只有少数用户成功的应用了这种部署方式,并且这种部署方案只能为他们工作是因为他们的数据是极其“冷门”的(例如备份),并且他们对于性能并不敏感。

RBD with replicated cache and base: 在使用备份类型为基础层时比以纠删码为基础层时,RBD的表现更为良好, 但是它在工作负载中仍然依赖于大量的倾斜,并且很难验证。用户需要对他们的工作负载有更好的理解, 并且需要仔细调整分层缓存参数。

3、配置存储池

    为了建立分层缓存,你必须拥有两个存储池。一个作为后端存储,一个作为缓存。

3.1 配置后端存储池

    建立一个后端存储池包含两种场景:

标准存储: 在这种场景中,这个池在Ceph存储集群中存储一个对象的多个副本。

纠删码: 在这种场景中,存储池用纠删码高效地存储数据,性能稍有损失。

    在标准存储场景中,你可以用 CRUSH 规则集来标识失败域(如 osd 、主机、机箱、机架、排等)。当规则集所涉及的所有驱动器规格、速度(转速和吞吐量)和类型相同时, OSD 守护进程运行得最优。创建规则集的详情见CRUSH 图。创建好规则集后,再创建后端存储池。

     在纠删码编码情景中,创建存储池时指定好参数就会自动生成合适的规则集,详情见创建存储池

     在后续例子中,我们把cold-storage当作后端存储池。
原文:https://www.jianshu.com/p/a1a6c2218720
 

摘取或参考:

Ceph分层存储分析 - 渡江云 - 博客园

https://www.jianshu.com/p/a1a6c2218720

ceph存储 Ceph存储分层技术_skdkjxy的专栏-CSDN博客

Supongo que te gusta

Origin blog.csdn.net/bandaoyu/article/details/121198731
Recomendado
Clasificación