--- title: "按数据节点数量恢复配置" date: 2026-01-25 lastmod: 2026-01-25 description: "gateway.recover_after_data_nodes 配置项用于控制集群恢复所需的最少数据节点数量。" tags: ["Gateway", "集群恢复", "数据节点", "启动控制"] summary: "配置项作用 # gateway.recover_after_data_nodes 配置项用于指定集群恢复状态所需要的最少数据节点数量。 当集群启动时,只有在达到指定数量的数据节点后,才会开始恢复集群状态和分片数据。 配置项属性 # 配置路径: gateway.recover_after_data_nodes 数据类型: integer 默认值: -1(表示禁用此条件) 最小值: -1 是否可选: 是 配置项详解 # 工作机制 # 集群启动过程 │ ↓ 读取配置 recover_after_data_nodes = 3 │ ↓ 检测当前数据节点数量 │ ├──────── 当前数量 < 配置数量 │ │ │ ↓ │ 不开始恢复,继续等待 │ │ │ ↓ │ [调试日志] 节点数量不足 │ │ │ ↓ │ 等待新节点加入... │ └──────── 当前数量 ≥ 配置数量 │ ↓ 开始恢复集群状态 │ ↓ 恢复分片数据 决策逻辑 # // 简化的代码逻辑 if (recoverAfterDataNodes !" --- ## 配置项作用 `gateway.recover_after_data_nodes` 配置项用于指定集群恢复状态所需要的**最少数据节点数量**。 当集群启动时,只有在达到指定数量的数据节点后,才会开始恢复集群状态和分片数据。 ## 配置项属性 - **配置路径**: `gateway.recover_after_data_nodes` - **数据类型**: `integer` - **默认值**: `-1`(表示禁用此条件) - **最小值**: `-1` - **是否可选**: 是 ## 配置项详解 ## 工作机制 ``` 集群启动过程 │ ↓ 读取配置 recover_after_data_nodes = 3 │ ↓ 检测当前数据节点数量 │ ├──────── 当前数量 < 配置数量 │ │ │ ↓ │ 不开始恢复,继续等待 │ │ │ ↓ │ [调试日志] 节点数量不足 │ │ │ ↓ │ 等待新节点加入... │ └──────── 当前数量 ≥ 配置数量 │ ↓ 开始恢复集群状态 │ ↓ 恢复分片数据 ``` ## 决策逻辑 ```java // 简化的代码逻辑 if (recoverAfterDataNodes != -1) { if (nodes.getDataNodes().size() < recoverAfterDataNodes) { // 不开始恢复 logger.debug("not recovering from gateway, nodes_size (data) [{}] < recover_after_data_nodes [{}]", nodes.getDataNodes().size(), recoverAfterDataNodes); return; } } // 开始恢复 ``` ## 配置建议 ## 生产环境(推荐) ```yaml gateway.recover_after_data_nodes: 3 ``` **建议**: 设置为集群中数据节点数量的一半或更多,确保有足够的节点参与恢复。 ## 高可用环境 ```yaml gateway.recover_after_data_nodes: 5 ``` **建议**: 设置为较大值(如数据节点总数的 70%-80%),确保高可用性。 ## 开发环境 ```yaml gateway.recover_after_data_nodes: -1 ``` **建议**: 设置为 `-1`(禁用),在开发环境中可以立即开始恢复。 ## 单节点集群 ```yaml gateway.recover_after_data_nodes: 1 ``` **建议**: 设置为 `1`,确保至少有一个数据节点可用。 ## 代码示例 ## easysearch.yml 配置 ```yaml gateway: # 至少有 3 个数据节点才开始恢复 recover_after_data_nodes: 3 # 配合超时使用 recover_after_time: 5m ``` ## 完整的 Gateway 配置 ```yaml gateway: # 期望的数据节点数量 expected_data_nodes: 5 # 恢复所需的最少数据节点 recover_after_data_nodes: 3 # 超时后即使节点不足也强制恢复 recover_after_time: 10m ``` ## 与其他恢复条件配合 ```yaml gateway: # 可以同时设置多个恢复条件 recover_after_data_nodes: 3 # 至少 3 个数据节点 recover_after_master_nodes: 2 # 至少 2 个主节点 recover_after_nodes: 5 # 至少 5 个总节点 recover_after_time: 5m # 或等待 5 分钟后强制恢复 ``` ## 相关配置 | 配置项 | 作用 | 默认值 | |--------|------|--------| | `gateway.expected_data_nodes` | 期望的数据节点数量 | -1 | | `gateway.recover_after_master_nodes` | 恢复所需的主节点数量 | -1 | | `gateway.recover_after_nodes` | 恢复所需的总节点数量 | -1 | | `gateway.recover_after_time` | 恢复等待的超时时间 | 0(不等待) | ## 恢复条件的关系 ``` 恢复开始当满足以下任一条件: 1. recover_after_data_nodes 达到 2. recover_after_master_nodes 达到 3. recover_after_nodes 达到 4. recover_after_time 超时 所有条件都是"或"的关系 ``` ## 使用场景 ## 大型集群逐步启动 ```yaml gateway: recover_after_data_nodes: 10 ``` **用途**: 确保大部分数据节点上线后再开始恢复,避免部分节点承担过多负载。 ## 高可用集群 ```yaml gateway: recover_after_data_nodes: 5 recover_after_time: 10m ``` **用途**: 等待足够的数据节点,如果超时则强制恢复以保证可用性。 ## 数据完整性优先 ```yaml gateway: recover_after_data_nodes: 7 recover_after_time: 30m ``` **用途**: 数据完整性优先,等待足够多的节点或超时很长时间。 ## 快速恢复 ```yaml gateway: recover_after_data_nodes: 1 ``` **用途**: 只要有 1 个数据节点就开始恢复,优先考虑可用性。 ## 行为示例 ## 场景 1:节点数量充足 ``` 配置: recover_after_data_nodes = 3 当前数据节点: 4 个 结果: ✅ 立即开始恢复 ``` ## 场景 2:节点数量不足 ``` 配置: recover_after_data_nodes = 3 当前数据节点: 2 个 结果: ⏳ 等待更多节点加入 日志: "not recovering from gateway, nodes_size (data) [2] < recover_after_data_nodes [3]" ``` ## 场景 3:禁用条件 ``` 配置: recover_after_data_nodes = -1 当前数据节点: 1 个 结果: ✅ 立即开始恢复(条件被禁用) ``` ## 注意事项 1. **默认禁用**: 默认值为 `-1`,表示此条件被禁用。 2. **仅限数据节点**: 此配置只计算数据节点,不包括主节点(非数据节点)。 3. **与其他条件配合**: 可以与 `recover_after_time` 配合使用,实现超时强制恢复。 4. **不是强制要求**: 设置此值不意味着必须有这么多节点,只是何时开始恢复的条件。 5. **动态更新**: 此配置支持动态更新,修改后立即生效。 6. **集群重启**: 集群完整重启时,此配置可以帮助控制恢复顺序。 7. **日志监控**: 启用调试日志可以看到节点等待恢复的详细信息。