--- title: "自动导入悬空索引配置" date: 2026-01-12 lastmod: 2026-01-12 description: "gateway.auto_import_dangling_indices 配置项用于控制是否自动导入悬空索引,即那些存在于磁盘但不在集群元数据中的索引(已弃用)。" tags: ["Gateway", "悬空索引", "索引恢复", "已弃用"] summary: "配置项作用 # 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 进行手动管理。" --- ## 配置项作用 `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 管理(推荐) ```bash # 1. 列出所有悬空索引 GET _dangling # 2. 导入指定的悬空索引 POST _dangling/ # 3. 删除指定的悬空索引 DELETE _dangling/ ``` ## 如果必须使用旧配置 ```yaml # 开发环境:可以启用自动导入 gateway.auto_import_dangling_indices: true ``` **建议**: 仅在开发环境中使用,生产环境建议使用 API 手动管理。 ## 代码示例 ## easysearch.yml 配置(已弃用) ```yaml # 不推荐使用此配置 gateway: auto_import_dangling_indices: false # 默认值 ``` ## 使用 _dangling API(推荐) ```bash # 列出所有悬空索引 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 } ``` ## 批量导入悬空索引 ```bash # 导入所有悬空索引 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. **备份优先**: 在处理悬空索引前,建议先备份相关数据。