高可用 SCM

    请注意,SCM-HA 尚未准备好在安全环境中部署。 安全工作正在进行中,将很快完成。

    为了避免任何单点故障,元数据管理器节点还应该具有 HA 设置。

    Ozone Manager 和 Storage Container Manager 都支持 HA。在这种模式下,内部状态通过 RAFT (使用 Apache Ratis )复制。

    本文档解释了 Storage Container Manager (SCM)的 HA 设置,请在本页中查看 Ozone Manager (OM)的 HA 设置。虽然它们可以独立地为 HA 进行设置,但可靠的、完全的 HA 设置需要为两个服务启用 HA。

    Storage Container Manager 的 HA 模式可以在 中进行以下设置:

    一个 Ozone 配置(ozone-site.xml)可以支持多个SCM HA节点集,多个 Ozone 集群。要在可用的 SCM 节点之间进行选择,每个集群都需要一个逻辑名称,可以将其解析为 Storage Container Manage 的 IP 地址(和域名)。

    这个逻辑名称称为 serviceId,可以在 ozone-site.xml 中配置。

    大多数情况下,你只需要设置当前集群的值:

    1. <property>
    2. <name>ozone.scm.service.ids</name>
    3. <value>cluster1</value>
    4. </property>
    1. <name>ozone.scm.nodes.cluster1</name>
    2. <value>scm1,scm2,scm3</value>
    3. </property>

    定义的前缀可以用来定义每个 SCM 服务的地址:

    为了获得可靠的 HA 支持,请选择3个独立的节点以形成仲裁。

    引导

    初始化的第一个 SCM-HA 节点和 none-HA SCM是一样的:

    第二个和第三个节点应该被 bootstrapped,而不是 init。这些集群将加入到配置的 RAFT 仲裁。当前服务器的 id 通过 DNS 名称标识,也可以通过 ozone.scm.node.id 明确设置。大多数时候你不需要设置它,因为基于 DNS 的 id 检测可以很好地工作。

    1. bin/ozone scm --bootstrap

    在某些环境(例如容器化/ K8s 环境)中,我们需要一种通用的统一方法来初始化 SCM HA 仲裁。 剩下的标准初始化流程如下:

    1. 在第一个“原始”节点上,调用 scm --init
    2. 在第二个/第三个节点上,调用scm --bootstrap

    这可以通过使用 ozone.scm.primordial.node.id 更改。您可以定义原始节点。设置这个节点后,你应该在所有的节点上同时执行 scm --initscm --bootstrap

    根据 ozone.scm.primordial.node.id,初始化进程将在第二个/第三个节点上被忽略,引导进程将在除原始节点外的所有节点上被忽略。

    实现细节

    SCM HA 使用 Apache Ratis 在 SCM HA 仲裁的成员之间复制状态。每个节点在本地 RocksDB 中维护块管理元数据。

    数据节点将所有报告(容器报告、管道报告……)并发发送给 所有 SCM 节点。只有 leader 节点可以分配/创建新的容器,并且只有 leader 节点可以将命令返回给数据节点。

    启动 SCM-HA 后,可以验证 SCM 节点是否形成了一个仲裁,而不是3个单独的 SCM 节点。

    首先,检查所有的 SCM 节点是否存储相同的 ClusterId 元数据:

    ClusterId 包含在版本文件中,并且在所有的 SCM 节点中应该是相同的:

    1. #Tue Mar 16 10:19:33 UTC 2021
    2. cTime=1615889973116
    3. clusterID=CID-130fb246-1717-4313-9b62-9ddfe1bcb2e7
    4. layoutVersion=0

    如果所有的容器元数据都已复制,您还可以创建数据并使用 ozone debug 工具进行双重检查。

    1. bin/ozone freon randomkeys --numOfVolumes=1 --numOfBuckets=1 --numOfKeys=10000 --keySize=524288 --replicationType=RATIS --numOfThreads=8 --factor=THREE --bufferSize=1048576
    2. // use debug ldb to check scm db on all the machines
    3. bin/ozone debug ldb --db=/tmp/metadata/scm.db/ ls
    4. bin/ozone debug ldb --db=/tmp/metadata/scm.db/ scan --with-keys --column_family=containers

    从现有的SCM迁移

    可以在任何 Ozone 集群上打开 SCM HA。 首先启用 Ratis(ozone.scm.ratis.enable)并为 Ratis ring 配置一个节点(ozone.scm.nodes.serviceId 应该有一个元素)。

    启动集群并测试它是否正常工作。

    如果一切正常,您可以用多个节点扩展集群配置,重新启动 SCM 节点,并使用 命令初始化其他节点。