当前位置: 首页 > news >正文

socc 19 echash论文部分解读

前言:论文还是得吃透才行,不然很多细节有问题


q1 object和data chunck哪一个大

根据论文,一个 data chunk 通常比一个 object 大,因为它是由多个 object 组合而成的 。 论文中提到,cross-coding 会将多个 object 组合成固定大小的 data chunk 。例如,默认的 data chunk 大小被设置为 4 KiB 。而 KV 存储系统中的 object 大小各异,很多情况下 object 都很小

q2 传统 Cross-Coding 中 Data Chunk 不能映射到两个节点的原因

在传统的 cross-coding 和一致性哈希结合的方案中,data chunk 被视为一个整体单元,并且与一个特定的物理节点绑定 。当进行伸缩操作(如添加新节点 N4)时,如果一个 object(例如 object ‘a’)根据一致性哈希的规则从节点 N1 迁移到新的节点 N4,那么包含 object ‘a’ 的原始 data chunk(在 N1 上)就会发生逻辑上的改变(因为它失去了 object ‘a’)。同时,object ‘a’ 到了新节点 N4 后,会成为 N4 上某个新 data chunk 的一部分
核心原因在于:

数据块的整体性与节点绑定: 在传统设计中,一个 data chunk 被认为是一个不可分割的单元,存储在单个节点上 。它不是被设计为可以“跨越”多个物理节点存在的。

一致性哈希的对象级映射: 一致性哈希是根据对象的键来决定对象应该存储在哪个节点上 。当节点变化导致对象重新映射时,是整个对象从一个节点移动到另一个节点。
校验块的依赖性: 由于 data chunk 发生了改变(旧的 data chunk 少了一个 object,新的 data chunk 多了一个 object),那么依赖于这些 data chunk 计算出来的所有 parity chunk(校验块)也必须随之更新,以保证数据的可恢复性 。

论文中引用的图1(b) 就清晰地展示了这个问题:当 object ‘a’ 和 ‘c’ 迁移到新节点 N4 后,原来 N1 和 N2 上的 data chunk 都发生了变化,导致了 parity chunk 的更新 。

FragEC 如何解决这个问题:

FragEC 模型允许一个逻辑上的 data chunk 的组成部分(即 objects 或 sub-chunks)物理上分布在不同的节点上 。通过 OIRList(Object Index Reference List)来维护 data chunk 的逻辑组成 。即使 object 迁移了,只要 OIRList 不变,逻辑上的 data chunk 就没变,因此无需更新 parity chunk 。这就是 FragEC 如何解决 “Challenge 1” 的关键

q3一个服务器会出现在多个哈希环中吗

不,在 ECHash 的设计中,一个物理服务器通常在同一时间只会被分配到一个哈希环中。论文中提到:“all the M nodes are dispersed across n isolated hash rings” ,这意味着所有物理服务器(节点)的总集合被划分到这 n 个哈希环中 。其目的是创建隔离的区域,以便一个哈希环中的伸缩操作不会直接影响到同一个条带在另一个哈希环中的数据放置策略。

q4所有的条带都是n个块吗

是的,在 ECHash 使用的 (n,k) 纠删码的上下文中,所有条带都由 n 个块组成 。这是 (n,k) 纠删码工作方式的基础:k 个原始数据块被编码以产生额外的 n−k 个校验块,从而每个条带总共有 n 个块 。这 n 个块中的任意 k 个块足以重建原始的 k 个数据块 。

q5 ECHash 将所有节点划分到 n 个隔离的区域,这里的节点定义是啥,是服务器吗

在论文中,“节点 (nodes)” 和 “服务器 (servers)” 是可以互换使用的 。因此,当 ECHash “将所有 M 个节点划分到 n 个隔离的区域 (n isolated hash rings)” 时 ,它指的是所有的 M 台物理服务器被分配到这 n 个哈希环中 。论文还澄清说:“一个哈希环至少包含一个用于存储对象的节点”

q6 论文中的self coding 和 crossing coding的区别

论文中提到的 self-coding (自编码) 和 cross-coding (跨节点编码) 是应用 (n,k) 纠删码的两种不同方法 。它们的主要区别在于编码操作的对象粒度和数据组织方式:

Self-Coding (自编码):

操作粒度: 以单个对象为单位进行操作 。
数据分割: 将每一个对象分割成 k 个数据单元(splits) 。

编码过程: 对这 k 个数据单元进行纠删编码,生成 n−k 个校验单元 。
存储分布: 属于同一个对象的这 n 个单元(k 个数据单元和 n−k 个校验单元)被存储在 n 个不同的节点上 。
适用场景: 适合存储大对象(例如,大于1MB),常用于大数据分析场景 。
在分布式KV存储中的缺点:
不适合处理极小的对象(例如,2字节),因为将小对象再切分成更小的数据单元不切实际 。
由于每个对象都被分割成多个小的数据单元,访问或重建对象时需要中心化的元数据查找来确定和管理所有这些小单元的位置,效率较低 。
Cross-Coding (跨节点编码):

操作粒度: 以跨节点的数据块 (data chunk) 为单位进行操作。
数据组织: 对象首先被分布存储在不同的节点上 。在每个节点内部,该节点存储的多个对象被组合成一个固定大小的数据块 。

编码过程: 选择来自不同节点的 k 个数据块,然后将这 k 个数据块编码生成 n−k 个相同大小的校验块 。

存储分布: 这 k 个数据块和 n−k 个校验块(共同构成一个条带)被分布存储在不同的节点上 。

适用场景/优点:
可以通过将小对象组合成固定大小的数据块来支持小对象存储 。

可以通过一致性哈希直接计算(而非查找)对象的位置,从而无需中心化的元数据查找即可访问对象,便于实现去中心化的对象管理 。

论文作者认为,对于去中心化键值存储系统而言,cross-coding 是一种更合理的纠删码应用技术,因此他们的工作主要集中在优化 cross-coding 。

q7 为什么扩展后parity chunk不需要更新

无需更新校验块的原因:
尽管对象 d 和 h 的物理位置改变了,但定义 data1 和 data2 的OIRList(即它们的逻辑组成和对象顺序)并没有改变 。data1 在逻辑上仍然是 {a, b, c, d},data2 在逻辑上仍然是 {e, f, g, h} 。

校验块(parity chunk)是基于这些逻辑数据块(data1 和 data2)的内容计算出来的 。
由于逻辑数据块的内容和组成没有发生任何变化,因此之前计算出的校验块依然有效,不需要进行任何更新 。

元数据的角色:
Object Index 记录每个对象(碎片)的当前物理位置(在哪个节点上)以及它属于哪个条带和块等信息 。
Chunk Index (特别是 OIRList) 记录每个逻辑数据块是由哪些对象(碎片)以及按什么顺序组成的 。

当系统需要使用 data1 时(例如用于解码或响应读取请求),它会查看 data1 的 OIRList 知道它包含哪些对象,然后通过 Object Index 找到这些对象当前分别存储在哪个物理节点上,再将它们聚合起来形成逻辑上的 data1。

q8 OIRList是啥

OIRList (Object Index Reference List) 的工作原理,根据论文中的描述,主要是作为逻辑数据块 (data chunk) 和构成它的实际对象 (objects/fragments) 之间的桥梁和定义者。它的核心作用是记录一个数据块是如何由多个对象组成的。

具体来说,OIRList 的工作原理如下:

定义数据块的组成和顺序:

对于每一个逻辑数据块 (data chunk),都有一个与之关联的 OIRList。
这个列表详细指明了哪些对象(或者说对象的引用/索引)构成了这个特定的数据块。
OIRList 还定义了这些对象在这个数据块中的组织顺序。
与 Chunk Index 关联:

OIRList 是 Chunk Index 的一部分。
Chunk Index 是一个哈希表,它将一个数据块的唯一标识符 (Chunk ID) 映射到该数据块的 OIRList。
解耦逻辑块与物理存储:

通过 OIRList,FragEC 模型实现了数据块的逻辑定义与其组成对象物理存储位置的分离。
一个逻辑数据块的内容是由 OIRList 中列出的对象及其顺序决定的。这些对象(作为数据块的碎片或子块)可以物理地存储在不同的节点上。
在伸缩操作中保持不变:

当发生节点伸缩(添加或删除节点)导致对象迁移时,对象的物理位置会改变(这个变化会更新在 Object Index 中)。
然而,只要数据块的逻辑组成(即哪些对象以及它们的顺序)没有改变,那么对应的 OIRList 就会保持不变。
因为 OIRList 不变,所以逻辑数据块本身被认为是未改变的。这是实现“伸缩过程中无需更新校验块”的关键,因为校验块是根据逻辑数据块的内容计算的。
在数据操作中的作用:

当需要读取、更新或参与纠删码计算(如解码、修复)一个逻辑数据块时,系统会首先通过 Chunk ID 找到其 OIRList。
然后,根据 OIRList 中列出的对象引用,系统会去 Object Index 中查找这些对象的具体物理位置和元数据(如在块内的偏移、长度)。
接着,系统从各个物理位置收集这些对象(碎片),按照 OIRList 定义的顺序将它们组合起来,从而在内存中(或逻辑上)重建出完整的数据块。
简单来说,OIRList 就像一个**“配方单”**,它告诉系统一个逻辑数据块是由哪些“原料”(对象/碎片)以及按照什么“步骤”(顺序)组成的。即使这些“原料”的存放“仓库”(物理节点)发生了变化,只要“配方单”不变,那么最终“烹饪”出来的“菜品”(逻辑数据块)就是一样的,因此之前基于这个“菜品”调制的“酱汁”(校验块)也依然适用。

q9 一些metadata

图6,我们从左到右,从上到下来看这些组件:

Object Index (对象索引)

功能:这是一个哈希表,它将对象的键 (Key) 映射到一个64位的存储桶 (bucket) 。
存储桶内容 (Bucket Format - 见图右侧表格1) :每个存储桶包含四部分关键信息 :

Length (L): 对象值的长度 。
Offset (O): 对象在其所在数据块中的偏移量 。
Stripe ID (S): 该对象所属的条带 (stripe) 的唯一标识符 。
Chunk index ©: 该对象在其所属条带中的块索引(从0到n-1)。
作用:通过 Object Index,系统可以快速定位到一个对象的元数据,知道它的大小、在哪个逻辑块的哪个位置、属于哪个纠删码条带。
Chunk Index (块索引)

功能:这也是一个哈希表,它将一个数据块的唯一标识符 (Chunk ID) 映射到一个列表,这个列表显示了该数据块是如何组织其内部的对象的 。
OIRList (Object Index Reference List - 对象索引引用列表) :这个列表(图中用 “OIRList” 框表示,内部有指向 Object Key 的箭头)是 Chunk Index 的核心部分。它指定了构成该数据块的所有对象的索引引用(即这些对象在 Object Index 中的条目),以及这些对象在该数据块中的组织顺序 。

图中的 OIRList 包含多个小方块,每个小方块代表一个对象,并有一个指针 (ptr) 指向下一个对象,形成一个链表结构,定义了对象在数据块内的排列顺序 。
作用:Chunk Index (通过 OIRList) 定义了一个逻辑数据块的构成。即使组成这个数据块的对象物理上存储在不同的节点上,OIRList 依然定义了这个数据块的逻辑完整性和内部结构。这是实现“无需更新校验块”的关键,因为只要 OIRList 不变,逻辑数据块就不变。
Data Chunk (数据块)

构成:如图所示,一个 Data Chunk 由多个对象的实际值 (Value1, Value2, …) 按照 OIRList 定义的顺序组合而成 。这些对象的值是从 Object Index 间接指向的。
编码单元:这些 Data Chunk 是进行纠删编码的基本单元。k 个 Data Chunk 会被编码成 n-k 个 Parity Chunk 。
碎片化:论文的核心思想是,构成一个 Data Chunk 的这些对象(即图中的 Value1, Value2 等)可以根据一致性哈希分布在不同的物理节点上,实现了 Data Chunk 的“碎片化”存储 。

Stripe Index (条带索引)

功能:这是一个哈希表,它将一个条带的唯一标识符 (Stripe ID) 映射到该条带的元数据 。

条带元数据 (Stripe Metadata):这些元数据包括了该条带中所有 k 个数据块的 Chunk ID 和所有 n−k 个校验块的标识信息(例如校验块的 Parity Object Key)。
作用:Stripe Index 用于在需要进行数据恢复(如降级读取或节点修复)时,快速定位一个条带中的所有相关数据块和校验块。
Parity Chunk (校验块)

生成:由 k 个 Data Chunk 经过纠删编码(如 Reed-Solomon 编码)生成 n−k 个 Parity Chunk 。
存储:校验块本身也被视为一个对象(图中标为 “Coded Information”),并有其对应的 Parity Object Key 。这个 Key 可以基于其 Stripe ID 和它在条带中的校验块序号生成 。这些校验块会存储在与对应数据块不同的节点上 。

工作流程串联(示例):

写入一个对象 (Object Key, Value):

对象信息(Key, Stripe ID, Chunk index, Offset, Length)被存入 Object Index。
对象的值 (Value) 会成为某个 Data Chunk 的一部分。
这个 Data Chunk 的组成(即它包含了哪些对象以及顺序)会被记录在 Chunk Index 的 OIRList 中。
当足够的数据块形成后,它们会被编码产生 Parity Chunk。
这个 Data Chunk 和 Parity Chunk 所属的条带信息(如各块的 Chunk ID 和 Parity Object Key)会被记录在 Stripe Index 中。
读取一个对象 (Object Key):

系统使用 Object Key 查询 Object Index,获取其 Stripe ID, Chunk index, Offset, 和 Length。
通过 Chunk index 和 Stripe ID (如果需要整个块),可以找到对应的 Data Chunk。
如果 Data Chunk 是碎片化的,系统会通过其 OIRList (从 Chunk Index 获取) 找到所有组成该 Data Chunk 的对象,再通过 Object Index 找到这些对象的物理位置,将它们聚合起来。
最后根据 Offset 和 Length 从重组的 Data Chunk 中提取出所需对象的值。
数据恢复(例如,一个 Data Chunk 损坏):

通过损坏对象的 Object Key,从 Object Index 得到 Stripe ID。
使用 Stripe ID 查询 Stripe Index,获取该条带中其他所有可用 Data Chunk 的 Chunk ID 和所有 Parity Chunk 的 Parity Object Key。
系统会收集到至少 k 个可用的块(数据块或校验块)。
对于每个需要的数据块,系统会利用其 OIRList (从 Chunk Index 获得) 和 Object Index 来聚合其所有碎片。
利用这些块进行解码,恢复出损坏的 Data Chunk。

http://www.xdnf.cn/news/611785.html

相关文章:

  • 深度学习优化器相关问题
  • yolov5 安卓运行
  • Docker部署Zookeeper集群
  • C++学习之打车软件—JNI终端编程业务④https协议session开发
  • Open CASCADE学习|非线性方程组求解技术详解
  • 公司内网本地的SVN没有公网IP地址,在家外网也能远程访问SVN服务!
  • postgresql 的优劣势比较
  • 多模态理解大模型高性能优化丨前沿多模态模型开发与应用实战第七期
  • WPF性能优化之延迟加载(解决页面卡顿问题)
  • Python面向对象编程:封装、继承与多态
  • 七彩喜适老化改造:让每个空间成为长者尊严的守护者
  • Jouier 普及组十连测 R4
  • leetcode-快慢指针系列
  • 利用chat搜索需求相关视频链接
  • 45道工程模块化高频题整理(附答案背诵版)
  • `ol/proj`简介
  • 在日本,书法也是美术
  • WebSphere Application Server(WAS)8.5.5教程第十二讲:EJB
  • Zephyr OS 使能和失能蓝牙协议栈的操作
  • [linux] git强行拉取并覆盖
  • VR全景制作方法都有哪些?需要注意什么?
  • IT | 词汇科普手册Ⅱ
  • Leetcode 3313. 查找树中最后标记的节点
  • FreeGPT+内网穿透外网远程连接使用,搞定ChatGPT访问难题!
  • LPRNet实现车牌识别并完成ONNX和TensorRT推理
  • 怎么判断一个Android APP使用了Electron 这个跨端框架
  • 【动态规划】5 从一次函数出发推导斜率优化dp
  • VS Code-i18n Ally国际化插件 配置百度翻译
  • 【北京盈达科技】GEO优化中的多模态了解
  • 基于 Spring Boot + Vue 的墙绘产品展示交易平台设计与实现【含源码+文档】