之前有读者问有没有ceph缓冲池配置教程,刚好之前在这本书上看到过,就转载给大家学习一下。
缓冲池原理
缓冲(Cache,为便于读者理解,本文直接使用Cache)技术是为了协调吞吐速度相差较大的设备之间数据传送而采用的技术。
传统上,Cache为了缓和CPU和IO设备速度不匹配的矛盾,提高CPU和IO设备的并行性而存在的,在现代操作系统中,几乎所有的IO设备在与CPU交换数据时都用了Cache。所以,在计算机组成里,每个部件的设计都可以看到Cache的影子。 例如,CPU的L1 Cache、L2 Cache和L3 Cache,甚至还有L4 Cache(IBM Power8)。文件系统会设计页面缓存(Page Cache),而硬盘内部也会设计易失性缓存,一般容量为16/32/64MB。
既然提及Cache,也需要说明一下缓冲(英文Buffer,同理,本文直接使用Buffer)。为了让大家区分Cache和Buffer概念,我们仔细分析一下。Cache的设计原理是把读取过的数据保存起来,如果在以后的操作中重新读取时则命中(找到需要的数据),就不要去读较慢的设备,若没有命中就读较慢的设备。Cache的目标是把频繁读取的数据进行组织,并把这些内容放在最容易找到的位置,而把不再读的内容不断往后排,直至从Cache中删除。实际上,读者会想到,Cache就是优先存放“热数据”,其性能指标是“命中率”。
Buffer的设计原理是把分散的写数据内容集中进行,按照一定周期写到目标设备。典型的应用场景是磁盘写,通过Buffer机制,写数据时候减少磁盘碎片和硬盘的反复寻道过程,从而提高系统的性能。
我们可以暂且认为Cache是针对读优化,而Buffer是针对写优化。
在本地计算机结构组成里,相比CPU和内存之间的IO差距,内存和机械硬盘的IO差距较为明显。而固态硬盘的出现,无论IOPS和带宽都胜过机械硬盘,同时内存和固态硬盘的IO差距较机械硬盘小。比较内存、固态硬盘和机械硬盘的每GB单位成本,得出的结果是内存>固态硬盘>机械硬盘。在这个成本和技术的前提下,有不少工程师提出:能否通过固态硬盘作为机械式硬盘Cache/Buffer实现数据缓存策略呢? 目前有较多的开源和商业存储领域软件和硬件提供这种分级缓存/缓冲机制。例如,在软件方面有ZFS、LVM、Bcache、Flashcache、Enhanceio和Intel CAS;在硬件方面,Intel公司和LSI推出新形态的RAID阵列卡,这类阵列卡配备板载的SSD作为加速,外部通过minSAS连接外部硬盘。
上面介绍了缓冲技术的基础知识及背景,下面我们来介绍Ceph中缓冲技术的基本实现原理。
数据都是以object形式存放在Ceph中,这些object数据都是存储在资源池中(即pool),而组成pool的基本单位是OSD,因此充当OSD的存储介质的性能决定了整个资源池的最终性能。存储介质性能的差异,造成了资源池性能的最终差异性,因此使用SSD固态硬盘这一类的高速且价格昂贵的存储介质组成高性能资源池,使用SATA机械硬盘这一类低速廉价的介质组成低速高容量资源池,Ceph为此提出了缓冲池技术,比较完美地平衡了性能和成本的关系。要实现缓冲池技术,首先需要将整个存储系统按照存储介质的性能分为前端高速缓冲池和后端低速存储池,使用特定算法将数据写入和读取流程进行适当的调整,将访问次数比较频繁的热数据缓存储在前端高速缓冲池中(对应热数据上浮),而访问量比较低的冷数据则存储在后端低速存储池中(冷数据下沉),从而实现提高读写性能的目的,如图所示。介绍了基本的缓冲资源池原理之后,还需要向读者介绍Ceph中提供的两种不同类型的缓冲资源池策略模式。
1)写回模式:
当用户配置了写回模式,所有来自客户端的写入请求都会在抵达前端高速缓冲池后收到ACK确认,之后由高速缓冲池按照一定的策略将数据写入后端低速存储池,完成数据的最终写入。在这个模式下,前端高速缓冲池充当整个写入操作的前端缓存。当客户端需要读取数据时,读取请求先到达高速缓冲池,之后高速缓冲池从低速存储池中加载相应数据,加载完毕再由高速缓冲池返回客户端所需的数据。当客户端请求相同的数据,则直接由高速缓冲池返回之前已经加载的数据,如果数据长时间没有被访问,则会从高速缓存池清除。这个模式比较适合数据经常发生变更,又需要经常被访问的情况。
2)读取转发模式:
这个模式下读写操作都在前端高速缓冲池进行,如果客户端需要读取的数据不在高速缓冲池中,则读取请求会被转发到后端。这个模式一般用于高速缓冲池容量已经被耗尽,而又无法做扩容的情况。
缓冲池部署
自从0.80版本开始,Ceph加入缓冲池技术。在当前固态硬盘每IOPS性价比占优,而机械硬盘每GB容量更具性价比,根据业务系统数据读写的局部性,可以通过缓冲池技术把SSD存储池作为HDD存储池的前端高速缓冲池。
缓冲池的建立与管理
假设我们通过ceph-deploy工具部署一个标准的Ceph集群,默认所有OSD在CRUSH里都是Default Rule。本次实验,我们需要自定义Rule,对Pool指定使用某个Rule,即Pool上承载的数据均落到该Rule的硬盘上。因此,我们需要定义SATA Rule和SSD Rule。
定义SATA Rule,可以使用当前已经存在的OSD。而定义SSD Rule之前,需要为每个OSD服务器节点添加SSD。按照之前添加OSD的方法,把“SSD”OSD添加到Default Rule。然后基于“SSD”OSD创建SSD Rule,然后根据这个Rule创建SSD Pool。这样就具备SATA Pool和SSD Pool。实验只是逻辑示意,若考虑性能请选取SSD构建SSD Pool。
下面开始配置以ssd-pool作为sata-pool的前端高速缓冲池。
1)新建缓冲池,其中,ssd-pool作为sata-pool的前端高速缓冲池。
ceph osd tier add sata-pool ssd-pool
2)设定缓冲池读写策略为写回模式。
ceph osd tier cache-mode ssd-pool writeback
3)将客户端访问从sata-pool切换到ssd-pool。
ceph osd tier set-overlay sata-pool ssd-pool
缓冲池的参数配置
关于缓冲池的参数配置,遵循以下格式:
ceph osd pool set {cachepool} {key} {value}
(1)使用布隆过滤器以快速查找目标数据 Ceph在生产环境中会使用布隆过滤器(Bloom-Filter,1970年由Bloom中提出。它可以用于检索一个元素是否在一个集合中)实现在缓冲池中快速查找目标数据。
注意Bloom Filter是由Bloom在1970年提出的一种多Hash函数映射的快速查找算法。通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合。
设置缓冲池使用布隆过滤器
ceph osd pool set ssd-pool hit_set_type bloom
默认情况下缓冲池基于数据的修改时间来进行确定是否命中缓存,也可以设定热度数hit_set_count和热度周期hit_set_period,以及最大缓冲数据target_max_bytes。
ceph osd pool set ssd-pool hit_set_count 1 ceph osd pool set ssd-pool hit_set_period 3600 ceph osd pool set ssd-pool target_max_bytes 1073741824
(2)缓冲池容量的控制 在讲解缓冲池大小的问题之前,先来看看缓冲池的代理层的两大主要操作。
❑刷写(flushing):负责把已经被修改的对象写入到后端慢存储,但是对象依然在缓冲池。
❑驱逐(evicting):负责在缓冲池里销毁那些没有被修改的对象。
缓冲池代理层进行刷写和驱逐的操作,主要和缓冲池本身的容量有关。在缓冲池里,如果被修改的数据达到一个阈值(容量百分比),缓冲池代理就开始把这些数据刷写到后端慢存储。例如,当缓冲池里被修改的数据达到40%时,则触发刷写动作。
ceph osd pool set ssd-pool cache_target_dirty_ratio 0.4
当被修改的数据达到一个确定的阈值(容量百分比),刷写动作将会以高速运作。例如,当缓冲池里被修改数据达到60%时候,则高速刷写。
ceph osd pool set ssd-pool cache_target_dirty_high_ratio 0.6
当缓冲区的使用率达到一个确定的阈值(容量百分比),缓冲池的代理将会触发驱逐操作,目的是释放缓冲区空间。例如,当缓冲池里的容量使用达到80%时候,则触发驱逐操作。
ceph osd pool set ssd-pool cache_target_full_ratio 0.8
除了上面提及基于缓冲池的百分比来判断是否触发刷写和驱逐,还可以指定确定的数据对象数量或者确定的数据容量。 例如,对缓冲池设定最大的数据容量,来强制触发刷写和驱逐操作。
ceph osd pool set ssd-pool target_max_bytes 1073741824
上述数值单位为字节,1073 741824 B = 1 GB。 同时,也可以对缓冲池设定最大的对象数量。在默认情况下,RBD的默认对象大小为4MB,1GB容量包含256个4MB的对象,则可以设定:
ceph osd pool set ssd-pool target_max_objects 256
在RBD创建镜像时候,可以指定每个对象的大小。而在文件存储和对象存储,每个对象的大小也不一样,所以target_max_objects的数值需要根据业务场景进行设置。
注意,如果target_max_bytes和target_max_objects都设定了,会以“最近达到阈值”的机制触发刷写和驱逐动作。
(3)缓冲池的数据刷新问题 在缓冲池里,对象有最短的刷写周期。若被修改的对象在缓冲池里超过最短周期,将会被刷写到慢存储池。例如,设定最短刷写周期为10分钟。
ceph osd pool set ssd-pool cache_min_flush_age 600
同时,也可以设定对象最短的驱逐周期。例如,设定最短驱逐周期为30分钟。
ceph osd pool set ssd-pool cache_min_evict_age 1800
缓冲池的关闭
1)删除缓冲池。 删除一个只读缓冲池。因为只读缓冲池没有包含修改的数据内容,所以可以直接关闭并移除。2)改变缓冲池读写模式为none,即关闭缓冲池。
ceph osd tier cache-mode ssd-pool none
3)移除缓冲池。
ceph osd tier remove sata-pool ssd-pool
删除一个读写缓冲池。因为读写缓冲池包含修改的数据内容,为了不丢失数据,应进行如下操作。1)把缓冲池读写模式变为forward,目的是让修改过的数据刷写到慢存储。
ceph osd tier cache-mode ssd-pool forward
2)等待数分钟,确保ssd-pool的修改数据刷写到慢存储。
rados -p ssd-pool ls
3)如果ssd-pool仍然存在数据,可以强制刷写和驱逐。
rados -p ssd-pool cache-flush-evict-all
4)卸载慢存储的缓冲池。
ceph osd tier remove-overlay sata-pool
5)删除慢存储的缓冲池。
ceph osd tier remove sata-pool ssd-pool
至此,完成整个缓冲池的删除操作,读者根据实际情况选择是否删除对应的ssd-pool。 本节介绍了缓冲池技术的基本原理和基础操作,需要注意的是:目前缓冲池技术在一些应用场景下还存在性能和稳定性问题,特别是Ceph官方强烈建议不要在RBD块存储一类对读写操作频繁且性能要求也比较高的场景下使用缓冲池技术,只建议在RGW对象存储之类场景下使用该技术。