高可用 SCM
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。
配置
⚠️ 注意 ⚠️
SCM HA 目前仅支持新初始化的集群。 SCM HA 必须在 Ozone 服务首次启动前开启。 当某个 SCM 以非 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
第二个和第三个节点应该被 bootstrap,而不是 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 安全
在一个安全 SCM HA 集群中,我们将执行初始化的 SCM 称为原始 SCM。 原始 SCM 使用自签名证书启动根 CA,并用于颁发签名证书到它自己和其他 引导的 SCM。 只有原始 SCM 可以为其他 SCM 颁发签名证书。 因此,原始 SCM 在 SCM HA 集群中具有特殊的作用,因为它是唯一可以向 SCM 颁发证书的 SCM。
原始 SCM 担任根 CA 角色,它使用子 CA 证书签署所有 SCM 实例。 SCM 使用子 CA 证书来签署 OM/Datanodes 的证书。
引导 SCM 时会从原始 SCM 获取签名证书并启动子 CA。
SCM 上的子 CA 用于为集群中的 OM/DN 颁发签名证书。 只有 leader SCM 向 OM/DN 颁发证书。
如何启用安全
<property>
<config>ozone.security.enable</config>
<value>true</value>
</property>
<property>
<config>hdds.grpc.tls.enabled</config>
<value>true</value>
</property>
在正常的 SCM HA 配置的基础上,需要添加上述配置。
原始 SCM
原始 SCM 由配置 ozone.scm.primordial.node.id 确定。 此值可以是 SCM 的节点 ID 或原始机名。 如果配置是未定义的,则运行 init 的节点被视为原始 SCM。
bin/ozone scm --init
这将为根 CA 设置公钥、私钥对和自签名证书 并生成公钥、私钥对和 CSR 以从根 CA 获取子 CA 的签名证书。
引导 SCM
bin/ozone scm --bootstrap
这将为子 CA 设置公钥、私钥对并生成 CSR 以获取来自根 CA 的子 CA 签名证书。
注意: 当原始 SCM 未定义时,请确保仅在一个 SCM 上运行 –init, 在其他 SCM 节点上需使用 –bootstrap 进行引导。
目前 SCM HA 安全的限制
- 当原始 SCM 失效时, 新的 SCM 不能被引导并添加到 HA 节点中。
- 尚未支持从非 HA 安全集群升级到 HA 安全集群。
实现细节
SCM HA 使用 Apache Ratis 在 SCM HA 仲裁的成员之间复制状态。每个节点在本地 RocksDB 中维护块管理元数据。
这个复制过程是 OM HA 复制过程的一个简单版本,因为它不使用任何双缓冲区(SCM 请求的总体 db 吞吐量更低)。
数据节点将所有报告(容器报告、管道报告……)并发发送给 所有 SCM 节点。只有 leader 节点可以分配/创建新的容器,并且只有 leader 节点可以将命令返回给数据节点。
验证SCM HA设置
启动 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
从现有的SCM迁移
可以在任何 Ozone 集群上打开 SCM HA。 首先启用 Ratis(ozone.scm.ratis.enable
)并为 Ratis ring 配置一个节点(ozone.scm.nodes.serviceId
应该有一个元素)。
启动集群并测试它是否正常工作。
如果一切正常,您可以用多个节点扩展集群配置,重新启动 SCM 节点,并使用 scm --bootstrap
命令初始化其他节点。