Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第 20 章 Red Stuff、纠删码与可用性

Walrus 的数据不是简单复制 N 份。它使用纠删码把原始 Blob 编码为多个片段,只要取回足够多的片段就能重构数据。Red Stuff 是 Walrus 论文和实现中围绕可用性证明、编码片段和存储节点确认的一组协议设计。

本章不推导公式,只讲开发者要用到的结论。

纠删码解决什么问题

复制的思路是“多存几份完整文件”。纠删码的思路是“把文件变成更多片段,丢一部分也能恢复”。它的优势:

  • 在同等可靠性下节省存储成本。
  • 单个节点离线不一定影响读取。
  • 可以让可用性证明围绕片段而不是整文件展开。

代价是:

  • 写入前需要编码,读取时可能需要重构。
  • 小文件会有固定开销,适合用 Quilt 或批处理降低成本。
  • 读取延迟取决于足够多片段的响应速度,而不是最快一台节点。

开发者看到的现象

纠删码会带来几个工程现象:

  • 同一个 Blob 的读取延迟可能波动,因为 aggregator 要联系多个节点。
  • 某些存储节点失败时,读取仍可能成功。
  • 如果不足够多片段可用,读取会失败,而不是返回“部分文件”。
  • 大文件比小文件更能摊薄元数据和编码开销。

所以不要用一次读取失败判断 Blob 已经丢失。先换 aggregator、重试、查链上状态,再判断是否过期或不可用。

小文件策略

大量小 JSON、图片缩略图、配置片段直接逐个上传,会把固定开销放大。推荐:

  • 使用 Quilt 把多个小文件打包。
  • 在业务索引里保存 Quilt 内部路径或 key。
  • 对热点小文件做应用级缓存。
  • 把频繁变化的小状态留在数据库或 Sui 对象里,不要每次都写 Walrus。

Walrus 适合保存 Blob,不适合替代键值数据库。

可用性和持久性

可用性是“现在能不能读到足够片段”,持久性是“未来一段时间内数据不会丢”。它们有关但不是同一个指标。

应用要分别监控:

  • 当前读取成功率。
  • 写入成功率。
  • Blob 到期时间。
  • 多 aggregator 读取一致性。
  • 存储节点或服务版本是否落后。

如果只监控 HTTP 200,会漏掉续期失败、慢读、数据校验失败和网络分区。

和业务哈希配合

Walrus 的 blob_id 是协议层标识。业务系统仍建议保存自己的内容摘要:

sha256(original_bytes) -> business_hash

用途:

  • 防止上传前后拿错文件。
  • 支持业务去重。
  • 支持审计和用户可见校验。
  • 支持加密场景下区分明文哈希和密文哈希。

敏感数据要注意:明文哈希可能泄露已知文件的存在性。隐私场景更适合保存密文哈希或带盐摘要。

调优方向

如果你的读取慢,排查顺序通常是:

  1. aggregator 是否过载或离用户太远。
  2. Blob 是否为冷数据,缓存命中率低。
  3. 存储节点响应是否长尾严重。
  4. 客户端是否串行读取大量小 Blob。
  5. 应用是否没有使用 Range、批量索引或 CDN。

不要先怀疑纠删码本身。多数延迟问题来自接入层、网络和请求形态。