配置项作用 #
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_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)
└── 放弃加入 ❌
使用场景 #
推荐保持默认的场景 #
- 标准生产环境: 网络稳定、集群正常
- 快速故障转移: 需要快速发现加入失败
- 自动化程度高: 加入失败后由自动化系统处理
推荐增加的场景 #
- 不稳定网络: 网络经常出现临时问题
- 跨地域部署: 网络延迟高且不稳定
- 滚动升级: 升级过程中主节点可能频繁变更
推荐减少的场景 #
- 稳定环境: 网络和集群都非常稳定
- 快速失败: 希望快速发现问题并人工处理
- 自动化恢复: 有外部系统处理节点加入问题
注意事项 #
已弃用: 此配置已被标记为弃用,建议关注新的发现机制。
与 join_retry_delay 配合: 总重试时间 = (请求时间 + delay) × attempts。
NotMasterException 特殊处理: 只有这种特定错误会触发重试逻辑。
日志级别: 重试时使用 TRACE 级别日志,失败时使用 INFO 级别。
调试建议: 启用 TRACE 级别日志可以看到详细的重试过程。
监控建议: 监控节点加入事件,如果频繁失败需要检查集群状态。
动态更新: 此配置不支持动态更新,修改后需要重启节点。
集群初始状态: 在集群初始化阶段,此配置尤为重要。





