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

存储容器是一个自包含的超级块。它包含一个驻留在其中的 Ozone 块列表,以及包含实际数据流的磁盘文件。这是默认的存储容器格式。从 Ozone 的角度来看,容器是一种协议规范,实际的存储布局并不重要。换句话说,扩展容器或引入新的容器布局非常简单。因此,这应被视为 Ozone 下容器的一种参考实现。
理解 Ozone 块与容器
当客户端想要从 Ozone 读取一个键(key)时,客户端会将该键的名称发送给 Ozone Manager(Ozone 管理器)。Ozone Manager 会返回组成该键的 Ozone 块列表。
一个 Ozone 块包含容器 ID 和一个本地 ID。下图展示了 Ozone 块的逻辑布局。
持有。在大多数情况下,容器位置会被 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.policy | CapacityVolumeChoosingPolicy | 用于为新容器选择数据卷的策略。 |
hdds.datanode.volume.min.free.space | 20GB | 数据卷要能接收新容器所需的最小可用空间。 |
hdds.datanode.volume.min.free.space.percent | 0.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.address | 0.0.0.0:9891 | Recon 的 RPC 地址。使用 host:port 格式连接 Recon。 |
评论
登录后参与评论
KnowForge