socc 19 echash论文部分解读

news2025/5/24 21:26:42

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


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.coloradmin.cn/o/2384884.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux Shell编程(八)

目录 Case语句 1--case格式 2--case使用案例:输入不容的数字,给出不同的结果 跳出循环 1--break 案例:执行十次时,跳出当前循环 完整流程 2--continue 案例:跳过2,4 输出 完整流程 Case语句 1--case格式 c…

AI筑基,新质跃升|英码科技亮相华为广东新质生产力创新峰会,发布大模型一体机新品,助力产业智能化转型

5月15日,以“AI筑基,新质跃升”为主题的华为中国行2025广东新质生产力创新峰会在惠州圆满召开。本次峰会聚焦人工智能、算力基础设施等新ICT技术如何驱动“新质生产力”,共探广东高质量发展新路径。英码科技受邀出席本次峰会,并携…

手机打电话时由对方DTMF响应切换多级IVR语音菜单(话术脚本与实战)

手机打电话时由对方DTMF响应切换多级IVR语音菜单 (话术脚本与实战) --本地AI电话机器人 上一篇:手机打电话时由对方DTMF响应切换多级IVR语音应答(二) 下一篇:手机打电话时由对方DTMF响应切换多级IVR语音…

面试题——JDBC|Maven|Spring的IOC思想|DI思想|SpringMVC

目录 一、JDBC 1、jdbc连接数据库的基本步骤(掌握**) 2、Statement和PreparedStatement的区别 (掌握***) 二、Maven 1、maven的作用 2、maven 如何排除依赖 3、maven scope作用域有哪些? 三、Spring的IOC思想 …

DETR3D- 3D Object Detection from Multi-view Images via 3D-to-2D Queries

MIT CORL 2021 纯视觉BEV方案transformer网络3D检测 paper:[2110.06922] DETR3D: 3D Object Detection from Multi-view Images via 3D-to-2D Queries code:GitHub - WangYueFt/detr3d DNN提图像特征,FPN提多尺度特征 pts_bbox_head Detr3…

SpringBoot3整合WebSocket

一、WebSocket简介 WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信,允许服务器主动向客户端推送数据。 与传统的 HTTP 请求-响应模式不同,WebSocket 在建立连接后,允许服务器和客户端之间进行双向…

鸿蒙进阶——驱动框架UHDF 机制核心源码解读(一)

文章大纲 引言一、uhdf 概述二、uhdf 的核心参与角色1、drivers/hdf_core/adapter/uhdf2/manager/device_manager.c1.1、drivers/hdf_core/framework/core/manager/src/devmgr_service.c#DevmgrServiceGetInstance通过objectId获取IDevmgrService实例1.2、drivers/hdf_core/fra…

Idea 配合 devtools 依赖 实现热部署

核心依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency> yaml配置 spring: #…

从逻辑学视角严谨证明数据加密的数学方法与实践

文章目录 一、加密数据的数学指纹&#xff1a;信息论基础1.1 加密检测的核心原理1.2 香农熵&#xff1a;量化信息的不确定性 二、统计检验方法&#xff1a;从随机性到加密性2.1 卡方检验的数学原理2.2 游程检验与序列相关性2.3 NIST统计测试套件 三、加密算法的特征识别3.1 对称…

敦煌网测评从环境搭建到风控应对,精细化运营打造安全测评体系

自养号测评&#xff0c;抢占流量为快速提升产品权重和销量&#xff0c;很多卖家常采用自己养号补单测评的方式&#xff0c;技术搭建需要很多要素 一、硬件参数的关联性 在我们使用设备进行注册或操作账号的过程中&#xff0c;系统会记录下大量的系统与网络参数&#xff0c;其中…

本地分支git push 报错 fatal: The current branch XXXX has no upstream branch.

背景&#xff1a; 我新建了一个本地分支叫做 “新增Saas修改需求”&#xff0c;然后当我提交代码执行 git push时报错如下&#xff0c;并且代码仓库中没有我新建的“新增Saas修改需求”这个分支。 报错信息&#xff1a; 解决方法&#xff1a; 直接采用方法2 ”git push -u orig…

Python----循环神经网络(WordEmbedding词嵌入)

一、编码 当我们用数字来让电脑“认识”字符或单词时&#xff0c;最简单的方法是为每个字符或单词分配一个唯一的编号&#xff0c;然后用一个长长的向量来表示它。比如&#xff0c;假设“我”这个字在字典中的编号是第10个&#xff0c;那么它的表示就是一个很多0组成的向量&…

CUDA的设备,流处理器(Streams),核,线程块(threadblock),线程,网格(‌gridDim),块(block)和多gpu设备同步数据概念

CUDA的设备,流处理器&#xff0c;核&#xff0c;线程块&#xff08;threadblock&#xff09;&#xff0c;线程&#xff0c;网格&#xff08;‌gridDim&#xff09;&#xff0c;块&#xff08;block&#xff09;和多gpu设备同步数据概念 CUDA的设备,流处理器&#xff0c;核&…

LeetCode 1340. 跳跃游戏 V(困难)

题目描述 给你一个整数数组 arr 和一个整数 d 。每一步你可以从下标 i 跳到&#xff1a; i x &#xff0c;其中 i x < arr.length 且 0 < x < d 。i - x &#xff0c;其中 i - x > 0 且 0 < x < d 。 除此以外&#xff0c;你从下标 i 跳到下标 j 需要满…

x-cmd install | cargo-selector:优雅管理 Rust 项目二进制与示例,开发体验升级

目录 功能亮点安装优势特点适用场景总结 还在为 Rust 项目中众多的二进制文件和示例而烦恼吗&#xff1f;cargo-selector 让你告别繁琐的命令行&#xff0c;轻松选择并运行目标程序&#xff01; 功能亮点 交互式选择&#xff1a; 在终端中以交互方式浏览你的二进制文件和示例&…

大模型「瘦身」指南:从LLaMA到MobileBERT的轻量化部署实战

大模型「瘦身」指南&#xff1a;从LLaMA到MobileBERT的轻量化部署实战 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 大模型「瘦身」指南&#xff1a;从LLaMA到MobileBERT的轻量化部署实战摘要引言一、轻量化技术…

从逻辑视角学习信息论:概念框架与实践指南

文章目录 一、信息论的逻辑基础与哲学内涵1.1 信息的逻辑本质&#xff1a;区分与差异1.2 逆范围原理与信息内容 二、信息论与逻辑学的概念交汇2.1 熵作为逻辑不确定性的度量2.2 互信息与逻辑依赖2.3 信道容量的逻辑极限 三、信息论的核心原理与逻辑基础3.1 最大熵原理的逻辑正当…

TDengine 运维—容量规划

概述 若计划使用 TDengine 搭建一个时序数据平台&#xff0c;须提前对计算资源、存储资源和网络资源进行详细规划&#xff0c;以确保满足业务场景的需求。通常 TDengine 会运行多个进程&#xff0c;包括 taosd、taosadapter、taoskeeper、taos-explorer 和 taosx。 在这些进程…

PPP 拨号失败:ATD*99***1# ... failed

从日志来看&#xff0c;主要有两类问题&#xff1a; 一、led_indicator_stop 报 invalid p_handle E (5750) led_indicator: …/led_indicator.c:461 (led_indicator_stop):invalid p_handle原因分析 led_indicator_stop() 的参数 p_handle &#xff08;即之前 led_indicator…

【计网】五六章习题测试

目录 1. (单选题, 3 分)某个网络所分配到的地址块为172.16.0.0/29&#xff0c;能接收目的地址为172.16.0.7的IP分组的最大主机数是&#xff08; &#xff09;。 2. (单选题, 3 分)若将某个“/19”的CIDR地址块划分为7个子块&#xff0c;则可能的最小子块中的可分配IP地址数量…