• 软件:1158
  • 资讯:38642|
  • 收录网站:95864|

IT精英团

纠删码存储系统中的投机性部分写技术

纠删码存储系统中的投机性部分写技术

浏览次数:
评论次数:
编辑: 美团技术团队
信息来源: 51CTO博客
更新日期: 2021-05-12 09:37:11
摘要

纠删码存储系统中的投机性部分写技术,美团技术团队原创的其他文章。

  • 资讯详情

本文已被USENIX'17年度技术大会录用,此处为中文简译版。
阅读英文论文完整版请点击:Speculative Partial Writes in Erasure-Coded Systems

前言

多副本和纠删码(EC,Erasure Code)是存储系统中常见的两种数据可靠性方法。与多副本冗余不同,EC将m个原始数据块编码生成k个检验块,形成一个EC组,之后系统可最多容忍任意k个原始数据块或校验块损坏,都不会产生数据丢失。纠删码可将数据存储的冗余度降低50%以上,大大降低了存储成本,在许多大规模分布式存储系统中已得到实际应用。

EC给写操作带来了很大的额外开销,包括编解码计算开销和流程性开销两部分。在向量指令集SSE、AVX等的帮助下,一个现代CPU核心的EC编解码能力就可以达到几GB到十几GB每秒,远远大于存储设备的I/O吞吐率。这使得流程性开销成为EC写入性能的最重要制约因素。若一次写操作的偏移和长度没有对齐EC组,就需要部分更新涉及的EC组,因而将此类操作称为部分写。部分写带来了大部分的流程性开销。

处理部分写的最直接办法是将不被写的数据块读出来,跟新数据组合在一起,然后再整体编码并写入。目前Ceph、Sheepdog等系统都采用了这种办法。一种简单有效的改进是将被覆盖数据的原始值读出来,然后根据新旧数据的差值来进行增量编码,得到各个校验块的差值,并“加”到各个校验块上。这种方法可以显著减少系统总体I/O次数,然而它需要对涉及的数据块和所有校验块进行原地读写(即在同一位置进行先读后写),在没有缓存的情况下(常态),HDD需要花费8.3毫秒(7200RPM)的时间旋转一周才能完成写入请求,跟一次随机I/O的平均寻道时间相当。这样的流程极大地影响了写入效率,即便应用层面发出的是顺序写操作,最终得到的性能也跟随机写差不多。

在实际应用当中,只有写操作的偏移和长度都恰好跟EC组对齐才可以避免部分写,然而应用往往无法照顾到底层存储的实现细节和参数,所以部分写构成了写操作的主体,决定了EC存储系统的实际写性能。EC模式的部分写性能大大低于三副本写,这使得EC尚不适用于写操作较多的场合,如云硬盘。

目前业内已有许多工作对这一问题进行改进,其中最具代表性的工作是2014年发表在FAST技术会议上的“Parity Logging with Reserved Space: Towards Efficient Updates and Recovery in Erasure-coded Clustered Storage”,它的核心思路是通过在校验块上记变更日志的方式来减少其上不必要的读操作,同时将随机写变成顺序追加写,以改善写入性能。然而它并不能改善原始数据块上的写流程,这构成了大多数的写操作,所以系统总体写性能改善有限。

我们的改进思路仍然是在校验块上使用变更日志,但与传统方法有显著区别:(1)日志中记录的是数据本身,而不是校验数据的增量差值;(2)对于变更日志中涉及的每一个数据块,都需要额外记录1次且仅1次其变更前的数据,称为d(0);(3)校验块的更新由数据块发起,并且首次请求不附带d(0),若校验块的响应明确表示需要d(0),数据块再将d(0)发送过去。通过这样的设计,系统可以实现在大多数情况下不需要读取并发送d(0)到校验块,此为投机成功;在少数情况下投机失败,仍然需要读取并发送d(0)给校验块,但投机失败的代价仅仅是增加一次网络交互延迟(大约0.1~0.2毫秒),相对于机械硬盘的寻道延迟(平均几毫秒)可以忽略不计,因而这几乎是一个“稳赚不赔”的优化。

投机性部分写:原理、设计与实现

考虑针对同一个数据条带di的一系列r次写操作d(1)i,d(2)i,,d(r)i,校验块为pj(j=1,2,,k),令 d(0)ip(0)j 分别表示 dipj 的原始值。根据增量编码公式

Δpj=aij×Δdi

IntelliJ IDEA母公司JetBrains遭美国调查,其是美国被大规模******的源头?
« 上一篇
返回列表
下一篇 »
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
你会是第一个来这里评论的人吗?
最近发布资讯
更多