--- title: "加入集群重试次数配置" date: 2026-01-10 lastmod: 2026-01-10 description: "discovery.zen.join_retry_attempts 配置项用于控制节点加入集群时的重试次数(已弃用)。" tags: ["集群发现", "节点加入", "重试", "已弃用"] summary: "配置项作用 # 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." --- ## 配置项作用 `discovery.zen.join_retry_attempts` 配置项用于控制节点尝试加入集群时,遇到可重试错误后的**最大重试次数**。 当节点向主节点发送加入请求时,如果遇到 `NotMasterException` 等可重试错误,系统会根据此配置决定重试多少次。 ## 配置项属性 - **配置路径**: `discovery.zen.join_retry_attempts` - **数据类型**: `integer` - **默认值**: `3` - **最小值**: `1` - **是否可选**: 是 - **弃用状态**: ⚠️ **已弃用** ## 配置项详解 ## 工作机制 ``` 节点加入集群流程 新节点 │ ↓ 查找主节点 │ ↓ 发送加入请求 │ ├──────── 成功 │ ↓ │ 加入集群 ✅ │ └──────── NotMasterException (可重试错误) ↓ joinAttempt++ ↓ joinAttempt < join_retry_attempts ? │ ├──────── 是 │ ↓ │ 等待 join_retry_delay │ ↓ │ 重新发送加入请求 │ └──────── 否 ↓ 放弃加入 ❌ ``` ## 重试逻辑 ```java // 简化的代码逻辑 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**: 目标节点不再是主节点 - **网络连接错误**: 临时性网络问题 - **超时错误**: 请求超时但节点仍然存活 ## 配置建议 ## ⚠️ 重要提示 此配置项**已被标记为弃用**,建议保持默认值。 ## 生产环境(默认) ```yaml discovery.zen.join_retry_attempts: 3 ``` **建议**: 保持默认值 `3`。这提供了合理的重试次数,避免因短暂问题导致节点无法加入。 ## 高延迟网络 ```yaml discovery.zen.join_retry_attempts: 5 ``` **建议**: 增加到 `5-10`。当网络延迟高或不稳定时增加重试次数。 ## 快速失败场景 ```yaml discovery.zen.join_retry_attempts: 1 ``` **建议**: 减少到 `1-2`。当希望快速失败并人工介入时使用。 ## 代码示例 ## easysearch.yml 配置(已弃用) ```yaml discovery: zen: join_retry_attempts: 3 # 默认值 ``` ## 配合重试延迟配置 ```yaml discovery: zen: join_retry_attempts: 5 join_retry_delay: 1s join_timeout: 30s ``` ## 高延迟网络配置 ```yaml 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_timeout` | ping 超时 | 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. **集群初始状态**: 在集群初始化阶段,此配置尤为重要。