写点什么

架构与算法创新,让分布式存储焕然一新!

作者:Geek_2d6073
  • 2022 年 7 月 08 日
  • 本文字数:4304 字

    阅读完需:约 14 分钟

分布式存储在数据存储产业中的占比越来越高,得益于分布式 Scale-out 的高扩展性,以及高速网络技术的发展,分布式存储逐渐成为主流,解决海量跨源、跨域、跨协议的非结构化数据“存得下”,“管得好”以及高效互通的问题。

企业用户希望从分布式存储获取哪些能力呢,可以概括为五点:高性能、低成本、高可靠、易管理、易扩展。针对这些核心诉求,鲲鹏 BoostKit 分布式存使能套件打造了全局缓存特性,本质上是一个分布式存储使能中间件,即中间的软件层,这里简单将全局缓存支持或者规划的特性总结为资源管理、系统加速以及企业高级特性三类,用于解决伙伴和企业对于数据存储的核心需求。



以高性能需求为例,我们通过结合读写缓存来缩短读写访问路径,提供低时延访问,结合数据聚合实现随机写入转为顺序写入,大幅削减磁盘寻道、旋转延迟对硬盘能力发挥的阻碍,以及结合全新设计的元数据管理引擎实现变长数据自适应管理。

全局缓存实现高性能、低成本、高可靠、易管理、易扩展,得益于其架构,以及算法创新,接下来我们分别分享其背后的设计思路。

全局缓存的软件架构设计:遵循清晰、合适、易演进原则



(图:全局缓存技术堆栈)

全局缓存是一个华为自研的分布式存储缓存加速套件,支持一体化、自管理、可扩展部署,提供掉电保护,并且不存在单点故障问题。

整体的架构设计遵循清晰简洁、合适和易演进的原则,从而把系统设计的足够简单,原因在于我们知道分布式存储可以看作是分布式系统的集大成者,其不仅包含各种正常功能场景,比如我们前面提到的资源管理、系统加速以及企业特性,还包括非常多的异常流程,这些正常流程与异常流程正交以后导致我们系统复杂度非常容易膨胀。

虽然任何分布式系统都有正常和异常流程,但其实是有差别的,因为分布式存储承载了用户核心数据,是不允许数据丢失或不一致的,业务恢复不仅要考虑 RTO,还要考虑 RPO,增加一个维度,带来的复杂度不是翻倍,而是升维,本质上还是一个正交的过程。

基于此,整个架构设计过程都致力于降低系统复杂度,第一步就是充分解耦,从图中可以看到,全局缓存从逻辑和部署都是与计算集群和存储集群解耦的,相当于一层缓存加速中间件,从而可以实现自管理、独立部署、独立运行,不侵入 Ceph 等开源软件,做到应用无感加速。



解耦之后,全局缓存借鉴微服务的思想,通过客户端适配层、服务端适配层和存储代理层等抽象外部接口依赖,相当于 API 网关,对外屏蔽系统内部的复杂性,最小化场景、协议以及软件升级等带来的适配开销。

对于全局缓存的软件架构,其整体可以看作一个微内核架构,除了管理工具和 ZK 等是独立进程部署以外,为了避免数据面和控制面的耦合以及相互影响,我们还将数据面和控制面拆分成了独立进程,这样就可以避免故障场景等场景的相互耦合与影响。

但是我们知道,服务并非拆分的越细越好,为了实现高性能、低时延,全局缓存数据面服务整体部署成独立进程,避免复杂的接口框架,消息通讯带来的时延和调用栈的开销;单纯看数据面,内部采用模块化解耦设计,包含多个子系统,如多级读写 Cache、元数据索引、数据聚合、数据持久化等子系统,这些子系统之间通过内部接口调用进行交互,不需要走消息通讯,所以调用链路短,时延低,并且模块化的设计可以使得协同开发与迭代变得高效和并行。

在模块化设计之上,全局缓存也遵循 solid 等设计原则,例如读写缓存、元数据 DB 等依赖于持久化层提供的数据持久化服务,它们之间的交互遵循接口隔离和依赖倒置等原则,实现充分解耦,从而将 N*M 的复杂度量级降低到 N+M。

缓存架构创新:读写分离、前后台分离



针对缓存架构,首先,全局缓存采用了读写分离设计,从而实现流程、资源、介质、冗余策略的解耦,流程解耦例如避免写缓存刷盘和读缓存淘汰相互影响,资源解耦例如实现读写缓存独立的配额控制,介质解耦例如支持 RAM/SCM/SSD 等不同介质加速,冗余策略解耦例如读写缓存支持不同的副本策略,这样就可以提高缓存命中率和资源利用率。

其次,全局缓存采取前后台分离的设计模式,将请求处理路径分为前台和后台两部分,前台部分保证最快的响应应用的读写请求,应用只会感知到前台部分的执行时间,从而实现极低的应用访问时延。在实现读写分离以及前后台分离的缓存架构的基础上,可以进行缓存的执行流编排,全局缓存的架构及其执行流可以做到从设计上屏蔽或缓解缓存原生的一致性问题和雪崩、击穿、穿透等问题。例如,针对一致性问题,数据状态是在分布式缓存池中维护,客户端无状态,不存在源端状态同步开销;全对称分布式架构,结合去中心化路由算法,实现数据精准路由,数据精准定位到主节点;结合协商的执行流编排,保障分段逐级命中最新数据,例如首先命中写 Cache 脏数据,然后 L1 读 Cache,L2 读 Cache,最后才是后端存储,命中即返回,从设计上保证不会读到老数据。

高性能、低成本核心算法设计

在全局缓存特性中,我们应用了规模化的降本增效算法,这些算法集结了华为公司海内外研究所,以及高校老师的全球智慧,也是全局缓存实现性能领先、成本领先的核心技术保障。

高性能算法主要包括读路径加速和写路径加速两类,针对写路径加速,我们知道,HDD 磁盘的寻道和旋转延迟是访问时延的大头, HDD 对 IO 数量和放大非常敏感,以 8K 数据为例,如果是随机写入,一般可以做到单盘 100 IOPS 量级,而顺序写入主流硬盘可以达到 3W+ IOPS 量级,所以上述的缓存前后台分离架构的前提是要与高效的算法配合,不然由于后端刷盘来不及,很快就会导致缓存写满转透写。



为此,通过 IO 聚合算法实现全周期 Append-only 模式的磁盘友好写入,IO 聚合过程可以转化为一个带约束的组合优化问题,并结合启发式方法实现最小空间浪费;数据聚合以后,需要结合自研的 TeraDB KV 数据库实现小对象到聚合对象的映射管理,命名 TeraDB 的原因是每台服务器管理的元数据量上限大概是 700GB,接近 1TB;针对元数据管理,全局缓存采用了 LSM 的结构,LSM 对小块的频繁更新比较友好,但是由于其分层结构,对读取不友好,针对此问题,全局缓存设计了自适应的布隆过滤器来实现批量检测 Key 存在性,提高读性能,另外由于非结构化数据本身数据大小多变,我们还设计了变长粒度树,实现大小对象的自适应管理,既提高了查询效率,又避免了资源浪费,大幅节省元数据开销。

那么,实现了 IO 聚合与映射就可以了吗?并非如此,因为数据更新和删除还是以聚合之前的粒度进行,那么在数据更新或删除以后,我们需要进行垃圾回收来释放空间,垃圾回收会引入写放大,这就是我们需要支付的开销,控制写放大就成了我们是否可以实现性能提升的关键因素。

针对读路径,我们结合丰富的模式识别与挖掘算法,例如结合时间序列预测挖掘流式模型,多模特征聚类挖掘热点模型,频繁模式挖掘得到关联模型,以及粗放式冷热识别得到工作集关联模型,基于这些 Pattern 挖掘算法,辅以全局负反馈调整,可以实现精准的模式挖掘以及预取门限、预取长度等参数的自适应整定,在特征不明显的多源混合场景实现 70%以上缓存命中率,模式较为规整的负载下实现接近 100%的缓存命中率。



算法创新思路之一:理论为基石,探究算法极限

举两个示例,第一个是刚才提到的如何实现理论最优的写放大,针对垃圾回收写放大问题,工业界一般认为最优回收算法,或者说写放大最小的回收算法,是贪心算法,所以在优化写放大过程中不存在算法设计,只有数据结构设计,例如是通过分级链,还是通过优先队列去管理回收对象。

但其实并非如此,针对这个问题,全局缓存研发团队结合学术论文的分析,实现了基于逻辑时钟驱动的垃圾回收建模推导,并通过主动分区实现理论最优写放大算法和数据结构设计,推导发现在均匀 Workload 负载下,贪心算法确实是最优的,原因在于均匀 Workload 下面其不具备后效性;但是在非均匀 Workload 下面,贪心算法并不是最优的,而我们知道真实的业务负载基本都是非均匀 Workload。

具体的推导过程是我们将每次数据更新写入当成逻辑时钟,来驱动系统的状态进行变化,状态主要就是每个聚合对象的垃圾量,然后套用 Lambert 方程进行时空特征建模,得到垃圾生成模型,转换成最优化问题并求取数值解,实现 OP 超供容量的主动分区;这样,在非均匀 Workload 下,结合主动分区实现最优 OP 配额控制,得到理论最优解,从右侧图中可以看出写放大收益可以达到 30%以上,并且比 CB 等复杂算法的效果更好。



算法创新思路之二:算法与架构配合,最大化算法效果

针对读路径加速算法示例,我们不单独讲算法原理,来切换一个视角,主要介绍下如何通过预取算法与预取架构配合,最大化发挥前面提到的智能预取、数据淘汰等算法的效果。

在预取架构方面,全局缓存创新性的提出 Client 端推荐引擎与 Server 端执行引擎分离的智能预取架构,相对于业界流行的分布式缓存预取模式,兼具单机推荐的高效 &准确性,以及缓存池的高资源利用率。



(1)作为对比,相对于标号 1 Server 端本地推荐这种模式,由于我们的数据未经源端打散,推荐引擎天然具备全局 Trace 视图,从而可以进行全局精准推荐,同时由于推荐引擎部署在客户端,在共享卷等场景,也不会发生多源扰邻,可以精准匹配用户 Workload。

(2)相对于标号 2 的 Server 端中心化推荐这种模式,可以做到不存在单点故障,还可以减少数据推送和执行策略拉取两跳网络开销,如图中黄色箭头所示,从而避免缓存伪命中,所谓的伪命中指的是已经下发预取请求,由于推荐、执行链路过长导致请求到达时,预取数据还未加载到缓存。

针对成本目标,BoostKit 全局缓存通过 EC Turbo、数据压缩、数据压紧等创新算法,提升分布式存储有效容量,帮助用户降低成本。EC Turbo 支持 4+2~22+2 大比例 EC,用户可用容量提升 2~2.75 倍;自研的 GLZ 数据压缩算法结合原理级、结构级、指令级三级优化,实现对比 LZ4、gZip 等业界流行算法压缩率高 30%,并且系统性能也可以提高 30%,从而实现成本、性能双收益;数据压紧算法配合压缩算法一起使用,通过减少压缩后数据因数据对齐产生的补零空间浪费,实现更紧凑的数据落盘,压缩率能够继续提升 30%。

总结来说,鲲鹏 BoostKit 全局缓存结合 EC Turbo、数据压缩、数据压紧等算法突破,相对于开源方案可以实现 3 倍以上用户可用容量提升,大幅节省 TCO;后续还将推出全局数据重删特性,进一步提升数据缩减率,并覆盖备份存储等场景。

目前,鲲鹏 BoostKit 全局缓存与某大型运营商开展了联合创新,分别采用 3 台 X86 服务器和 3 台鲲鹏服务器组成 2 个服务集群,其他硬件保持相同,然后进行缓存命中极限性能测试。测试数据显示,全局缓存端到端性能达到 14W IOPS/节点,以及 1ms 稳定时延;相对来说,X86 硬件+开源 BCache+开源 Ceph,则为 1.2W IOPS/节点,同时时延只能做到 26ms,全局缓存实现了 10 倍的性能优势。

如果要了解更多的全局缓存相关的部署使用方法和学习资源,登录 hikunpeng.com——鲲鹏社区 BoostKit 专区获取详细信息。

用户头像

Geek_2d6073

关注

还未添加个人签名 2021.12.22 加入

还未添加个人简介

评论

发布
暂无评论
架构与算法创新,让分布式存储焕然一新!_Geek_2d6073_InfoQ写作社区