Ozone包含两个元数据管理节点(用于键管理的 Ozone Manager 和用于块空间管理的 Storage Container management )和多个存储节点(数据节点)。通过 RAFT 共识算法实现数据在数据节点之间的复制。
为了避免任何单点故障,元数据管理器节点还应该具有 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-site.xml
中进行以下设置:
<property>
<name>ozone.scm.ratis.enable</name>
<value>true</value>
</property>
一个 Ozone 配置(ozone-site.xml
)可以支持多个SCM HA节点集,多个 Ozone 集群。要在可用的 SCM 节点之间进行选择,每个集群都需要一个逻辑名称,可以将其解析为 Storage Container Manage 的 IP 地址(和域名)。
这个逻辑名称称为 serviceId
,可以在 ozone-site.xml
中配置。
大多数情况下,你只需要设置当前集群的值:
<property>
<name>ozone.scm.service.ids</name>
<value>cluster1</value>
</property>
对于每个已定义的 serviceId
,应该为每个服务器定义一个逻辑配置名:
<property>
<name>ozone.scm.nodes.cluster1</name>
<value>scm1,scm2,scm3</value>
</property>
定义的前缀可以用来定义每个 SCM 服务的地址:
<property>
<name>ozone.scm.address.cluster1.scm1</name>
<value>host1</value>
</property>
<property>
<name>ozone.scm.address.cluster1.scm2</name>
<value>host2</value>
</property>
<property>
<name>ozone.scm.address.cluster1.scm3</name>
<value>host3</value>
</property>
为了获得可靠的 HA 支持,请选择3个独立的节点以形成仲裁。
初始化的第一个 SCM-HA 节点和 none-HA SCM是一样的:
bin/ozone scm --init
第二个和第三个节点应该被 bootstrapped,而不是 init。这些集群将加入到配置的 RAFT 仲裁。当前服务器的 id 通过 DNS 名称标识,也可以通过 ozone.scm.node.id
明确设置。大多数时候你不需要设置它,因为基于 DNS 的 id 检测可以很好地工作。
bin/ozone scm --bootstrap
在某些环境(例如容器化/ K8s 环境)中,我们需要一种通用的统一方法来初始化 SCM HA 仲裁。 剩下的标准初始化流程如下:
scm --init
scm --bootstrap
这可以通过使用 ozone.scm.primordial.node.id
更改。您可以定义原始节点。设置这个节点后,你应该在所有的节点上同时执行 scm --init
和 scm --bootstrap
。
根据 ozone.scm.primordial.node.id
,初始化进程将在第二个/第三个节点上被忽略,引导进程将在除原始节点外的所有节点上被忽略。
SCM HA 使用 Apache Ratis 在 SCM HA 仲裁的成员之间复制状态。每个节点在本地 RocksDB 中维护块管理元数据。
这个复制过程是 OM HA 复制过程的一个简单版本,因为它不使用任何双缓冲区(SCM 请求的总体 db 吞吐量更低)。
数据节点将所有报告(容器报告、管道报告……)并发发送给 所有 SCM 节点。只有 leader 节点可以分配/创建新的容器,并且只有 leader 节点可以将命令返回给数据节点。
启动 SCM-HA 后,可以验证 SCM 节点是否形成了一个仲裁,而不是3个单独的 SCM 节点。
首先,检查所有的 SCM 节点是否存储相同的 ClusterId 元数据:
cat /data/metadata/scm/current/VERSION
ClusterId 包含在版本文件中,并且在所有的 SCM 节点中应该是相同的:
#Tue Mar 16 10:19:33 UTC 2021
cTime=1615889973116
clusterID=CID-130fb246-1717-4313-9b62-9ddfe1bcb2e7
nodeType=SCM
scmUuid=e6877ce5-56cd-4f0b-ad60-4c8ef9000882
layoutVersion=0
如果所有的容器元数据都已复制,您还可以创建数据并使用 ozone debug
工具进行双重检查。
bin/ozone freon randomkeys --numOfVolumes=1 --numOfBuckets=1 --numOfKeys=10000 --keySize=524288 --replicationType=RATIS --numOfThreads=8 --factor=THREE --bufferSize=1048576
// use debug ldb to check scm db on all the machines
bin/ozone debug ldb --db=/tmp/metadata/scm.db/ ls
bin/ozone debug ldb --db=/tmp/metadata/scm.db/ scan --with-keys --column_family=containers
可以在任何 Ozone 集群上打开 SCM HA。 首先启用 Ratis(ozone.scm.ratis.enable
)并为 Ratis ring 配置一个节点(ozone.scm.nodes.serviceId
应该有一个元素)。
启动集群并测试它是否正常工作。
如果一切正常,您可以用多个节点扩展集群配置,重新启动 SCM 节点,并使用 scm --bootstrap
命令初始化其他节点。