归档存储、SSD 和内存

简介

归档存储是一种将不断增长的存储容量与计算容量分离的解决方案。具有更高密度、更低成本存储和较低计算能力的节点变得可用,并且可以在集群中用作冷存储。根据策略,可以将数据从热移动到冷。向冷存储添加更多节点可以增加存储,而与集群中的计算容量无关。

异构存储和归档存储提供的框架将 HDFS 架构概括为包括其他类型的存储介质,包括SSD内存。用户可以选择将数据存储在 SSD 或内存中以获得更好的性能。

存储类型和存储策略

存储类型:ARCHIVE、DISK、SSD 和 RAM_DISK

“异构存储 (HDFS-2832)”的第一阶段将数据节点存储模型从单个存储(可能对应于多个物理存储介质)更改为存储集合,其中每个存储对应于一个物理存储介质。它还增加了存储类型的概念,DISK 和 SSD,其中 DISK 是默认存储类型。

添加了一种新的存储类型ARCHIVE,它具有较高的存储密度(PB 存储)但计算能力较低,用于支持归档存储。

添加了另一种新的存储类型RAM_DISK,用于支持在内存中写入单副本文件。

存储策略:Hot、Warm、Cold、All_SSD、One_SSD、Lazy_Persist 和 Provided

引入了一个新的存储策略概念,以便根据存储策略将文件存储在不同的存储类型中。

我们有以下存储策略

  • Hot - 适用于存储和计算。正在流行且仍在用于处理的数据将保留在此策略中。当一个块变为热时,所有副本都存储在 DISK 中。
  • Cold - 仅适用于计算受限的存储。不再使用的数据或需要归档的数据将从热存储移动到冷存储。当一个块变为冷时,所有副本都存储在 ARCHIVE 中。
  • Warm - 部分热部分冷。当一个块变为 warm 时,其一些副本存储在 DISK 中,其余副本存储在 ARCHIVE 中。
  • All_SSD - 用于将所有副本存储在 SSD 中。
  • One_SSD - 用于将其中一个副本存储在 SSD 中。其余副本存储在 DISK 中。
  • Lazy_Persist - 用于在内存中写入具有单副本的块。该副本首先写入 RAM_DISK,然后延迟持久化到 DISK 中。
  • Provided - 用于存储 HDFS 之外的的数据。另请参见HDFS 提供的存储

更正式地说,存储策略包含以下字段

  1. 策略 ID
  2. 策略名称
  3. 用于块放置的存储类型列表
  4. 用于文件创建的备用存储类型列表
  5. 用于复制的备用存储类型列表

当有足够的空间时,块副本将根据 #3 中指定的存储类型列表进行存储。当列表 #3 中的某些存储类型空间不足时,#4 和 #5 中指定的备用存储类型列表将用于分别替换文件创建和复制的空间不足的存储类型。

以下是典型的存储策略表。

策略 ID 策略 名称 块放置 (n 个副本) 回退存储 用于创建 回退存储 用于复制
15 Lazy_Persist RAM_DISK: 1,DISK: n-1 DISK DISK
12 All_SSD SSD: n DISK DISK
10 One_SSD SSD: 1,DISK: n-1 SSD,DISK SSD,DISK
7 Hot(默认) DISK: n <none> ARCHIVE
5 Warm DISK: 1,ARCHIVE: n-1 ARCHIVE,DISK ARCHIVE,DISK
2 Cold ARCHIVE: n <none> <none>
1 Provided PROVIDED: 1,DISK: n-1 PROVIDED,DISK PROVIDED,DISK

注 1:Lazy_Persist 策略仅对单个副本块有用。对于具有多个副本的块,所有副本都将写入 DISK,因为仅将其中一个副本写入 RAM_DISK 不会提高整体性能。

注 2:对于具有条带布局的纠删码文件,合适的存储策略是 All_SSD、Hot、Cold。因此,如果用户为条带化 EC 文件设置除上述策略之外的其他策略,则在创建或移动块时不会遵循该策略。

存储策略解析

当创建文件或目录时,其存储策略为未指定。可以使用“storagepolicies -setStoragePolicy”命令指定存储策略。文件的有效存储策略或目录由以下规则解析。

  1. 如果为文件或目录指定了存储策略,则返回该策略。

  2. 对于未指定的 file 或目录,如果它是根目录,则返回默认存储策略。否则,返回其父级的有效存储策略。

可以通过“storagepolicies -getStoragePolicy”命令检索有效存储策略。

配置

  • dfs.storage.policy.enabled - 用于启用/禁用存储策略功能。默认值为 true
  • dfs.datanode.data.dir - 在每个数据节点上,逗号分隔的存储位置应标记为其存储类型。这允许存储策略根据策略将块放置在不同的存储类型上。例如
    1. DISK 上的数据节点存储位置 /grid/dn/disk0 应配置为 [DISK]file:///grid/dn/disk0
    2. SSD 上的数据节点存储位置 /grid/dn/ssd0 可以配置为 [SSD]file:///grid/dn/ssd0
    3. ARCHIVE 上的数据节点存储位置 /grid/dn/archive0 应配置为 [ARCHIVE]file:///grid/dn/archive0
    4. RAM_DISK 上的数据节点存储位置 /grid/dn/ram0 应配置为 [RAM_DISK]file:///grid/dn/ram0

    如果数据节点存储位置没有明确标记存储类型,则其默认存储类型为 DISK。

基于存储策略的数据移动

为现有文件/目录设置新的存储策略会更改命名空间中的策略,但不会在存储介质之间物理移动块。以下 2 个选项允许用户根据新的策略集移动块。因此,一旦用户更改/设置为文件/目录上的新策略,用户还应执行以下选项之一来实现所需的数据移动。请注意,不能同时允许两个选项运行。

Storage Policy Satisfier (SPS)

当用户更改文件/目录上的存储策略时,用户可以调用 HdfsAdmin API satisfyStoragePolicy() 以根据新的策略集移动块。在名称节点外部运行的 SPS 工具会定期扫描新策略集与放置的物理块之间的存储不匹配。这只会跟踪用户调用 satisfyStoragePolicy 的文件/目录。如果 SPS 识别出某个文件需要移动一些块,那么它会将块移动任务计划到数据节点。如果移动过程中出现任何故障,SPS 将通过发送新的块移动任务重新尝试。

SPS 可以作为名称节点外部的外部服务启用,也可以在不重新启动名称节点的情况下动态禁用。

可以在 存储策略满足器 (SPS) (HDFS-10285) 中找到详细的设计文档

  • 注意:当用户在目录上调用 satisfyStoragePolicy() API 时,SPS 将扫描所有子目录并考虑所有文件以满足策略。

  • HdfsAdmin API:public void satisfyStoragePolicy(final Path path) throws IOException

  • 参数

path 需要块存储移动的路径。

配置

  • dfs.storage.policy.satisfier.mode - 用于启用 NN 外部的外部服务或禁用 SPS。支持以下字符串值 - externalnone。配置 external 值表示 SPS 已启用,none 表示禁用。默认值为 none

  • dfs.storage.policy.satisfier.recheck.timeout.millis - 超时时间,用于从数据节点重新检查已处理的块存储移动命令的结果。

  • dfs.storage.policy.satisfier.self.retry.timeout.millis - 超时时间,用于在该配置的超时时间内未从数据节点报告任何块移动结果时重试。

Mover - 一种新的数据迁移工具

添加了一个用于归档数据的新数据迁移工具。该工具类似于 Balancer。它会定期扫描 HDFS 中的文件以检查块放置是否满足存储策略。对于违反存储策略的块,它会将副本移动到不同的存储类型中以满足存储策略要求。请注意,它始终会尽可能在同一节点内移动块副本。如果无法这样做(例如,当节点没有目标存储类型时),它会通过网络将块副本复制到另一个节点。

  • 命令

    hdfs mover [-p <files/dirs> | -f <local file name>]
    
  • 参数

-p <files/dirs> 指定要迁移的 HDFS 文件/目录的空间分隔列表。
-f <local file> 指定一个包含要迁移的 HDFS 文件/目录列表的本地文件。

请注意,当同时省略 -p 和 -f 选项时,默认路径是根目录。

管理员注释

StoragePolicySatisfierMover 工具 不能同时运行。如果 Mover 实例已触发并正在运行,SPS 将在启动时被禁用。在这种情况下,管理员应确保 Mover 执行已完成,然后再次启用外部 SPS 服务。同样,当 SPS 已启用时,无法运行 Mover。如果管理员希望显式运行 Mover 工具,则他/她应确保首先禁用 SPS,然后运行 Mover。请参阅命令部分以了解如何在 NN 外部启用外部服务或动态禁用 SPS。

存储策略命令

列出存储策略

列出所有存储策略。

  • 命令

    hdfs storagepolicies -listPolicies
    
  • 参数:无。

设置存储策略

将存储策略设置到文件或目录。

  • 命令

    hdfs storagepolicies -setStoragePolicy -path <path> -policy <policy>
    
  • 参数

-path <path> 指向目录或文件的路径。
-policy <policy> 存储策略的名称。

取消设置存储策略

取消对文件或目录的存储策略设置。取消命令后,将应用最近祖先的存储策略,如果任何祖先都没有策略,则将应用默认存储策略。

  • 命令

    hdfs storagepolicies -unsetStoragePolicy -path <path>
    
  • 参数

-path <path> 指向目录或文件的路径。

获取存储策略

获取文件或目录的存储策略。

  • 命令

    hdfs storagepolicies -getStoragePolicy -path <path>
    
  • 参数

-path <path> 指向目录或文件的路径。

满足存储策略

根据文件/目录的当前存储策略安排块移动。

  • 命令

    hdfs storagepolicies -satisfyStoragePolicy -path <path>
    
  • 参数

-path <path> 指向目录或文件的路径。

在 NN 外部启用外部服务或在不重新启动 Namenode 的情况下禁用 SPS

如果管理员希望在 Namenode 运行时切换 SPS 功能模式,他/她首先需要在配置文件 (hdfs-site.xml) 中更新配置项 dfs.storage.policy.satisfier.mode 的所需值(外部或无),然后运行以下 Namenode 重新配置命令

启动外部 SPS 服务。

如果管理员希望启动外部 sps,他/她首先需要在配置文件 (hdfs-site.xml) 中使用 external 值配置属性 dfs.storage.policy.satisfier.mode,然后运行 Namenode 重新配置命令。请确保配置文件中的网络拓扑配置与 namenode 相同,此集群将用于匹配目标节点。在此之后,使用以下命令启动外部 sps 服务

  • 命令

    hdfs –daemon start sps