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

配置项作用 #

cluster.indices.tombstones.size 配置项控制集群状态中保留的索引墓碑(Tombstones)记录的最大数量。墓碑记录用于标记已删除的索引,确保那些离线期间错过索引删除事件的节点在重新加入集群后能够正确处理这些删除操作。

配置项类型 #

该配置项为静态配置,需要在启动时设置,修改后需要重启节点才能生效。

默认值 #

500

是否必需 #

可选配置项(有默认值)

取值范围 #

0 ~ 正整数

配置格式 #

# 默认配置
cluster.indices.tombstones.size: 500

# 增加墓碑记录数量
cluster.indices.tombstones.size: 1000

# 减少墓碑记录数量
cluster.indices.tombstones.size: 200

# 禁用墓碑记录(不推荐)
cluster.indices.tombstones.size: 0

相关配置项 #

配置项默认值说明
cluster.indices.tombstones.size500墓碑记录最大数量
cluster.indices.close.enabletrue允许关闭索引

工作原理 #

索引墓碑机制:

┌─────────────────────────────────────────────────────────────────┐
│                    索引墓碑机制工作流程                            │
└─────────────────────────────────────────────────────────────────┘

索引删除请求
    │
    ├── 从集群状态移除索引
    │
    └── 添加墓碑记录到集群状态
        │
        └── 记录包含:
            ├── 索引名称
            └── 删除时间戳

墓碑记录的作用:
    │
    ├── 离线节点重新加入
    │   │
    │   ├── 获取最新集群状态
    │   │
    │   ├── 检查墓碑记录
    │   │   │
    │   │   └── 发现已删除索引的墓碑
    │   │       │
    │   │       └── 清理本地数据
    │   │
    │   └── 正确处理删除
    │
    └── 墓碑记录清理
        ├── 达到上限后自动清理
        └── 保留最近的记录

为什么需要墓碑记录 #


场景说明:

1. 索引删除时节点在线
    集群:
        - 删除索引 A
        - 通知所有节点
    节点:
        - 收到删除通知
        - 清理本地数据
        - ✓ 正确处理

2. 索引删除时节点离线
    集群:
        - 删除索引 A
        - 添加墓碑记录
        - 通知在线节点
    离线节点:
        - 未收到删除通知
        - 本地仍保留索引数据
        - 重新加入集群
        - 获取新集群状态
        - 发现墓碑记录
        - 清理本地数据
        - ✓ 通过墓碑正确处理

3. 没有墓碑记录
    离线节点:
        - 重新加入集群
        - 获取新集群状态
        - 未发现索引删除信息
        - 认为索引仍存在
        - ✗ 数据不一致

墓碑记录清理 #

墓碑记录清理机制:

当前墓碑数量超过限制时:

1. 按时间排序
    - 最旧的墓碑在前
    - 最新的墓碑在后

2. 清理策略
    - 删除最旧的墓碑
    - 保留最新的墓碑
    - 直到数量等于限制

示例 (限制 = 500):

    当前有 600 个墓碑
    │
    ├── 删除最旧的 100 个
    │
    └── 保留最新的 500 个

风险:
    如果节点离线时间过长
    错过的删除记录可能被清理
    重新加入时可能数据不一致

使用场景 #

1. 默认配置(推荐) #

cluster.indices.tombstones.size: 500

适用场景:

  • 大多数集群配置
  • 节点偶尔离线
  • 删除操作不频繁

2. 增加墓碑数量 #

cluster.indices.tombstones.size: 1000

适用场景:

  • 频繁删除索引
  • 节点可能长时间离线
  • 大规模集群

3. 减少墓碑数量 #

cluster.indices.tombstones.size: 200

适用场景:

  • 索引很少删除
  • 节点很少离线
  • 集群状态较大需要优化

4. 禁用墓牌 #

cluster.indices.tombstones.size: 0

适用场景:

  • 不推荐使用
  • 所有节点始终在线
  • 特殊测试环境

推荐设置建议 #

集群特征推荐值说明
频繁删除索引1000-2000保留更多记录
偶尔删除索引500默认配置
很少删除索引200-500减少集群状态大小
节点频繁重启1000+容错优先
稳定集群200-500优化集群状态

集群状态大小影响 #

墓碑记录对集群状态的影响:

内存占用:
    每个墓碑记录:
        - 索引名称: 约 100 bytes
        - 时间戳: 8 bytes
        - 对象开销: 约 50 bytes
        - 总计: 约 158 bytes

500 个墓牌:
    约 79 KB

2000 个墓牌:
    约 316 KB

影响:
    - 增加集群状态大小
    - 增加状态同步开销
    - 影响主节点性能

配置示例 #

# 场景 1: 日志集群(频繁删除索引)
cluster.name: logs-cluster
cluster.indices.tombstones.size: 2000

# 场景 2: 标准业务集群
cluster.name: business-cluster
cluster.indices.tombstones.size: 500

# 场景 3: 稳定生产集群
cluster.name: stable-cluster
cluster.indices.tombstones.size: 200

# 场景 4: 测试集群
cluster.name: test-cluster
cluster.indices.tombstones.size: 100

监控建议 #

# 查看当前配置
GET /_cluster/settings?filter_path=*.cluster.indices.tombstones.size

# 查看集群状态
GET /_cluster/state

# 查看墓碑记录
GET /_cluster/state?filter_path=metadata.index_graveyard

# 查看集群状态大小
GET /_cluster/state
# 检查响应的大小

墓碑记录示例 #

# 查看墓碑记录
GET /_cluster/state?filter_path=metadata.index_graveyard

# 响应示例:
{
  "metadata": {
    "index_graveyard": {
      "tombstones": [
        {
          "index": "logs-2023-01-01",
          "delete_date_in_millis": 1672531200000,
          "delete_date": "2023-01-01T00:00:00.000Z"
        },
        {
          "index": "metrics-2023-01",
          "delete_date_in_millis": 1675209600000,
          "delete_date": "2023-01-31T00:00:00.000Z"
        }
      ]
    }
  }
}

故障排查 #

数据不一致问题排查:

问题: 节点重新加入后仍有已删除索引

排查步骤:
1. 检查墓碑配置
   GET /_cluster/settings?filter_path=*.indices.tombstones.size

2. 查看墓碑记录
   GET /_cluster/state?filter_path=**.index_graveyard

3. 检查节点离线时间
   # 确认节点离线时长

4. 检查删除历史
   # 对比墓碑记录数量

解决措施:
    - 增加 tombstones.size
    - 确保节点定期加入集群
    - 手动清理残留索引

注意事项 #

  1. 静态配置:修改需要重启节点
  2. 集群状态大小:增加此值会增加集群状态大小
  3. 数据一致性:过小的值可能导致数据不一致
  4. 离线时间:应大于节点可能的最大离线时间
  5. 删除频率:频繁删除索引应增大此值
  6. 权衡考虑:在集群状态大小和容错能力之间权衡