高可用性

客户端故障转移

师成师成· 更新于 2026-09-28· 阅读 6 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

本文档介绍 Ozone 客户端如何处理故障转移与重试逻辑,以确保高可用性和可靠性。在 Ozone 的高可用(HA)部署中,客户端需要在多个服务实例(Ozone Manager、Storage Container Manager)之间自动进行故障转移,并在与数据节点(Datanode)通信失败时重试操作。

故障转移与重试机制对客户端应用是透明的。客户端会自动检测故障、切换到备用服务实例,并按照可配置的策略重试操作。只有在所有重试尝试都已耗尽之后,才会向应用层抛出异常。

客户端到 Ozone Manager 的故障转移

客户端始终向主(leader)Ozone Manager(OM)提交请求。如果 leader 状态为 unknown,客户端会先将请求发送到配置中的第一个 OM,并依次重试其他 OM,直到找到主节点为止。

1. Hadoop RPC 传输(HadoopOMFailoverProxyProvider)

如果客户端到 OM 使用的是 Hadoop RPC 传输(HadoopRpcOMFailoverProxyProvider),则在以下情况下可能发生故障转移或重试:

  • OM 无法连接,
  • OM 不是主节点,或
  • OM 是主节点但尚未准备好接受请求。

故障转移机制最多重试 500 次(ozone.client.failover.max.attempts),每次故障转移重试之间间隔 2 秒(ozone.client.wait.between.retries.millis)。如果某个 OM 不知道当前的主节点,客户端会以轮询方式尝试下一个 OM。否则,客户端会继续重试联系当前的主节点。

此外,务必确保客户端与 OM 的节点映射配置保持一致,否则故障转移可能无法到达主 OM。

2. gRPC 传输

使用 gRPC 传输(GrpcOMFailoverProxyProvider)时,故障转移行为与 Hadoop RPC 传输类似,采用相同的重试策略和配置参数。

客户端到 Storage Container Manager 的故障转移

客户端(client、OM 或 Datanode)到 SCM 的故障转移由 SCMClientConfig 中的配置属性控制。客户端会尝试连接主 SCM。如果 SCM 在异常中提供了建议的主节点,客户端会故障转移到该主节点。否则,客户端会以轮询方式尝试下一个 SCM。

故障转移相关的配置属性如下:

属性默认值说明
hdds.scmclient.rpc.timeout15minSCM 的 RPC 超时时间。如果 ipc.client.ping 设置为 true,且该 RPC 超时时间大于 ipc.ping.interval 的值,则 RPC 超时的有效值会向上取整为 ipc.ping.interval 的整数倍。
hdds.scmclient.max.retry.timeout10minSCM 客户端的最大重试超时时间。
hdds.scmclient.failover.max.retry15SCM 客户端发生故障转移时的最大重试次数。如果 maxRetryTimeout / retryInterval 大于该值,则改用计算得到的值。
hdds.scmclient.failover.retry.interval2s重试其他 SCM IP 之间的等待时间。

客户端到 Datanode 的故障转移与重试

当出现故障时,客户端会按顺序重试管道中的 Datanode;换句话说,访问属于 Ratis/3 管道的块的客户端最多可能重试 3 个 Datanode。读操作和写操作的重试行为有所不同:

读操作:

  • 客户端对每个 Datanode 重试 3 次(ozone.client.read.max.retries)
  • 每次重试之间暂停 1 秒(ozone.client.read.retry.interval)
  • 最大重试次数:3 × Datanode 数量

写操作:

  • 客户端对每个 Datanode 重试 5 次(ozone.client.max.retries)
  • 重试之间没有暂停(ozone.client.retry.interval,默认值:0)
  • 最大重试次数:5 × Datanode 数量
属性默认值说明
ozone.client.read.max.retries3Ozone 客户端在读取 key 遇到连接异常时的最大重试次数。
ozone.client.read.retry.interval1 second客户端在从 Datanode 读取 key 遇到连接异常后,重试读取请求前等待的时间(以秒为单位)。
ozone.client.max.retries5Ozone 客户端在写入 key 遇到异常时的最大重试次数。
ozone.client.retry.interval0客户端在写入 key 遇到异常后,重试写入请求前等待的时间。默认情况下不等待。

评论

登录后参与评论

正在加载评论…