--- title: "集群发现种子提供者配置" date: 2026-02-15 lastmod: 2026-02-15 description: "discovery.seed_providers 配置项用于指定集群发现过程中使用的种子主机提供者列表。" tags: ["集群发现", "种子节点", "节点加入", "Discovery"] summary: "配置项作用 # discovery.seed_providers 配置项用于指定集群发现过程中使用的**种子主机提供者(Seed Hosts Providers)**列表。 种子提供者负责为集群提供初始节点地址信息,使节点能够发现并加入集群。 配置项属性 # 配置路径: discovery.seed_providers 数据类型: list(字符串列表) 默认值: [](空列表,自动使用 “settings”) 是否可选: 是 配置项详解 # 工作机制 # 集群发现流程 节点启动 │ ↓ 读取 discovery.seed_providers │ ├──────── 未配置(空列表) │ │ │ ↓ │ 自动使用 "settings" 提供者 │ │ │ ↓ │ 读取 discovery.seed_hosts │ └──────── 已配置提供者列表 │ ↓ 按顺序调用每个提供者 │ ├── "settings" 提供者 │ ↓ │ 读取 discovery.seed_hosts │ ├── "file" 提供者 │ ↓ │ 读取 unicast_hosts." --- ## 配置项作用 `discovery.seed_providers` 配置项用于指定集群发现过程中使用的**种子主机提供者(Seed Hosts Providers)**列表。 种子提供者负责为集群提供初始节点地址信息,使节点能够发现并加入集群。 ## 配置项属性 - **配置路径**: `discovery.seed_providers` - **数据类型**: `list`(字符串列表) - **默认值**: `[]`(空列表,自动使用 "settings") - **是否可选**: 是 ## 配置项详解 ## 工作机制 ``` 集群发现流程 节点启动 │ ↓ 读取 discovery.seed_providers │ ├──────── 未配置(空列表) │ │ │ ↓ │ 自动使用 "settings" 提供者 │ │ │ ↓ │ 读取 discovery.seed_hosts │ └──────── 已配置提供者列表 │ ↓ 按顺序调用每个提供者 │ ├── "settings" 提供者 │ ↓ │ 读取 discovery.seed_hosts │ ├── "file" 提供者 │ ↓ │ 读取 unicast_hosts.txt 文件 │ └── 自定义提供者 ↓ 插件自定义逻辑 ``` ## 内置提供者 ### 1. settings 提供者 基于配置文件的静态主机列表: ```yaml discovery.seed_providers: ["settings"] discovery.seed_hosts: - 192.168.1.10:9300 - 192.168.1.11:9300 - 192.168.1.12:9300 ``` **特点**: - 最常用的配置方式 - 静态配置,需要手动维护 - 适合节点稳定的集群 ### 2. file 提供者 基于文件的主机列表: ```yaml discovery.seed_providers: ["file"] ``` 文件内容(`unicast_hosts.txt`): ``` # 格式: host:port 或 host 192.168.1.10:9300 192.168.1.11:9300 192.168.1.12:9300 ``` **特点**: - 配置与代码分离 - 可以动态更新文件 - 适合容器化部署 ## 配置建议 ## 标准生产环境 ```yaml discovery.seed_providers: ["settings"] discovery.seed_hosts: - "node1.example.com:9300" - "node2.example.com:9300" - "node3.example.com:9300" ``` **建议**: 使用默认的 "settings" 提供者,这是最可靠的配置方式。 ## 容器化部署 ```yaml discovery.seed_providers: ["file"] ``` **建议**: 在 Kubernetes 或 Docker 环境中,使用文件提供者便于动态配置。 ## 多提供者组合 ```yaml discovery.seed_providers: - "settings" - "file" ``` **建议**: 可以组合多个提供者,它们的地址会被合并使用。 ## 不配置(自动回退) ```yaml # 不配置 discovery.seed_providers # 系统自动使用 "settings" 提供者 discovery.seed_hosts: - "node1.example.com:9300" ``` **建议**: 如果只需要标准配置,可以省略此配置项。 ## 代码示例 ## easysearch.yml 配置 ```yaml # 使用 settings 提供者(最常用) discovery.seed_providers: ["settings"] discovery.seed_hosts: - "192.168.1.10:9300" - "192.168.1.11:9300" - "192.168.1.12:9300" ``` ## 文件提供者配置 ```yaml discovery.seed_providers: ["file"] ``` 创建 `unicast_hosts.txt`: ``` 192.168.1.10:9300 192.168.1.11:9300 192.168.1.12:9300 ``` ## 自定义提供者 ```yaml discovery.seed_providers: - "custom-provider" ``` 插件实现: ```java public class MyDiscoveryPlugin extends Plugin implements DiscoveryPlugin { @Override public Map> getSeedHostProviders( TransportService transportService, NetworkService networkService) { return Map.of("custom-provider", () -> new MySeedHostsProvider()); } } ``` ## 相关配置 | 配置项 | 作用 | 默认值 | |--------|------|--------| | `discovery.seed_providers` | 种子提供者列表 | ["settings"](自动) | | `discovery.seed_hosts` | settings 提供者的主机列表 | - | | `discovery.zen.hosts_provider` | 旧版配置(已弃用) | - | | `discovery.type` | 发现类型 | zen | ## 与旧版配置的兼容 ``` 旧版配置(已弃用): discovery.zen.hosts_provider: settings 新版配置: discovery.seed_providers: ["settings"] ``` ## 提供者特性对比 | 提供者 | 配置方式 | 动态更新 | 适用场景 | |--------|----------|----------|----------| | settings | easysearch.yml | 需要重启 | 标准生产环境 | | file | unicast_hosts.txt | 可更新文件 | 容器化部署 | | 自定义 | 插件实现 | 取决于实现 | 特殊需求 | ## 使用场景 ## 推荐使用 settings 提供者 - **传统部署**: 虚拟机或物理机部署 - **固定节点**: 节点地址相对稳定 - **简单配置**: 不需要复杂的发现机制 ## 推荐使用 file 提供者 - **容器化**: Kubernetes、Docker 部署 - **动态环境**: 节点地址经常变化 - **外部配置**: 配置与镜像分离 ## 自定义提供者 - **云环境**: 需要与云服务集成 - **服务发现**: 集成外部服务发现机制 - **特殊需求**: 特定的发现逻辑 ## 注意事项 1. **自动回退**: 如果不配置此设置,系统会自动使用 "settings" 提供者。 2. **向后兼容**: 旧的 `discovery.zen.hosts_provider` 配置仍然支持,但不推荐使用。 3. **不能同时使用**: 不能同时设置 `discovery.seed_providers` 和 `discovery.zen.hosts_provider`。 4. **提供者验证**: 系统会验证所有指定的提供者是否存在,不存在的提供者会导致启动失败。 5. **地址合并**: 多个提供者的地址会被合并,作为发现过程的种子地址。 6. **动态调用**: 提供者的 `getSeedAddresses` 方法在发现过程中会被重复调用。 7. **单节点模式**: 设置 `discovery.type: single-node` 时,不需要此配置。