现阶段闪存盘技术,顺序读写和随机读性能较好,随机写性能较差。
随机写引起闪存盘内部进行大量垃圾回收,会占用盘带宽。
【小IO聚合】
在向OSD层下发IO前,通过写时重定向(ROW)处理,将多个随机小IO聚合成顺序大IO,从而达到提升写带宽目标。
IO聚合需引入cache,若无cache,则小IO写流程在IO聚合过程需等待,导致时延较大;通过借助cache,小IO写cache完成后即可返回客户端,后台进行IO聚合等处理流程。
写cache,在写入到DRAM同时以日志形式写AEP(Intel) 或SSD等设备。
合理高效利用有限cache空间,达到预设阈值数据下刷后端存储。
整合各个物理节点AEP和SSD存储空间,以池形式(分布式cache)提供服务,通过冗余策略提高数据可靠性。
通过上层协议指定预读策略预取数据存入读cache,依据淘汰策略及时淘汰回收。
【重复数据删除】
写入重定向方案,借助KV数据库(如RocksDB)维护元数据(UserObject:offset -> RowObject:offset地址映射,后文称重定向元数据表),即原始用户对象数据与重定向对象数据的地址映射关系。
写入重删、压缩机制,提高闪存存储利用率。
后文称,IO流程中重删处理为在线重删,非IO流程中重删处理为离线重删。
若重删压缩功能使能,聚合IO前进行重删(在线重删)、压缩处理。
某大小粒度数据块,根据算法计算数据块摘要值(数据指纹),查询指纹是否已存在指纹集内存缓存(离线重删维护),若已存在,则判定为重复数据,数据无需落盘,记录相关元数据;否则,数据需正常落盘。
在线重删,重定向元数据表记录key为原始用户对象数据地址(UserObject:offset),value值为指纹;重删元数据需维护指纹与重定向对象数据地址映射。
非重复数据,在记录重定向元数据表value值携带记录指纹值,便于后续离线重删处理。
利用重定向元数据表sst文件level compact,收集指纹,指纹热度达到预定阈值,进行离线重删处理,指纹提升处理(存入指纹集内存缓存)。
根据淘汰规则(如存在时间、指纹热度)决定是否需淘汰该指纹。
读取重删数据,先读取重定向元数据表得到指纹,再依据指纹在重删元数据指纹表中获取重定向数据地址读取实际数据。
集群级指纹缓存,可针对指纹hash归置打散到各个物理节点。
防止指纹相关记录表单点故障,以池形式提供服务,通过冗余策略提高数据可靠性。
【数据压缩】
完成重删处理,数据进行压缩,压缩后数据以更小粒度进行压紧处理。
具体重定向对象,标识内部各个原始数据段在此对象偏移。
由于采用非覆盖写,需进行重定向对象数据中垃圾数据识别,借助重定向元数据compat,相同原始对象地址,识别垃圾数据,记录具体对象数据垃圾数量,后续实现垃圾回收、有效数据搬运。