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

配置项作用 #

gateway.auto_import_dangling_indices 配置项用于控制是否自动检测并导入悬空索引(dangling indices)

悬空索引是指那些数据已写入磁盘,但不存在于当前集群元数据中的索引。这通常发生在集群出现分区、节点故障等异常情况后。

配置项属性 #

  • 配置路径: gateway.auto_import_dangling_indices
  • 数据类型: boolean
  • 默认值: false
  • 是否可选: 是
  • 弃用状态: ⚠️ 已弃用,建议使用 _dangling API

配置项详解 #

什么是悬空索引 #

正常情况:
集群元数据 ────────→ 索引 A, B, C
磁盘数据 ──────────→ 索引 A, B, C
                     一致 ✓

悬空索引情况:
集群元数据 ────────→ 索引 A, C
磁盘数据 ──────────→ 索引 A, B, C
                     索引 B 是悬空索引 ✗

工作机制 #

启用自动导入(auto_import_dangling_indices = true) #

节点启动
    ↓
扫描磁盘上的所有索引
    ↓
与集群元数据对比
    ↓
发现悬空索引
    ↓
自动导入到集群状态
    ↓
移除所有别名(防止冲突)
    ↓
索引可正常使用

禁用自动导入(auto_import_dangling_indices = false,默认) #

节点启动
    ↓
不扫描悬空索引
    ↓
悬空索引数据存在但不可访问
    ↓
需要使用 _dangling API 手动处理

配置建议 #

⚠️ 重要提示 #

此配置项已被标记为弃用,建议使用 _dangling API 进行手动管理。

使用新 API 管理(推荐) #

# 1. 列出所有悬空索引
GET _dangling

# 2. 导入指定的悬空索引
POST _dangling/<index_uuid>

# 3. 删除指定的悬空索引
DELETE _dangling/<index_uuid>

如果必须使用旧配置 #

# 开发环境:可以启用自动导入
gateway.auto_import_dangling_indices: true

建议: 仅在开发环境中使用,生产环境建议使用 API 手动管理。

代码示例 #

easysearch.yml 配置(已弃用) #

# 不推荐使用此配置
gateway:
  auto_import_dangling_indices: false  # 默认值

使用 _dangling API(推荐) #

# 列出所有悬空索引
GET _dangling

# 响应示例
{
  "dangling_indices": [
    {
      "index_name": "my_index",
      "index_uuid": "abc123xyz",
      "creation_date": "2023-01-01T00:00:00Z",
      "path": "/path/to/index/data"
    }
  ]
}

# 导入悬空索引
POST _dangling/abc123xyz
{
  "accept_data_loss": true,
  "timeout": "5m"
}

# 删除悬空索引
DELETE _dangling/abc123xyz
{
  "accept_data_loss": true
}

批量导入悬空索引 #

# 导入所有悬空索引
POST _dangling/_import
{
  "accept_data_loss": true
}

使用场景 #

悬空索引产生原因 #

场景说明
集群分区网络分区导致部分节点无法同步元数据
节点故障主节点故障期间,其他节点创建了新索引
元数据丢失集群状态损坏或丢失
人为操作误删除索引但磁盘数据未清除

推荐处理方式 #

  1. 生产环境: 使用 _dangling API 手动审查和导入
  2. 开发环境: 可考虑启用自动导入
  3. 测试环境: 根据需求决定

安全考虑 #

自动导入的风险 #

场景:集群中已存在同名索引

磁盘: 索引 A (uuid=abc)
集群: 索引 A (uuid=def)

如果自动导入:
    ❌ 可能导致数据混淆
    ❌ 两个相同名称的索引

正确的做法:
    1. 检查 UUID
    2. 手动决定导入或删除
    3. 避免数据混淆

内置安全机制 #

系统内置了一些安全检查:

  1. 同名检查: 如果集群中已存在同名索引,不会自动导入
  2. 墓碑检查: 如果索引在墓碑区(已删除记录),不会被导入
  3. 别名清理: 导入时自动移除所有别名,防止冲突

注意事项 #

  1. 已弃用: 此配置已被弃用,应使用 _dangling API 替代。

  2. 数据丢失风险: 自动导入可能导致数据混淆或覆盖,建议手动审查。

  3. 别名冲突: 导入时会移除所有别名,需要手动重新配置。

  4. 生产环境: 强烈建议在生产环境中使用 API 手动管理悬空索引。

  5. 定期检查: 定期使用 GET _dangling 检查是否有悬空索引。

  6. 备份优先: 在处理悬空索引前,建议先备份相关数据。