架构

数据节点

师成师成· 更新于 2026-09-28· 阅读 12 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

数据节点(Datanode)是 Ozone 的工蜂,所有数据都存储在数据节点上。客户端以块(block)为单位写入数据,数据节点将这些块聚合为一个存储容器(storage container)。存储容器包含客户端写入的块所对应的数据流和元数据。

存储容器

容器元数据

存储容器是一个自包含的超级块。它包含一个驻留在其中的 Ozone 块列表,以及包含实际数据流的磁盘文件。这是默认的存储容器格式。从 Ozone 的角度来看,容器是一种协议规范,实际的存储布局并不重要。换句话说,扩展容器或引入新的容器布局非常简单。因此,这应被视为 Ozone 下容器的一种参考实现。

理解 Ozone 块与容器

当客户端想要从 Ozone 读取一个键(key)时,客户端会将该键的名称发送给 Ozone Manager(Ozone 管理器)。Ozone Manager 会返回组成该键的 Ozone 块列表。

一个 Ozone 块包含容器 ID 和一个本地 ID。下图展示了 Ozone 块的逻辑布局。

![Ozone Block](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJ4AAAB+CAYAAADVwaj5AAAABGdBTUEAALGPC/xhBQAAAVlpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KTMInWQAAEHxJREFUeAHtnQ18TfUfxz/2YE8Ms9lmMw+zkeeGiCwklSKRRClpszxk+veAV+UhhMI/JVoW6R+SkNdS+ctfSgkZislT2DxszDC2u9nT//c93L3OvTv3uufs3tyd+/15Xfec3/k9nN/nvPd7OPec7xfgwArcBgWq2VJncnJyq5KSkvhq1ar1LSsrCy0tLfW2JR+ncS0F3NzcCgQj5wQjKe7u7kvi4uIOWFLAKnhJSUmeIuMCUdiIiIgIj8DAQHcfHx+IQi2Vx/EurIDonGAwGJCdnV2Snp5eLABcKuRITEhIKDKXxSJ4BJ3IuMXf379jixYtvEUwz8v7rIBFBQoKCpCWllaQm5u7W3Rc95nD52Yxp+jpCLqYmBiGzopIfEhZAeqoiB1iSKRYYJ5KETya09HwSj2deQbeZwXUKEAMEUvElDyfIni0kKA5HQ+vcql4W4sCxBCxREzJ8yuCJ1YnfWkhIU/I26yAVgWIJdHr9ZXnVwRP3C4JpdUrB1bAHgoQS3QbTl6WJfC8+ZaJXCberowCxJL5vV9F8CpTCedlBWxRgMGzRSVOY3cFGDy7S8oF2qIAg2eLSpzGg4G7OwAAAKVJREFUeJzt3DFqA0EQRuGBREKQUviT5KY5QU6QEuQEOUE6yAkOEpzgIFxT5ASXCE6QUqQEwTGCh+2eQKONrHaxP1R0Y/vIe2Y0Gs2OOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnn

容器 ID 让客户端能够发现容器的位置。关于容器所在位置的权威信息由 Storage Container Manager(SCM)持有。在大多数情况下,容器位置会被 Ozone Manager 缓存,并随 Ozone 块信息一起返回。

一旦客户端定位到容器,就会连接到 Datanode,并按照 Container ID:Local ID 读取指定的数据流。换句话说,local ID 作为容器内的索引,指明要读取哪个数据流。

发现容器位置

SCM 如何知道容器的位置?这与 HDFS 的做法非常相似;数据节点会像块报告一样定期发送容器报告。容器报告比块报告简洁得多。例如,一个数据节点为 196 TB 的 Ozone 部署大约会有 4 万个容器,而 HDFS 的块数则是 150 万个——块报告量减少了 40 倍。

这种额外的间接层极大地提升了 Ozone 的扩展能力。SCM 需要处理的块数据大幅减少,而命名空间服务(Ozone Manager)作为独立的服务,对于 Ozone 的扩展也至关重要。

数据卷管理

什么是卷?

在 Ozone Datanode 的语境下,"卷"指的是由 Datanode 管理的物理磁盘或存储设备。每个卷可以存储多个容器,容器是 Ozone 的基本存储单元。这与 Ozone Manager 中的"卷"概念不同,后者指的是用于组织桶和键的命名空间。

卷的状态,包括已用空间、可用空间以及是否正常运行(健康)或已故障,可以在 Datanode Web UI 中查看。

使用 hdds.datanode.dir 定义卷

属性 hdds.datanode.dir 定义了 Datanode 所管理的卷(磁盘)集合。你可以指定一个或多个目录,用逗号分隔。每个目录代表一个卷。例如:/data1/disk1,/data2/disk2,这样就配置了 Datanode 管理两个卷。

卷选择策略

当 Datanode 需要选择一个卷来存储新数据时,会使用卷选择策略。该策略由属性 hdds.datanode.volume.choosing.policy 控制。主要有两种策略:

  • CapacityVolumeChoosingPolicy(默认):该策略会随机选择两个具有足够可用空间的卷,并选择利用率较低(即空闲空间更多)的那一个。这种方式提高了选中使用率较低磁盘的可能性,有助于随时间推移平衡磁盘使用情况。
  • RoundRobinVolumeChoosingPolicy:该策略以轮询方式选择卷,遍历所有可用的卷。它不会考虑每块磁盘当前的利用率,但能确保新容器在所有磁盘之间均匀分布。
属性名称默认值说明
hdds.datanode.volume.choosing.policyCapacityVolumeChoosingPolicy用于为新容器选择数据卷的策略。
hdds.datanode.volume.min.free.space20GB数据卷要能接收新容器所需的最小可用空间。
hdds.datanode.volume.min.free.space.percent0.02数据卷要能接收新容器所需的最小可用空间百分比。

磁盘均衡器

随着时间推移,添加或更换磁盘等操作可能导致磁盘使用不均。Ozone 提供了 磁盘均衡器(Disk Balancer)功能,可自动平衡 Datanode 各数据卷之间的磁盘使用情况。磁盘均衡器可以通过配置属性 hdds.datanode.disk.balancer.enabled 启用,并通过 CLI 命令进行管理。

重要配置项

键默认值说明
dfs.container.ratis.datanode.storage.dir无该目录用于存储 Ratis 元数据(如日志)。
ozone.scm.datanode.id.dir无Datanode 用来存储其 Datanode ID 的路径。
hdds.datanode.dir无决定 HDDS 数据在本地文件系统上的存储位置。
hdds.datanode.dir.du.reserved无每个数据卷的预留空间(字节)。请始终为非 dfs 用途保留这部分可用空间。
ozone.metadata.dirs无用于存储持久化数据(RocksDB)的目录。
ozone.recon.address0.0.0.0:9891Recon 的 RPC 地址。使用 host:port 格式连接 Recon。

评论

登录后参与评论

正在加载评论…