📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

配置项作用 #

discovery.zen.join_retry_attempts 配置项用于控制节点尝试加入集群时,遇到可重试错误后的最大重试次数

当节点向主节点发送加入请求时,如果遇到 NotMasterException 等可重试错误,系统会根据此配置决定重试多少次。

配置项属性 #

  • 配置路径: discovery.zen.join_retry_attempts
  • 数据类型: integer
  • 默认值: 3
  • 最小值: 1
  • 是否可选: 是
  • 弃用状态: ⚠️ 已弃用

配置项详解 #

工作机制 #

节点加入集群流程

新节点
    │
    ↓
查找主节点
    │
    ↓
发送加入请求
    │
    ├──────── 成功
    │              ↓
    │         加入集群 ✅
    │
    └──────── NotMasterException (可重试错误)
                   ↓
              joinAttempt++
                   ↓
         joinAttempt < join_retry_attempts ?
                   │
         ├──────── 是
         │         ↓
         │    等待 join_retry_delay
         │         ↓
         │    重新发送加入请求
         │
         └──────── 否
                    ↓
               放弃加入 ❌

重试逻辑 #

// 简化的代码逻辑
int joinAttempt = 0;

while (joinAttempt < joinRetryAttempts) {
    try {
        sendJoinRequest(masterNode);
        // 成功,退出
        break;
    } catch (NotMasterException e) {
        joinAttempt++;
        if (joinAttempt >= joinRetryAttempts) {
            logger.info("failed to send join request to master [{}], " +
                       "reason [{}], tried [{}] times",
                       masterNode, e.getMessage(), joinAttempt);
            return false;  // 放弃加入
        } else {
            logger.trace("master {} failed with [{}]. retrying... " +
                        "(attempts done: [{}])",
                        masterNode, e.getMessage(), joinAttempt);
        }
        // 等待重试延迟
        Thread.sleep(joinRetryDelay.millis());
    }
}

可重试的错误 #

  • NotMasterException: 目标节点不再是主节点
  • 网络连接错误: 临时性网络问题
  • 超时错误: 请求超时但节点仍然存活

配置建议 #

⚠️ 重要提示 #

此配置项已被标记为弃用,建议保持默认值。

生产环境(默认) #

discovery.zen.join_retry_attempts: 3

建议: 保持默认值 3。这提供了合理的重试次数,避免因短暂问题导致节点无法加入。

高延迟网络 #

discovery.zen.join_retry_attempts: 5

建议: 增加到 5-10。当网络延迟高或不稳定时增加重试次数。

快速失败场景 #

discovery.zen.join_retry_attempts: 1

建议: 减少到 1-2。当希望快速失败并人工介入时使用。

代码示例 #

easysearch.yml 配置(已弃用) #

discovery:
  zen:
    join_retry_attempts: 3  # 默认值

配合重试延迟配置 #

discovery:
  zen:
    join_retry_attempts: 5
    join_retry_delay: 1s
    join_timeout: 30s

高延迟网络配置 #

discovery:
  zen:
    join_retry_attempts: 8
    join_retry_delay: 2s
    ping_timeout: 10s

相关配置 #

配置项作用默认值
discovery.zen.join_retry_attempts加入重试次数3
discovery.zen.join_retry_delay重试之间的延迟100ms
discovery.zen.join_timeout加入超时时间-
discovery.zen.ping_timeoutping 超时3s

加入总时间计算 #

加入总时间 ≈ (单次请求时间 + join_retry_delay) × join_retry_attempts

默认配置:
= (请求时间 + 100ms) × 3

假设单次请求耗时 1s:
= (1s + 0.1s) × 3 = 3.3 秒

高延迟网络配置:
= (3s + 2s) × 8 = 40 秒

重试场景分析 #

场景 1:主节点变更 #

新节点加入

尝试 1 → 向节点A (以为是master)
         └── NotMasterException: A不是master

等待 join_retry_delay (100ms)

尝试 2 → 向节点A (更新后的master)
         └── 成功 ✅

场景 2:网络波动 #

新节点加入

尝试 1 → 网络超时
等待 100ms

尝试 2 → 网络恢复
         └── 成功 ✅

场景 3:达到重试上限 #

新节点加入

尝试 1 → NotMasterException
等待 100ms

尝试 2 → NotMasterException
等待 100ms

尝试 3 → NotMasterException
         └── 达到 join_retry_attempts (3)
         └── 放弃加入 ❌

使用场景 #

推荐保持默认的场景 #

  • 标准生产环境: 网络稳定、集群正常
  • 快速故障转移: 需要快速发现加入失败
  • 自动化程度高: 加入失败后由自动化系统处理

推荐增加的场景 #

  • 不稳定网络: 网络经常出现临时问题
  • 跨地域部署: 网络延迟高且不稳定
  • 滚动升级: 升级过程中主节点可能频繁变更

推荐减少的场景 #

  • 稳定环境: 网络和集群都非常稳定
  • 快速失败: 希望快速发现问题并人工处理
  • 自动化恢复: 有外部系统处理节点加入问题

注意事项 #

  1. 已弃用: 此配置已被标记为弃用,建议关注新的发现机制。

  2. 与 join_retry_delay 配合: 总重试时间 = (请求时间 + delay) × attempts。

  3. NotMasterException 特殊处理: 只有这种特定错误会触发重试逻辑。

  4. 日志级别: 重试时使用 TRACE 级别日志,失败时使用 INFO 级别。

  5. 调试建议: 启用 TRACE 级别日志可以看到详细的重试过程。

  6. 监控建议: 监控节点加入事件,如果频繁失败需要检查集群状态。

  7. 动态更新: 此配置不支持动态更新,修改后需要重启节点。

  8. 集群初始状态: 在集群初始化阶段,此配置尤为重要。