客户端故障转移
本文档介绍 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.timeout | 15min | SCM 的 RPC 超时时间。如果 ipc.client.ping 设置为 true,且该 RPC 超时时间大于 ipc.ping.interval 的值,则 RPC 超时的有效值会向上取整为 ipc.ping.interval 的整数倍。 |
hdds.scmclient.max.retry.timeout | 10min | SCM 客户端的最大重试超时时间。 |
hdds.scmclient.failover.max.retry | 15 | SCM 客户端发生故障转移时的最大重试次数。如果 maxRetryTimeout / retryInterval 大于该值,则改用计算得到的值。 |
hdds.scmclient.failover.retry.interval | 2s | 重试其他 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.retries | 3 | Ozone 客户端在读取 key 遇到连接异常时的最大重试次数。 |
ozone.client.read.retry.interval | 1 second | 客户端在从 Datanode 读取 key 遇到连接异常后,重试读取请求前等待的时间(以秒为单位)。 |
ozone.client.max.retries | 5 | Ozone 客户端在写入 key 遇到异常时的最大重试次数。 |
ozone.client.retry.interval | 0 | 客户端在写入 key 遇到异常后,重试写入请求前等待的时间。默认情况下不等待。 |
评论
登录后参与评论
KnowForge