--- title: "节点离开请求发送配置" date: 2026-03-28 lastmod: 2026-03-28 description: "discovery.zen.send_leave_request 配置项用于控制节点关闭时是否向主节点发送离开请求。" tags: ["集群发现", "节点离开", "优雅关闭", "Zen Discovery"] summary: "配置项作用 # discovery.zen.send_leave_request 配置项用于控制节点在关闭或离开集群时是否向主节点发送正式的离开请求。 当节点正常关闭时,可以选择通知主节点,使集群能够更快地检测到节点的离开,并触发相应的重新分配操作。 配置项属性 # 配置路径: discovery.zen.send_leave_request 数据类型: Boolean(布尔值) 默认值: true 是否可选: 是 作用域: NodeScope(节点级别) 配置项详解 # 工作机制 # 节点关闭流程对比 启用离开请求 (send_leave_request = true): 节点启动关闭 │ ↓ 向主节点发送离开请求 │ ├──────── 网络正常 ──→ 主节点收到请求 ✅ │ │ │ ↓ │ 从集群成员移除 │ │ │ ↓ │ 触发分片重新分配 │ │ │ ↓ │ 节点完成关闭 │ └──────── 网络异常 ──→ 请求失败 ❌ │ ↓ 节点继续关闭 │ ↓ 主节点通过故障检测发现 禁用离开请求 (send_leave_request = false): 节点启动关闭 │ ↓ 直接关闭 │ ↓ 主节点通过故障检测发现(通常需要 30s+) │ ↓ 触发分片重新分配 优雅关闭 vs 突然关闭 # 优雅关闭 (send_leave_request = true): 时间线: 0s ───→ 1s ─────────────────→ 2s │ │ │ 发送 主节点处理 开始重新分配 离开请求 移除节点 │ ↓ 集群快速响应 ✅ 突然关闭 (send_leave_request = false): 时间线: 0s ───────────────────────────→ 30s+ ───→ │ │ 节点关闭 故障检测超时 │ │ ↓ ↓ 集群不知道 触发重新分配 ↓ 分片短暂不可用 ❌ 离开请求处理流程 # 离开请求的完整处理 Node 3 发送离开请求 │ ↓ Master 收到请求 │ ↓ 验证请求有效性 │ ├──────── 验证通过 ──→ 处理离开 │ │ │ ↓ │ 从集群状态移除 │ │ │ ↓ │ 更新集群元数据 │ │ │ ↓ │ 发布新集群状态 │ │ │ ↓ │ 触发分片重新分配 │ │ │ ↓ │ 选举新的分片主副本 │ └──────── 验证失败 ──→ 忽略请求 │ ↓ 等待故障检测 配置建议 # 生产环境(默认) # discovery." --- ## 配置项作用 `discovery.zen.send_leave_request` 配置项用于控制**节点在关闭或离开集群时是否向主节点发送正式的离开请求**。 当节点正常关闭时,可以选择通知主节点,使集群能够更快地检测到节点的离开,并触发相应的重新分配操作。 ## 配置项属性 - **配置路径**: `discovery.zen.send_leave_request` - **数据类型**: `Boolean`(布尔值) - **默认值**: `true` - **是否可选**: 是 - **作用域**: NodeScope(节点级别) ## 配置项详解 ## 工作机制 ``` 节点关闭流程对比 启用离开请求 (send_leave_request = true): 节点启动关闭 │ ↓ 向主节点发送离开请求 │ ├──────── 网络正常 ──→ 主节点收到请求 ✅ │ │ │ ↓ │ 从集群成员移除 │ │ │ ↓ │ 触发分片重新分配 │ │ │ ↓ │ 节点完成关闭 │ └──────── 网络异常 ──→ 请求失败 ❌ │ ↓ 节点继续关闭 │ ↓ 主节点通过故障检测发现 禁用离开请求 (send_leave_request = false): 节点启动关闭 │ ↓ 直接关闭 │ ↓ 主节点通过故障检测发现(通常需要 30s+) │ ↓ 触发分片重新分配 ``` ## 优雅关闭 vs 突然关闭 ``` 优雅关闭 (send_leave_request = true): 时间线: 0s ───→ 1s ─────────────────→ 2s │ │ │ 发送 主节点处理 开始重新分配 离开请求 移除节点 │ ↓ 集群快速响应 ✅ 突然关闭 (send_leave_request = false): 时间线: 0s ───────────────────────────→ 30s+ ───→ │ │ 节点关闭 故障检测超时 │ │ ↓ ↓ 集群不知道 触发重新分配 ↓ 分片短暂不可用 ❌ ``` ## 离开请求处理流程 ``` 离开请求的完整处理 Node 3 发送离开请求 │ ↓ Master 收到请求 │ ↓ 验证请求有效性 │ ├──────── 验证通过 ──→ 处理离开 │ │ │ ↓ │ 从集群状态移除 │ │ │ ↓ │ 更新集群元数据 │ │ │ ↓ │ 发布新集群状态 │ │ │ ↓ │ 触发分片重新分配 │ │ │ ↓ │ 选举新的分片主副本 │ └──────── 验证失败 ──→ 忽略请求 │ ↓ 等待故障检测 ``` ## 配置建议 ## 生产环境(默认) ```yaml discovery.zen.send_leave_request: true ``` **建议**: 保持默认值 `true`。确保节点能够优雅地离开集群。 ## 快速重启场景 ```yaml discovery.zen.send_leave_request: true ``` **建议**: 保持启用。快速重启时可以更快触发重新分配。 ## 不可预测的网络 ```yaml discovery.zen.send_leave_request: true ``` **建议**: 保持启用。即使请求失败,故障检测也会作为备份机制。 ## 紧急故障场景 ```yaml discovery.zen.send_leave_request: false ``` **建议**: 仅在节点因故障需要强制关闭时考虑禁用。 ## 代码示例 ## easysearch.yml 配置 ```yaml discovery: zen: send_leave_request: true # 默认值 ``` ## 禁用离开请求 ```yaml discovery: zen: send_leave_request: false # 不发送离开请求 ``` ## 完整的关闭配置 ```yaml discovery: zen: send_leave_request: true # 配合优雅关闭 cluster: routing: allocation: enable: all ``` ## 相关配置 | 配置项 | 作用 | 默认值 | |--------|------|--------| | `discovery.zen.send_leave_request` | 发送离开请求 | true | | `discovery.zen.fd.ping_timeout` | 故障检测超时 | 30s | | `discovery.zen.fd.ping_interval` | 故障检测间隔 | 1s | | `discovery.zen.no_master_block` | 无主节点时的行为 | write | ## 离开时间分析 ``` 启用离开请求的时间线 0s ──→ 0.5s ──→ 1s ──→ 2s ──→ 3s │ │ │ │ │ 发送 主节点 处理 重新 分片 请求 收到 离开 分配 恢复 总耗时: 约 2-3 秒 禁用离开请求的时间线 0s ─────────────────────────────→ 30s+ ──→ 31s+ ──→ 33s+ │ │ │ │ 关闭 故障检测 开始 分片 节点 超时 重新分配 恢复 总耗时: 约 30 秒以上 ``` ## 使用场景 ## 推荐保持默认的场景 - **生产环境**: 所有生产环境 - **计划维护**: 滚动升级或维护 - **快速重启**: 节点需要快速重启 - **数据节点**: 存储数据的节点 - **主节点**: 担任主节点的服务器 ## 禁用离开请求的场景 - **紧急故障**: 节点突然故障无法正常关闭 - **网络隔离**: 节点已经与集群网络隔离 - **测试环境**: 某些测试场景需要模拟突然关闭 ## 离开请求失败处理 ``` 离开请求失败的典型场景 场景 1: 主节点不可达 Node 3 发送离开请求 │ ↓ Master 网络不可达 ❌ │ ↓ 请求失败(记录警告日志) │ ↓ Node 3 继续关闭 │ ↓ Master 通过故障检测发现 Node 3 离开 场景 2: 主节点正在选举 Node 3 发送离开请求 │ ↓ Master 正在选举中 ❌ │ ↓ 请求失败(记录警告日志) │ ↓ Node 3 继续关闭 │ ↓ 新 Master 选举后通过故障检测发现 ``` ## 警告日志示例 ``` 离开请求失败的警告日志 [WARN ] failed to send leave request from master [node3] to possible master [node1] reason: connect_timeout 原因分析: 1. 主节点网络不可达 2. 主节点已宕机 3. 网络连接问题 影响: - 不影响节点关闭 - 集群通过故障检测发现 - 检测时间可能更长 ``` ## 优雅关闭最佳实践 ``` 推荐的节点关闭流程 1. 禁用分片分配 PUT /_cluster/settings { "transient": { "cluster.routing.allocation.enable": "primaries" } } 2. 等待分片迁移完成 GET /_cat/shards?v&h=index,shard,prirep,state,node 3. 执行正常关闭 systemctl stop easysearch (或使用 service 命令) 4. 验证集群状态 GET /_cluster/health 这样确保: - send_leave_request 能正常工作 - 分片已经迁移 - 集群保持健康状态 ``` ## 注意事项 1. **默认值推荐**: 对于所有场景,都建议保持默认值 `true`。 2. **不影响关闭**: 即使离开请求失败,节点也会继续关闭。 3. **故障检测作为备份**: 离开请求失败时,故障检测机制会确保节点最终被检测到。 4. **主节点离开**: 主节点关闭时也会发送离开请求,触发主节点重新选举。 5. **网络要求**: 确保节点到主节点的网络连接正常。 6. **监控建议**: 监控离开请求的成功率和失败日志。 7. **与滚动升级配合**: 在滚动升级时,离开请求确保集群平滑过渡。 8. **版本兼容性**: Elasticsearch 8.0+ 移除了此配置,Easysearch 仍支持。 9. **动态更新**: 此配置不支持动态更新,修改后需要重启节点。 10. **调试模式**: 如果需要调试节点离开行为,可以临时禁用并观察日志。