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

socc 19 echash 部分代码讲解 三 chunk,stripe,hashnode

一、概念与结构关系

1. chunk

  • 一个 chunk 是 实际数据写入的最小单元,通常大小是固定的(例如 4KB)。
  • 每个 chunk 是存储在某个具体 memcached 节点上的一块内存区域。
  • 每个 chunk 中存储多个 <key, value> 对,也就是多个对象。
  • 状态通过 enum chunk_stat 管理,如 Waitting, Sealed, Sealed_repair 等。

2. stripe

  • 一个 stripe 是纠删码单位,表示一组 chunk 的集合。
  • 通常表示为一个 (N, K) 编码的结构,例如 RS(5, 3) 表示:每个 stripe 包含 3 个数据 chunk 和 2 个校验 chunk。
  • stripe 中的每个 chunk 分布在不同的 hash ring 上。
  • stripe_list 记录所有 stripe 的分布信息,每个条目是 struct chunk_info_st stripe_list[][RING_SIZE]

3. hash_node

  • hash_node 是一个记录对象索引的哈希结构,用来建立 key 到其存储位置的映射。
  • key 是字符串形式的对象标识;
  • value 是 64 位压缩信息:包括所在 chunk ID、在 chunk 中的位置、value 长度、key 长度;
  • 用于快速查找 key 存在的位置,并辅助后续的读取或删除操作。

二、数据写入/读取流程(带纠删码)

📥 写入流程(key-value)

步骤一:选择 ring 和 chunk
  • 使用一致性哈希对 key 进行哈希,选出目标 ring;
  • 在该 ring 的 chunk_waitting_list 中查找空闲 chunk(或新建);
  • 将 key/value 写入 chunk 内部缓冲区,并更新 chunk 的 chunk_used_sizeKV_num 等。
步骤二:更新索引结构
  • 使用 create_value() 生成压缩的 value 元信息(包含 chunk_id、偏移、长度等);
  • 使用 hash_node 将 key-value 映射关系插入 hash_table 中。
步骤三:达到 seal 条件后编码
  • 当某个 chunk 满足 chunk_used_size > CHUNK_SEALED_FACTOR * CHUNK_SIZE,则该 chunk 进入 Sealed 状态;
  • 收集该 stripe 的 K 个数据 chunk;
  • 使用 Reed-Solomon 算法生成 N-K 个校验 chunk,形成完整的 stripe;
  • 每个 chunk 分布到不同的 ring 中,更新 stripe_list

📤 读取流程

步骤一:查找索引
  • 用 key 计算哈希,查找 hash_table
  • 若找到 hash_node,读取 value,解析出 chunk ID、偏移、长度等信息。
步骤二:定位并访问 memcached 节点
  • 根据 chunk_id 找到其所在 ring 和 memcached 节点;
  • 使用 memcached API 拉取该 chunk 的指定位置内容;
  • 返回完整的 value 数据。

🛠 恢复与修复流程(故障容错)

  • 某个 chunk 或节点失效时,只要 K 个 chunk 中任意 K 个可用,就可通过纠删码恢复缺失数据;
  • 利用 stripe_list 定位 stripe 内其他 chunk;
  • 对其他 chunk 拉取数据后使用解码逻辑恢复出丢失部分;
  • 重新写入新的节点,更新 hash_table

三、三者的关系总结

元素内容关系
chunk存储 key-value 的基本单元多个 chunk 组成一个 stripe
stripe纠删码单位(N 个 chunk)包括 K 个数据块和 N-K 个校验块,分布在不同 ring 上
hash_nodekey -> chunk+offset 的索引key 写入 chunk 后,用 hash_node 保存位置信息

一个 key 写入过程就是:
➤ 写入 chunk(buffer) → 达到阈值形成 stripe → 纠删码编码 → 分布存储 → 更新 hash_node


如你愿意,我可以为这个系统画一张结构图,或继续往下扩展 chunk 和 stripe 的编码实现、节点迁移或读写缓存优化。你希望哪部分展开?

相关文章:

  • 学习黑客 http 响应头
  • Spring Boot 与 RabbitMQ 的深度集成实践(二)
  • FloodFill算法:洪水般的图像处理艺术
  • 网络安全利器:蜜罐技术详解
  • 【Java ee初阶】jvm(1)
  • 【IPMV】图像处理与机器视觉:Lec10 Edges and Lines
  • Linux STM32 电脑 之间的关系 为何选择Linux
  • NetApp FAS存储系统的加密Encrytpion解决方案介绍
  • 实时时钟项目设计
  • 实习记录小程序|基于SSM+Vue的实习记录小程序设计与实现(源码+数据库+文档)
  • 【微信小程序 + 高德地图API 】键入关键字搜索地址,获取经纬度等
  • 【从基础到模型网络】深度学习-语义分割-基础
  • 【深度学习新浪潮】大模型在哪些垂域已经有比较好的落地?
  • OpenCV-去噪效果和评估指标方法
  • C++多线程数据错乱
  • 常见的请求头(Request Header)参数
  • SpringMVC-拦截器
  • 虚幻引擎5-Unreal Engine笔记之`GameMode`、`关卡(Level)` 和 `关卡蓝图(Level Blueprint)`的关系
  • 从0到1吃透卷积神经网络(CNN):原理与实战全解析
  • Linux安全第三章-系统安全及应用
  • 体坛联播|雷霆抢七淘汰掘金,国米错失意甲登顶良机
  • 外交部驻港公署正告美政客:威胁恫吓撼动不了中方维护国家安全的决心
  • 降水较常年同期少五成,安徽四大水利工程调水超11亿方应对旱情
  • 独家 |《苏州河》上海上演,编剧海飞:上海的风能吹透我
  • 一图读懂丨创新创业人才最高补贴500万元!临港新片区发布创客新政“十二条”
  • 龚正市长调研闵行区,更加奋发有为地稳增长促转型,久久为功增强发展后劲