ceph osd tier add cold-storage hot-storage
ceph osd tier cache-mode hot-storage writeback
ceph osd tier set-overlay cold-storage hot-storage
ceph osd pool set {cachepool} hit_set_type bloom
ceph osd pool set {cachepool} hit_set_count 1
ceph osd pool set {cachepool} hit_set_period 300 # 300s 后触发hitset
ceph osd pool set {cachepool} target_max_bytes 1000000000 # 1G
ceph osd pool set hot-storage target_max_objects 100 # 100个objects后触发下刷
ceph osd pool set hot-storage cache_min_flush_age 300 # 300s 后触发下刷
ceph osd pool set hot-storage cache_min_evict_age 300 # 300s 后触发下刷
ceph osd pool set {cachepool} cache_target_dirty_ratio 0.01
ceph osd pool set {cachepool} cache_target_full_ratio 0.02
1.2.9 CACHE TIERING(高速缓存)
缓存层为Ceph客户端提供了更好的I/O性能,用于存储在后备存储层中的数据的一部分。 高速缓存分层涉及创建一个相对快速/昂贵的存储设备(例如,固态驱动器)的池,其被配置为用作高速缓存层,以及被配置为充当经济存储器的擦除编码或相对较慢/更便宜的设备的后台池层。 Ceph反对者处理放置对象的位置,分层代理决定何时将对象从缓存中刷新到后备存储层。因此缓存层和后备存储层对Ceph客户端是完全透明的。
缓存分层代理自动处理缓存层和后备存储层之间的数据迁移。 但是,管理员可以配置如何进行迁移。 主要有两种情况:
Writeback Mode(回写模式) #当管理员使用回写模式配置层时,Ceph客户端将数据写入高速缓存层,并从缓存层接收ACK。及时,写入高速缓存层的数据将迁移到存储层,并从高速缓存层中刷新。在概念上,缓存层叠加在后端存储层的“前面”。当Ceph客户端需要驻留在存储层中的数据时,高速缓存分层代理在读取时将数据迁移到缓存层,然后将其发送到Ceph客户端。此后,Ceph客户端可以使用高速缓存层执行I/O,直到数据变为非活动状态。这对于可变数据(例如,照片/视频编辑,事务数据等)是理想的。
Read-proxy Mode(读取代理模式) #此模式将使用高速缓存层中已存在的任何对象,但如果缓存中不存在对象,则该请求将被代理到基础层。这对于从回写模式转换为禁用高速缓存非常有用,因为它允许工作负载在高速缓存耗尽时正常运行,而不会向缓存中添加任何新对象。
A WORD OF CAUTION(使用要小心)
缓存分层将降低大多数工作负载的性能。使用此功能之前,用户应特别小心:
依赖于工作负载(Workload dependent):缓存是否提高性能高度依赖于工作负载。因为存在与移动对象进出高速缓存的成本相关的成本,所以只有在数据集中的访问模式存在大的偏斜时才能有效,使得大部分请求触及少量的对象。缓存池应该足够大,以捕获工作负载的工作集以避免抖动。
难以测试(Difficult to benchmark:用户运行的测量性能的大多数基准将显示高速缓存分层的可怕性能,部分原因是很少有人将请求偏移到一小部分对象,缓存需要很长时间才能“预热” “因为预热费用可能很高。
通常较慢(Usually slower):对于不缓存分层友好的工作负载,性能通常比正常的RADOS池慢,而不启用缓存分层。
librados对象枚举(librados object enumeration):库存级别的对象枚举API并不意味着在案件存在的情况下是一致的。如果您的应用程序直接使用librados并依赖对象枚举,缓存分层可能无法正常工作。 (这不是RGW,RBD或CephFS的问题。)
复杂性(Complexity):启用缓存分层意味着正在使用RADOS集群中的大量额外的机械和复杂性。这增加了系统中遇到其他用户尚未遇到的错误并将部署置于更高风险的可能性。
已知好的工作:
RGW时间偏移:如果RGW工作负载使得几乎所有的读取操作都针对最近写入的对象,则在可配置的时间段之后将最近写入的对象从缓存运行到基础层的简单缓存分层配置可以正常工作。
已知的工作负载:
已知以下配置在缓存分层方面工作不佳。
具有复制缓存和擦除编码基数的RBD:这是一个通用请求,但通常表现不佳。 即使合理的偏移工作负载仍然会向冷对象发送一些小写入,并且由于擦除编码池不支持小写,因此必须将整个(通常为4 MB)的对象迁移到缓存中,以满足较小的(通常为4 KB)写。 只有少数用户已经成功部署了这种配置,它只适用于他们,因为他们的数据非常冷(备份),而且对性能不敏感。
具有复制缓存和基数的RBD:具有复制基本层的RBD比基数被擦除编码时更好,但是它仍然高度依赖于工作负载中的偏斜量,并且非常难以验证。 用户需要对其工作负载有很好的了解,并且需要仔细调整缓存分层参数。
SETTING UP POOLS
要设置缓存分层,您必须有两个池。一个将作为后备存储,另一个将作为缓存。
设置后备存储池
设置备份存储池通常涉及两种情况之一:
Standard Storage(标准存储):在这种情况下,池在Ceph存储集群中存储对象的多个副本。
Erasure Coding:在这种情况下,池使用擦除编码以更小的性能权衡来更有效地存储数据。
在标准存储方案中,可以设置CRUSH规则集以建立故障域(例如,osd,主机,机箱,机架,行等)。Ceph OSD守护进程在规则集中的所有存储驱动器具有相同的大小,速度(RPM和吞吐量)以及类型时执行最佳性能。创建规则集后,创建后备存储池。
设置缓存池
设置缓存池遵循与标准存储方案相同的过程,但存在差异:缓存层的驱动器通常是驻留在其自己的服务器中并具有自己的规则集的高性能驱动器。 设置规则集时,应考虑具有高性能驱动器的主机,同时省略不具备该功能的主机。
对于缓存层配置和默认值,请参照上面记录的设置池值。
创建高速缓存
设置缓存层包括将后备存储池与缓存池相关联
ceph osd tier add {storagepool} {cachepool}
实例:
ceph osd tier add cold-storage hot-storage
要设置缓存模式,请执行以下操作:
ceph osd tier cache-mode {cachepool} {cache-mode}
实例:
ceph osd tier cache-mode hot-storage writeback
高速缓存层覆盖后备存储层,因此需要一个额外的步骤:您必须将存储池中的所有客户端流量引导到缓存池。
要直接将客户端流量引导到缓存池,请执行以下操作:
ceph osd tier set-overlay {storagepool} {cachepool}
实例:
ceph osd tier set-overlay cold-storage hot-storage
配置高速缓存
缓存层有几个配置选项。 您可以使用以下用法设置缓存层配置选项:
ceph osd pool set {cachepool} {key} {value}
ceph osd pool set {cachepool} hit_set_count 12
ceph osd pool set {cachepool} hit_set_period 14400
ceph osd pool set {cachepool} target_max_bytes 1000000000000
ceph osd pool set {cachepool} min_read_recency_for_promote 2
ceph osd pool set {cachepool} min_write_recency_for_promote 2
ceph osd pool set {cachepool} hit_set_type bloom
实例:
ceph osd pool set hot-storage hit_set_type bloom
绝对尺寸,高速缓存分层代理可以基于字节总数或对象总数来刷新或取出对象。 要指定最大字节数,请执行以下操作:
ceph osd pool set {cachepool} target_max_bytes {#bytes}
上面的实际例子例如,要冲洗或驱逐1 TB,请执行以下操作:
ceph osd pool set hot-storage target_max_bytes 1099511627776
要指定最大对象数,请执行以下操作:
ceph osd pool set {cachepool} target_max_objects {#objects}
上面的实际例子例如,例如,要刷新或逐出1M对象,请执行以下操作:
ceph osd pool set hot-storage target_max_objects 1000000
相对尺寸,缓存分层代理可以相对于缓存池的大小来刷新或驱逐对象(由绝对大小中由target_max_bytes / target_max_objects指定)。
当缓存池由一定百分比的修改(或脏)对象组成时,高速缓存分层代理将将它们刷新到存储池。 要设置cache_target_dirty_ratio,请执行以下操作:
ceph osd pool set {cachepool} cache_target_dirty_ratio {0.0..1.0}
例如,将值设置为0.4将在缓存池的容量达到40%时开始刷新修改(脏)对象:
ceph osd pool set hot-storage cache_target_dirty_ratio 0.4
当脏物体达到其容量的一定百分比时,以较高的速度冲洗脏物。 要设置cache_target_dirty_high_ratio:
ceph osd pool set {cachepool} cache_target_dirty_high_ratio {0.0..1.0}
例如,将值设置为0.6将开始积极地刷新脏对象,当它们达到缓存池容量的60%时。 显然,我们最好在dirty_ratio和full_ratio之间设置值:
ceph osd pool set hot-storage cache_target_dirty_high_ratio 0.6
当缓存池达到其容量的一定百分比时,缓存分层代理将驱逐对象以维护可用容量。 要设置cache_target_full_ratio,请执行以下操作:
ceph osd pool set {cachepool} cache_target_full_ratio {0.0..1.0}
例如,将值设置为0.8将在缓存池的容量达到80%时开始刷新未修改(干净)的对象:
ceph osd pool set hot-storage cache_target_full_ratio 0.8
缓存时间,在缓存分层代理程序将最近修改(或脏)的对象刷新到后台存储池之前,可以指定对象的最小时间:
ceph osd pool set {cachepool} cache_min_flush_age {#seconds}
例如,要在10分钟后刷新修改(或脏)对象,请执行以下操作:
ceph osd pool set hot-storage cache_min_flush_age 600
可以在对象从缓存层中逐出之前指定对象的最小年龄:
ceph osd pool {cache-tier} cache_min_evict_age {#seconds}
例如,要在30分钟后取消对象,请执行以下操作:
ceph osd pool set hot-storage cache_min_evict_age 1800
删除高速缓存,删除高速缓存层根据是否是回写高速缓存还是只读高速缓存而有所不同。
删除只读高速缓存
由于只读缓存不具有修改的数据,因此您可以禁用并删除它,而不会丢失任何最近对缓存中的对象的更改。
将缓存模式更改为none以禁用它。
ceph osd tier cache-mode {cachepool} none
如:ceph osd tier cache-mode hot-storage none
从后台池中删除缓存池。
ceph osd tier remove {storagepool} {cachepool}
如:ceph osd tier remove cold-storage hot-storage
删除一个写入缓存
由于回写缓存可能具有修改的数据,因此您必须采取措施确保在禁用和删除缓存之前,不要丢失缓存中对象的任何最近更改。
将缓存模式更改为转发,以便新的和修改的对象将刷新到后备存储池。
ceph osd tier cache-mode {cachepool} forward
如:ceph osd tier cache-mode hot-storage forward
确保缓存池已被刷新。 这可能需要几分钟的时间:
rados -p {cachepool} ls
如果缓存池仍然有对象,您可以手动刷新它们。 例如:
rados -p {cachepool} cache-flush-evict-all
删除覆盖层,以便客户端不会将流量引导到缓存。
ceph osd tier remove-overlay {storagetier}
如:ceph osd tier remove-overlay cold-storage
最后,从后备存储池中删除缓存层池。
ceph osd tier remove {storagepool} {cachepool}
如:ceph osd tier remove cold-storage hot-storage
注意Ceph不能自动确定缓存池的大小,所以这里需要绝对大小的配置,否则flush / evict将不起作用。 如果同时指定了这两个限制,则当触发任何阈值时,缓存分层代理将开始刷新或逐出。
注意仅当达到target_max_bytes或target_max_objects时,所有客户端请求才会被阻止