📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

配置项作用 #

discovery.zen.hosts_provider 配置项用于指定集群发现过程中使用的种子主机提供者列表。

此配置定义了节点如何获取集群中其他节点的地址信息,以便发现并加入集群。

配置项属性 #

  • 配置路径: discovery.zen.hosts_provider
  • 数据类型: list(字符串列表)
  • 默认值: [](空列表)
  • 是否可选: 是
  • 弃用状态: ⚠️ 已弃用

配置项详解 #

工作机制 #

集群发现流程

节点启动
    │
    ↓
读取 discovery.zen.hosts_provider
    │
    ├──────── 已配置(如 ["file"])
    │              │
    │              ↓
    │         使用指定的提供者
    │              │
    │              ├── "file" → 读取 unicast_hosts.txt
    │              └── "settings" → 读取 discovery.seed_hosts
    │
    └──────── 未配置(空列表)
                   │
                   ↓
              回退到默认行为
                   │
                   ↓
              使用 TransportService 默认地址

与新配置的冲突检查 #

// 系统会检查是否同时配置了旧的和新的配置
if (LEGACY_DISCOVERY_HOSTS_PROVIDER_SETTING.exists(settings)) {
    if (DISCOVERY_SEED_PROVIDERS_SETTING.exists(settings)) {
        throw new IllegalArgumentException(
            "it is forbidden to set both [" +
            DISCOVERY_SEED_PROVIDERS_SETTING.getKey() + "] and [" +
            LEGACY_DISCOVERY_HOSTS_PROVIDER_SETTING.getKey() + "]"
        );
    }
    return LEGACY_DISCOVERY_HOSTS_PROVIDER_SETTING.get(settings);
}
return DISCOVERY_SEED_PROVIDERS_SETTING.get(settings);

内置提供者 #

1. settings 提供者 #

基于配置文件的主机列表:

discovery.zen.hosts_provider: ["settings"]
discovery.seed_hosts:
  - "192.168.1.10:9300"
  - "192.168.1.11:9300"
  - "192.168.1.12:9300"

2. file 提供者 #

基于文件的主机列表:

discovery.zen.hosts_provider: ["file"]

文件内容(unicast_hosts.txt):

# 种子节点列表
192.168.1.10:9300
192.168.1.11:9300
192.168.1.12:9300

配置建议 #

⚠️ 重要提示 #

此配置项已被标记为弃用,建议使用新的 discovery.seed_providers 配置。

使用新配置(推荐) #

discovery.seed_providers: ["settings"]
discovery.seed_hosts:
  - "node1.example.com:9300"
  - "node2.example.com:9300"

使用文件提供者 #

discovery.seed_providers: ["file"]

创建 unicast_hosts.txt

node1.example.com:9300
node2.example.com:9300
node3.example.com:9300

代码示例 #

easysearch.yml 配置(已弃用) #

discovery:
  zen:
    hosts_provider: ["file"]  # 旧配置(已弃用)

推荐的替代配置 #

discovery:
  seed_providers: ["file"]  # 新配置(推荐)

混合提供者配置 #

discovery:
  seed_providers:
    - "settings"
    - "file"

版本兼容配置 #

# 6.x 版本
discovery:
  zen:
    hosts_provider: ["settings"]

# 7.x+ 版本
discovery:
  seed_providers: ["settings"]

相关配置 #

配置项状态作用
discovery.zen.hosts_provider⚠️ 已弃用旧版主机提供者配置
discovery.seed_providers✅ 推荐新版种子提供者配置
discovery.seed_hosts✅ 有效种子主机列表
discovery.zen.ping.unicast.hosts⚠️ 已弃用旧版单播主机配置

配置迁移 #

旧配置(6.x):
discovery.zen.hosts_provider: ["settings"]
discovery.zen.ping.unicast.hosts: ["node1:9300", "node2:9300"]

新配置(7.x+):
discovery.seed_providers: ["settings"]
discovery.seed_hosts: ["node1:9300", "node2:9300"]

版本兼容性 #

6.x 版本 #

discovery:
  zen:
    hosts_provider: ["settings"]
    ping:
      unicast:
        hosts: ["node1:9300", "node2:9300"]

7.x+ 版本 #

discovery:
  seed_providers: ["settings"]
  seed_hosts: ["node1:9300", "node2:9300"]

测试框架中的版本处理 #

if (node.getVersion().onOrAfter("7.0.0")) {
    // 移除旧的 zen 配置
    node.defaultConfig.keySet().stream()
        .filter(name -> name.startsWith("discovery.zen."))
        .forEach(node.defaultConfig::remove);

    // 使用新的配置
    node.defaultConfig.put("discovery.seed_providers", "file");
}

使用场景 #

推荐迁移到新配置 #

  • 新部署: 直接使用 discovery.seed_providers
  • 升级部署: 逐步迁移到新配置
  • 兼容性: 避免使用已弃用的配置

文件提供者适用场景 #

  • 容器化部署: Kubernetes、Docker
  • 动态配置: 配置与镜像分离
  • 外部管理: 通过配置管理工具维护

注意事项 #

  1. 已弃用: 此配置已被标记为弃用,建议迁移到 discovery.seed_providers

  2. 不能同时使用: 不能同时配置 hosts_providerseed_providers,系统会报错。

  3. 文件位置: 使用 file 提供者时,unicast_hosts.txt 文件应在配置目录中。

  4. 文件格式: 每行一个主机,可包含端口,支持 # 开头的注释。

  5. 动态更新: 文件提供者支持动态更新,修改文件后重启节点生效。

  6. 测试框架: 测试框架会根据版本自动选择合适的配置方式。

  7. 回退行为: 未配置时使用 TransportService 的默认种子地址。