SSD作为HDD的缓存池 作者: sysit 分类: d 发表于 2020-05-29 224人围观 ## 1. 前置 ceph集群分别有两个HDD和SSD存储池 ## 2. 缓存池原理 缓存分层特性也是在Ceph的Firefly版中正式发布的,这也是Ceph的Firefly版本中被谈论最多的一个特性。缓存分层是在更快的磁盘(通常是SSD)上创建一个Ceph池。这个缓存池应放置在一个常规的复制池或erasure池的前端,这样所有的客户端I/O操作都首先由缓存池处理。之后,再将数据写回到现有的数据池中。客户端能够在缓存池上享受高性能,而它们的数据显而易见最终是被写入到常规池中的。  一般来说,缓存层构建在昂贵/速度更快的SSD磁盘上,这样才能为客户提供更好的I/O性能。在缓存池后端通常是存储层,它由复制或者erasure类型的HDD组成。在这种类型的设置中,客户端将I/O请求提交到缓存池,不管它是一个读或写操作,它的请求都能够立即获得响应。速度更快的缓存层为客户端请求提供服务。一段时间后,缓存层将所有数据写回备用的存储层,以便它可以缓存来自客户端的新请求。在缓存层和存储层之间的数据迁移都是自动触发且对客户端是透明的。缓存分层能以两种模式进行配置。 * writeback模式 当Ceph的缓存分层配置为writeback模式时,Ceph客户端将数据写到缓存层类型的池,也就是速度更快的池,因此能够立即接收写入确认。基于你为缓存层设置的flushing/evicting策略,数据将从缓存层迁移到存储层,并最终由缓存分层代理将其从缓存层中删除。处理来自客户端的读操作时,首先由缓存分层代理将数据从存储层迁移到缓存层,然后再把它提供给客户。直到数据变得不再活跃或成为冷数据,否则它将一直保留在缓存层中。 * read-only模式 当Ceph的缓存分层配置为read-only模式时,它只适用于处理客户端的读操作。客户端的写操作不涉及缓存分层,所有的客户端写都在存储层上完成。在处理来自客户端的读操作时,缓存分层代理将请求的数据从存储层复制到缓存层。基于你为缓存层配置的策略,不活跃的对象将会从缓存层中删除。这种方法非常适合多个客户端需要读取大量类似数据的场景。 缓存层是在速度更快的物理磁盘(通常是SSD)上实现的,它在使用HDD构建的速度较慢的常规池前部署一个快速的缓存层。在本节中,我们将创建两个独立的池(一个缓存池和一个常规),分别用作缓存层和存储层。  ## 3. 配置 * 创建缓冲池 ``` [root@node3 ~]# ceph osd pool create ssdpool 64 64 rule-ssd [root@node3 ~]# ceph osd pool create hddpool 64 64 rule-hdd ``` * 把缓存层挂接到后端存储池上 ``` [root@node3 ~]# ceph osd tier add hddpool ssdpool pool 'ssdpool' is now (or already was) a tier of 'hddpool' ``` * 设定缓冲池读写策略为写回模式。 ``` # 格式osd tier cache-mode <poolname> none|writeback|forward|readonly|readforward|proxy|readproxy {--yes-i-really-mean-it} [root@node3 ~]# ceph osd tier cache-mode ssdpool writeback set cache-mode for pool 'ssdpool' to writeback ``` * 将客户端流量指向到缓存存储池 ``` [root@node3 ~]# ceph osd tier set-overlay hddpool ssdpool overlay for 'storage' is now (or alreadywas) 'cache' ``` ## 4. 参数 * 设置缓存层 hit_set_type 使用 bloom 过滤器 * ``` # 格式:ceph osd pool set {cachepool} {key} {value} # 参考:https://blog.csdn.net/jiaomeng/article/details/1495500 ceph osd pool set ssdpool hit_set_type bloom ``` Ceph生产环境缓存层的hit_set_type算法使用了Bloom Filter,此参数含义是启用缓存层的命中集合跟踪,可以设置为bloom, explicit_hash, explicit_object * 设置 hit_set_count、hit_set_period ``` # ceph osd pool set {cachepool} hit_set_count 1 ceph osd pool set ssdpool hit_set_count 1 # ceph osd pool set {cachepool} hit_set_period 3600 ceph osd pool set ssdpool hit_set_period 3600 # ceph osd pool set {cachepool} target_max_bytes 1000000000000 ceph osd pool set ssdpool target_max_bytes 1000000000000 ``` 默认情况下缓冲池基于数据的修改时间来进行确定是否命中缓存,也可以设定热度数 hit_set_count 和热度周期 hit_set_period,以及最大缓冲数据 target_max_bytes。 hit_set_count:缓存层存储的命中集(hitset)数量,设置越大,ceph-osd进程占用内存的量越大。 hit_set_period:缓存层中命中集(histset)多久被覆盖重写,也就是存储的时间周期。 * 设置 min_read_recency_for_promete、min_write_recency_for_promote ``` # ceph osd pool set {cachepool} min_read_recency_for_promote 1 ceph osd pool set ssdpool min_read_recency_for_promote 1 # ceph osd pool set {cachepool} min_write_recency_for_promote 1 ceph osd pool set ssdpool min_write_recency_for_promote 1 ``` min_read_recency_for_promote:在处理一个对象的读操作时检查多少个 HitSet ,检查结果将用于决定是否异步地提升对象。它的取值在 0 和 hit_set_count 之间,如果设置为 0 ,对象会一直被提升;如果设置为 1 ,就只检查当前 HitSet ,如果此对象在当前 HitSet 里就提升它,否则就不提升;设置为其它值时,就要挨个检查此数量的历史 HitSet ,如果此对象出现在 min_read_recency_for_promote 个 HitSet 里的任意一个,那就提升它。min_write_recency_for_promote和min_read_recency_for_promote 类似。 注意:min_read_recency_for_promote和min_write_recency_for_promote的值越高,统计的周期越长,ceph-osd进程消耗的RAM越多。特别是,当代理忙于刷新或逐出缓存对象时,所有hit_set_count HitSet都会加载到内存中。 ## 5. 缓存池容量控制 * 关于刷写和驱逐 * 刷写(flushing):负责把已经被修改的对象写入到后端慢存储,但是对象依然在缓冲池。 * 驱逐(evicting):负责在缓冲池里销毁那些没有被修改的对象。 * 按容量百分比 在缓冲池里,如果被修改的数据达到一个阈值(容量百分比),缓冲池代理就开始把这些数据刷写到后端慢存储。 例如:当缓冲池里被修改的数据达到40%时,则触发刷写动作。 ``` # ceph osd pool set {cachepool} cache_target_dirty_ratio 0.4 ceph osd pool set ssdpool cache_target_dirty_ratio 0.4 ``` 当被修改的数据达到一个确定的阈值(容量百分比),刷写动作将会以高速运作。 例如,当缓冲池里被修改数据达到60%时候,则高速刷写。 ``` # ceph osd pool set {cachepool} cache_target_dirty_high_ratio 0.6 ceph osd pool set ssdpool cache_target_dirty_high_ratio 0.6 ``` 缓冲池的代理将会触发驱逐操作,目的是释放缓冲区空间。 例如,当缓冲池里的容量使用达到80%时候,则触发驱逐操作。 ``` # ceph osd pool set {cachepool} cache_target_full_ratio 0.8 ceph osd pool set ssdpool cache_target_full_ratio 0.8 ``` * 确定的数据对象数量或确定的数据容量 除了上面提及基于缓冲池的百分比来判断是否触发刷写和驱逐,还可以指定确定的数据对象数量或者确定的数据容量。 对缓冲池设定最大的数据容量,来强制触发刷写和驱逐操作。 ``` # ceph osd pool set {cachepool} target_max_bytes 1073741824 ceph osd pool set ssdpool target_max_bytes 1073741824 ``` 同时,也可以对缓冲池设定最大的对象数量。在默认情况下,RBD的默认对象大小为4MB,1GB容量包含256个4MB的对象,则可以设定: ``` # ceph osd pool set {cachepool} target_max_objects 256 ceph osd pool set ssdpool target_max_objects 256 ``` * 时间周期 缓冲池的数据刷新问题在缓冲池里,对象有最短的刷写周期。若被修改的对象在缓冲池里超过最短周期,将会被刷写到慢存储池。 ``` # ceph osd pool set {cachepool} cache_min_flush_age 600 ceph osd pool set ssdpool cache_min_flush_age 600 ``` 注意:单位是分钟 设定对象最短的驱逐周期。 ``` # ceph osd pool set {cachepool} cache_min_evict_age 1800 ceph osd pool set ssdpool cache_min_evict_age 1800 ``` ## 6. 移除缓存池 * 移除read-only的缓存池 ``` # 1. 禁用设置为none即可 # ceph osd tier cache-mode {cachepool} none ceph osd tier cache-mode ssdpool none # 2. 从存储层移除缓存池 # ceph osd tier remove {storagepool} {cachepool} ceph osd tier remove hddpool ssdpool ``` * 移除WRITEBACK模式的缓存池 ``` # 1. 修改缓存池到proxy模式 # ceph osd tier cache-mode {cachepool} proxy ceph osd tier cache-mode ssdpool proxy # 注意:把缓存模式改为 forward,这样新的和更改过的对象将直接刷回到后端存储池 # ceph osd tier cache-mode cache forward--yes-i-really-mean-it ceph osd tier cache-mode ssdpool forward--yes-i-really-mean-it # 2. 确保缓存池被回刷,可能要等数分钟 # rados -p {cachepool} ls rados -p ssdpool ls # 3. 如果缓存池仍然有对象存在,可以通过手动刷新,刷新到存储池 # rados -p {cachepool} cache-flush-evict-all rados -p ssdpool cache-flush-evict-all # 4. 移除重定向,使客户端不再去缓存层交互 # ceph osd tier remove-overlay {storagepool} ceph osd tier remove-overlay hddpool # 5. 最后,移除缓存池 # ceph osd tier remove {storagepool} {cachepool} ceph osd tier remove hddpool ssdpool ``` 如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作! 赞赏支持