--- title: "ISM 历史索引分片数配置" date: 2026-01-23 lastmod: 2026-01-23 description: "index_state_management.history.number_of_shards 配置项用于控制 ISM 历史索引的分片数量。" tags: ["索引状态管理", "ISM", "历史记录", "分片配置"] summary: "配置项作用 # 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` 配置项用于控制**索引状态管理(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 负载均衡: - 数据均匀分布到各分片 - 提高并发写入能力 - 降低单分片压力 ``` ## 配置建议 ## 生产环境(默认) ```yaml index_state_management: history: number_of_shards: 1 # 默认值 ``` **建议**: 保持默认值 `1`。历史索引通常写入量不大。 ## 高频操作环境 ```yaml index_state_management: history: number_of_shards: 3 # 3 个分片 ``` **建议**: 增加到 `2-3`。ISM 操作非常频繁时使用。 ## 大规模集群 ```yaml index_state_management: history: number_of_shards: 2 ``` **建议**: 设置为 `2`。集群节点较多时使用。 ## 测试环境 ```yaml index_state_management: history: number_of_shards: 1 # 简化配置 ``` **建议**: 保持默认值。测试环境使用。 ## 代码示例 ## easysearch.yml 基础配置 ```yaml index_state_management: history: number_of_shards: 1 ``` ## 完整历史配置 ```yaml index_state_management: history: enabled: true number_of_shards: 1 number_of_replicas: 1 max_docs: 2500000 max_age: 24h ``` ## 高性能配置 ```yaml index_state_management: history: number_of_shards: 3 number_of_replicas: 1 ``` ## 动态更新配置 ```json 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. **监控建议**: 监控各分片的写入性能和大小分布。