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

配置项作用 #

index_state_management.history.number_of_shards 配置项用于控制索引状态管理(ISM)历史索引的主分片数量

历史索引用于存储 ISM 策略执行的记录。分片数影响历史索引的并发写入性能和查询性能。

配置项属性 #

  • 配置路径: index_state_management.history.number_of_shards
  • 数据类型: Integer(整数)
  • 默认值: 1
  • 最小值: 1
  • 是否可选: 是
  • 作用域: NodeScope(节点级别)
  • 动态更新: 是(支持动态更新)

配置项详解 #

工作机制 #

历史索引分片结构

number_of_shards = 1:

┌─────────────────────┐
│   Shard 1 (Primary) │
└─────────────────────┘
优点: 简单管理
缺点: 单节点写入瓶颈


number_of_shards = 3:

┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Shard 1     │ │ Shard 2     │ │ Shard 3     │
│ (Primary)   │ │ (Primary)   │ │ (Primary)   │
└─────────────┘ └─────────────┘ └─────────────┘
优点: 并发写入
缺点: 管理复杂度增加

分片与副本 #

完整索引结构

number_of_shards = 2
number_of_replicas = 1

Shard 1 (Primary) ──→ Replica 1
Shard 2 (Primary) ──→ Replica 2

总分片数 = 2 × (1 + 1) = 4
├── 2 个主分片
└── 2 个副本分片

每个分片是独立的 Lucene 索引

写入分布 #

并发写入流程

ISM 操作记录
    │
    ↓
根据分片键分配
    │
    ├──────── 记录 1 ──→ Shard 1
    ├──────── 记录 2 ──→ Shard 2
    ├──────── 记录 3 ──→ Shard 3
    └──────── 记录 4 ──→ Shard 1

负载均衡:
- 数据均匀分布到各分片
- 提高并发写入能力
- 降低单分片压力

配置建议 #

生产环境(默认) #

index_state_management:
  history:
    number_of_shards: 1  # 默认值

建议: 保持默认值 1。历史索引通常写入量不大。

高频操作环境 #

index_state_management:
  history:
    number_of_shards: 3  # 3 个分片

建议: 增加到 2-3。ISM 操作非常频繁时使用。

大规模集群 #

index_state_management:
  history:
    number_of_shards: 2

建议: 设置为 2。集群节点较多时使用。

测试环境 #

index_state_management:
  history:
    number_of_shards: 1  # 简化配置

建议: 保持默认值。测试环境使用。

代码示例 #

easysearch.yml 基础配置 #

index_state_management:
  history:
    number_of_shards: 1

完整历史配置 #

index_state_management:
  history:
    enabled: true
    number_of_shards: 1
    number_of_replicas: 1
    max_docs: 2500000
    max_age: 24h

高性能配置 #

index_state_management:
  history:
    number_of_shards: 3
    number_of_replicas: 1

动态更新配置 #

PUT /_cluster/settings
{
  "transient": {
    "index_state_management.history.number_of_shards": 2
  }
}

相关配置 #

配置项作用默认值
index_state_management.history.enabled是否启用历史记录true
index_state_management.history.number_of_shards历史索引分片数1
index_state_management.history.number_of_replicas历史索引副本数1
index_state_management.history.max_docs历史索引最大文档数2500000

性能影响分析 #

number_of_shards 设置优点缺点
1(默认)简单管理,资源占用少单分片写入瓶颈
2-3并发写入,查询性能好资源占用多
5+高并发能力过度分片,管理复杂

并发写入能力 #

写入性能对比

假设单分片写入能力: 10000 条/秒

shards = 1:
总写入能力 = 10000 条/秒

shards = 2:
总写入能力 ≈ 18000 条/秒

shards = 3:
总写入能力 ≈ 25000 条/秒

注意:
实际性能还取决于集群资源

使用场景 #

推荐使用默认值的场景 #

  • 标准生产: ISM 操作频率正常
  • 小规模集群: 节点数量较少
  • 简化管理: 希望简化索引管理

推荐增加分片的场景 #

  • 高频操作: ISM 策略执行非常频繁
  • 大数据量: 历史记录量很大
  • 多节点集群: 有足够节点分配分片

推荐减少分片的场景 #

  • 低频操作: ISM 操作不频繁
  • 小数据量: 历史记录量不大
  • 资源受限: 节点资源有限

分片数规划 #

确定合适的分片数

步骤 1: 评估数据量

每小时产生多少条历史记录?
低频: < 1000 条/小时
中频: 1000-10000 条/小时
高频: > 10000 条/小时


步骤 2: 评估写入性能

单分片能处理多少写入?
通常: 5000-15000 条/秒


步骤 3: 确定分片数

分片数 ≈ 峰值写入量 / 单分片能力

例如: 峰值 30000 条/秒
分片数 = 30000 / 10000 = 3


步骤 4: 考虑节点数

分片数 ≤ 节点数
确保每个分片能分配到不同节点


步骤 5: 预留增长空间

当前需求 × 1.5 = 推荐分片数
为未来增长预留空间

分片数限制 #

分片数的实际限制

节点数限制:
分片数最好 ≤ 数据节点数
确保每个分片有独立的资源


JVM 内存限制:
每个分片占用 JVM 内存
过多分片可能导致内存压力


管理复杂度:
分片数越多,管理越复杂
通常建议不超过 10 个


历史索引特点:
写多读少
主要用于审计和故障排查
不需要过多分片

注意事项 #

  1. 默认值: 默认值为 1,适合大多数场景。

  2. 不可减少: 已创建索引的分片数不能减少。

  3. 生效时机: 配置只对新创建或滚动的索引生效。

  4. 与副本数配合: 总分片数 = 主分片数 × (1 + 副本数)。

  5. 资源占用: 每个分片会占用内存和文件句柄。

  6. 查询性能: 适当分片可以提高查询并发度。

  7. 动态更新: 支持动态更新,下次滚动时生效。

  8. 隐藏索引: 历史索引是隐藏索引,不占用命名空间。

  9. 写入特点: 历史索引主要是追加写入,很少更新。

  10. 监控建议: 监控各分片的写入性能和大小分布。