简要概览

  • 在 1994 年的论文中,邦威克描述了 slab 分配器,它把内核对象视为可复用的类型化结构,而非匿名的内存块;这一模型影响了其他操作系统。
  • 2001 年,他与乔纳森·亚当斯一起用 CPU 本地的 magazines(仓库)和 vmem 分配器发展了这一思想,将其推广到多处理器系统以及普通内存以外的资源。
  • 邦威克与马特·阿伦斯共同启动了 ZFS,并领导了更广泛的 Sun 团队,该团队整合了存储池、写时复制、端到端校验和、快照与恢复;称他为唯一的发明者是不准确的。
  • DSSD 被收购后独立产品随之终止,而他如今担任 iodyne 联合总裁,这表明强大的架构、交易成本与可持续的产品市场是不同的东西。

存储系统可能返回错误的块而不报错

存储的基本承诺很简单:读取时,应用应当得到它写入的内容。在传统技术栈中,责任分散在文件系统、卷管理器、控制器和驱动器之间。每一层都可能在整条链路返回过时、重定向或损坏的数据时报告成功。

ZFS 把子块的校验和存储在父块中。预期的标识沿指针树向下传递,并与被校验的内容分离。读取时,ZFS 将收到的块与预期进行比较。如果存在完好的镜像或奇偶校验副本,系统可以读取它、验证、返回正确数据并修复受损副本。Scrub 把同样的逻辑应用于已分配的数据,在损坏被应用发现之前就把它找出来。

这一机制解释了 ZFS 的声誉及其极限。校验和能发现不一致,但如果所有副本都错了,它无法重新创造数据。冗余不能替代独立的备份、经过验证的恢复和合理的物理拓扑。管理员失误、拥有合法权限的勒索软件、火灾或相关性故障都可能超出这一模型的能力范围。

邦威克的贡献在于,让静默故障变得可观察,并让验证与修复进入常规工作路径。数据丢失的风险并未消失。好的架构之所以有价值,是因为它更精确地显示保证的边界。

在 ZFS 之前,邦威克让内核对象更便宜也更清晰

内核不断为文件、连接、进程和虚拟内存分配结构。它们有类型、大小、不变量和初始化成本。每次都申请原始内存、构造对象再销毁它,等于把一小笔工作乘以整个系统。

1994 年论文中的 slab 分配器把内存组织成 slab,并按对象类别维护缓存。构造器准备状态,析构器释放资源,空闲对象保留下来供复用。内核保留对类型的认知,从而改善局部性、碎片、调试和统计。

最初的实现是 SunOS 和 Solaris 的一部分。Linux、FreeBSD 和其他系统都写出了自己的代码与折衷。不能把每一个现代分配器都归于邦威克。缓存会消耗内存、可能保留多余的状态,并需要在压力下进行平衡。真正的成就在于显式建模创建成本、锁、局部性和生命周期。

本地仓库把分配器变成了多处理器架构

当大量 CPU 争夺同一把锁时,全局缓存会成为瓶颈。在 2001 年的论文《Magazines and Vmem》中,邦威克和乔纳森·亚当斯为每个处理器提出了小型的本地对象集。高频操作在本地执行,与共享 depot 的交换按批进行。

Vmem 把分层方法推广到地址范围、标识符和其他资源。Arenas 从底层分配器导入容量。协调的单位发生了变化:系统管理的是组以及所有权关系,而不是集中管理每一个对象。

局部性有代价。对象可能在一个 CPU 上累积,而另一个 CPU 却缺货;仍然需要平衡与协调。历史性能结果只适用于特定硬件。持久的想法是:不要丢弃通用接口会丢失的信息。

ZFS 始于团队重建存储技术栈的决定

邦威克和马特·阿伦斯于 2001 年在 Sun 开始 ZFS 的工作。后来比尔·穆尔和许多工程师加入。邦威克领导了该项目并向公众解释它,但一个成熟的文件系统包含磁盘格式、缓存、工具、驱动、测试以及多年的集体调试。

旧模型要求先创建 RAID 或卷,再对其分区,并在其上构建对增长有僵化预判的文件系统。ZFS 围绕存储池把文件系统与卷管理合为一体。Vdev 提供容量,dataset 动态使用它;配额、reservation、快照和属性都处在同一模型中。

日常简单性提高了初始拓扑的重要性。Vdev 布局决定了冗余、性能、扩展能力和容错。存储池不能在之后随意重构。Sun 在 2004 年宣布 ZFS,2005 年在 OpenSolaris 中开源,2006 年随 Solaris 10 交付。

它的历史意义不在于某一个功能,而在于 pool、写时复制、校验和、快照、RAID-Z、缓存与管理的协同。

写时复制让整棵树成为一次提交的单位

原地更新可能让元数据停留在新旧状态之间。ZFS 写入新块,更新父块,并原子地切换到 transaction group 的新 root。提交之前,旧版本仍保持一致。

快照保留对旧块的引用;克隆共享数据并随着新的写入逐渐分叉。代价是额外的写入、碎片和空间占用。保证仍然取决于设备与控制器是否遵守写入顺序和持久性。

系统花费结构来换取更多知识:哪个版本是完整的、哪个块是预期的、哪个根可以提交。这些知识不能替代物理机器。

校验和与自修复改变了“成功读取”的含义

ZFS 甚至验证驱动器认为成功的操作。若不一致,系统尝试另一份副本,找到正确的之后可以修复受损副本。Scrub 把这种反应变成计划性维护,在冗余仍然存在时发现潜在错误。

检测、修复和完整恢复是不同的能力。勒索软件可以写入正确校验的加密数据。多份副本可能同时失效。同一故障域内的备份并不独立。运营者必须知道存在哪些副本,以及当预设冗余耗尽后还有什么可用。

RAID-Z、ARC 与 scrub 把完整性连接到日常运营

RAID-Z 利用写时复制和奇偶校验条带来避免经典的 write hole。小写入的成本、rebuild 以及相关性故障仍然存在。更大的磁盘会延长恢复期间的脆弱窗口。

ARC 在最近使用与频繁使用的数据之间平衡;二级缓存扩展了层次结构。没有任何缓存能让慢速介质对所有负载都变快。内存、元数据和负载行为都需要测量。

Scrub、resilver、快照删除和复制都会消耗 I/O、CPU 和网络。维护用的余量是容量的一部分。长期运行在极限的存储池可能最缺乏恢复能力。

邦威克还给了运营者一种清晰的语言:pool、vdev、transaction group、scrub。这促进了传播,但简短的公式不应丢失适用条件。

OpenSolaris 结束了,但项目在创建它的公司之后存活下来

Oracle 于 2010 年收购了 Sun,专有与开源两条路线随之分道扬镳。OpenZFS 出现于 2013 年,用于协调 illumos、FreeBSD、Linux 及其他社区。现代项目源自 Sun 的代码,但已被大幅修改,且不受邦威克控制。

它的延续证明架构可以比创立它的机构活得更久。但延续并非无缝:CDDL 与 Linux 内核的 GPL 并不容易组合,各平台接受功能的速度不同,feature flags 会影响存储池的可移植性。

仅有公开仓库是不够的。需要维护者、测试、资金和版本发布。治理本身成为一种制度性故障域。OpenZFS 属于邦威克的遗产,但在运营上属于今天的负责者。

DSSD 表明雄心勃勃的架构也可能输掉产品之争

邦威克与迈克·夏皮罗、比尔·穆尔共同创立了 DSSD,做机架级闪存系统。EMC 于 2014 年收购了这家公司,2017 年 D5 不再作为独立产品存在。

这一插曲打破了“注定成功”的叙事。性能、原创性和资本都不能保证可持续的地位。迁移、成本、认证、支持、销售渠道、买方的优先级以及 NVMe 或云的经济性都可能比 benchmark 更重要。

现有来源无法给出唯一原因,也无法估计创始人的个人财富。它们能证实的只有收购和产品终止。DSSD 把技术价值、交易价值和商业生存区分开来。

Iodyne 把熟悉的问题带入专业媒体领域,而不是创造新的 ZFS

邦威克和夏皮罗于 2018 年创立了 iodyne,两人都是联合总裁。该公司为视频和音频制作提供快速、加密且冗余的 NVMe 存储。

这种延续是概念上的:在真实工作流中的性能、保护和修复。Iodyne 不是“装在盒子里的 ZFS”,也不是 DSSD 的直接延续。规模、接口、市场和机制都不同。

产品页面能证实宣称的功能,但无法证实经过审计的可靠性、市场份额或收入。在媒体制作中,故障会中断剪辑和交付;加密保护素材;当多位用户需要同时工作时,速度才有价值。集成简化了支持,同时也把依赖集中到一家私有供应商身上。

管理本身成了可靠性模型的一部分

ZFS 存储池缩小了那些自身就会制造失误的管理边界。Dataset、配额、reservation、快照和复制处在同一套策略中,而不是一串互不相关的工具。

责任并未消失。一个 dataset 可能填满 pool,快照会占用块,而复制只有在接收端健康、且恢复经过验证时才有帮助。两个逻辑副本可能共享同一个控制器、同一套供电或有缺陷的固件。逻辑模型必须与物理模型对照。

一条整洁的zfs list输出本身并不能证明组织能够恢复应用、保持数据库一致性或找到解密所需的密钥。逻辑视图简化了管理,但不能替代经过演练的恢复以及对物理与应用依赖的了解。

分配器和文件系统把维护变成了一等负载

缓存需要补充和平衡;pool 需要检查、重构和复制。这些工作与用户负载竞争,却决定着系统的寿命。空闲资源可以是储备,让修复在下一次故障之前得以完成。

软件也是一样。OpenZFS 需要测试、兼容性和版本发布;iodyne 必须在售出之后维护固件、主机软件和硬件。发明创造出一个系统,维护才把它变成基础设施。

技术领导力意味着为其他工程师的工作划定边界

邦威克的领导是重要的,也是集体的。阿伦斯、穆尔、亚当斯、Sun 团队以及后来的维护者都应保持可见。抽象——缓存、arena、pool、dataset、transaction group——让人们在共同模型下分工。

历史权威不能替代当前责任。今天的代码由 OpenZFS 的维护者决定。在 iodyne,领导权与夏皮罗共享。点名参与者,就是在展示决策、支持和承诺所在的位置。

许可与治理成了另一种故障隔离形式

公司可以改变战略。开源代码让其他团队能在 Sun 之后延续 ZFS。这种冗余之所以有效,是因为存在权利、知识和真正发布版本的能力。

没有维护者的两个分支,并不比挂在同一控制器下的两块磁盘更可靠。公司和志愿者提供资源,同时也制造依赖。OpenZFS 在制度和技术上都存活了下来。

反复出现的方法:保留薄层会丢弃的信息

通用分配器只看到大小;slab 看到类型和生命周期。普通栈看到成功的读取;ZFS 看到带有预期标识的块。产品承诺吞吐量;运营要考虑修复、加密和连续性。

额外信息消耗资源,也可能扩大整体故障域。好的设计不只是隐藏组件,而是显示组织能够理解并恢复的边界。

ZFS 改变了存储比较的基准单位

通过把卷、文件系统、校验和、快照与修复整合起来,ZFS 迫使人们比较完整路径。在与 XFS、Btrfs、APFS、ReFS、Ceph 或商用阵列的争论中,重要的是完整性模型、拓扑、支持和退出路径,而不是功能清单。

没有普遍的赢家。商业产品提供经过验证的硬件和合同;开源提供透明度和可移植性;分布式系统以网络依赖换取规模;专用设备提供优化的工作流和可能的锁定。

故障域思维把内存、存储和公司生存联系起来

故障域可以是一块磁盘、一个机架、一把全局锁、一家公司或一个供应商。Magazines 减少对单一锁的集中;校验和减少对设备的盲目信任;OpenZFS 减少对单一公司的依赖。

冗余必须与威胁处在同一层面。同一控制器下的磁盘、同一丢失密钥之下的副本,或没有维护者的分支,只是在模仿稳健性。简化可能掩盖共同命运;相关性需要被绘制出来,独立恢复需要被测试。

诚实的遗产是更好的问题,而非绝对保证

slab 分配器影响了对象管理;magazines 和 vmem 把分配扩展到规模;ZFS 把运营与完整性结合在一起;OpenZFS 挺过了制度转型;DSSD 显示了商业上的极限;iodyne 在另一个市场延续这一主题。

把邦威克称为共同作者、领导者和架构师是恰当的,但不应称他为唯一作者或如今 OpenZFS 的管理者。ZFS 能发现大量损坏,但需要一份有效的副本;写时复制依赖于硬件;RAID-Z 不能替代备份;scrub 不能保证未来的读取。

可观察的检验是:系统是否仍在回答他的工作使其无法回避的问题——分配器对对象知道什么?校验块的预期存放在哪里?哪个状态是完整的?副本真的独立吗?当冗余耗尽后由谁来恢复?缺少完整清单、精确的贡献分布以及 iodyne 的审计数据,这一点本身应当是可见的。这种精确性正是同一纪律的一部分。