--- title: "查询分片" date: 2026-03-14 lastmod: 2026-03-14 description: "介绍如何使用 Cat API 查询集群中所有索引的分片状态和统计信息。" tags: ["Cat API", "分片", "监控", "索引管理"] summary: "此 API 用于显示集群中所有索引的分片状态和详细统计信息。 API # GET /_cat/shards GET /_cat/shards/{index} API 的作用 # 返回集群中所有分片的状态和统计信息,包括: 分片基本信息:索引名称、分片 ID、主副分片标识、状态 文档统计:分片中的文档数量 存储信息:分片存储大小 节点信息:分片所在节点的 IP 和名称 操作统计:索引、查询、刷新、合并等操作的计数和耗时 缓存统计:查询缓存、字段数据缓存等 段统计:段数量、内存使用等 API 的参数 # 路由参数 # 参数 类型 是否必需 描述 index string 可选 索引名称 支持逗号分隔多个索引 支持通配符 * 查询字符串参数 # 参数 类型 是否必需 默认值 描述 bytes string 可选 自动 字节显示单位" --- 此 API 用于显示集群中所有索引的分片状态和详细统计信息。 ## API ``` GET /_cat/shards GET /_cat/shards/{index} ``` ## API 的作用 返回集群中所有分片的状态和统计信息,包括: - **分片基本信息**:索引名称、分片 ID、主副分片标识、状态 - **文档统计**:分片中的文档数量 - **存储信息**:分片存储大小 - **节点信息**:分片所在节点的 IP 和名称 - **操作统计**:索引、查询、刷新、合并等操作的计数和耗时 - **缓存统计**:查询缓存、字段数据缓存等 - **段统计**:段数量、内存使用等 ## API 的参数 ### 路由参数 | 参数 | 类型 | 是否必需 | 描述 | |------|------|----------|------| | `index` | string | 可选 | 索引名称
支持逗号分隔多个索引
支持通配符 `*` | ### 查询字符串参数 | 参数 | 类型 | 是否必需 | 默认值 | 描述 | |------|------|----------|--------|------| | `bytes` | string | 可选 | 自动 | 字节显示单位
可选值:`b`, `kb`, `mb`, `gb`, `tb`, `pb` | | `format` | string | 可选 | text | 响应格式
可选值:`json`, `yaml`, `text` | | `h` | string | 可选 | 默认列 | 指定显示的列,逗号分隔 | | `help` | boolean | 可选 | false | 显示帮助信息 | | `local` | boolean | 可选 | false | 是否从本地节点获取信息 | | `master_timeout` | time | 可选 | 30s | 等待主节点响应的超时时间 | | `s` | string | 可选 | - | 排序列,支持 `:asc` 和 `:desc` | | `size` | string | 可选 | 原始 | 计数显示单位
可选值:`k`, `m`, `g`, `t`, `p` | | `time` | string | 可选 | ms | 时间显示单位
可选值:`nanos`, `micros`, `ms`, `s`, `m`, `h`, `d` | | `v` | boolean | 可选 | false | 详细模式,显示列头 | ## 返回的字段信息 ### 默认显示字段 | 列名 | 描述 | |------|------| | `index` | 索引名称 | | `shard` | 分片 ID | | `prirep` | 主副分片标识(p=primary, r=replica) | | `state` | 分片状态(STARTED、UNASSIGNED、INITIALIZING、RELOCATING) | | `docs` | 分片中的文档数量 | | `store` | 分片存储大小 | | `ip` | 分片所在节点的 IP 地址 | | `node` | 分片所在节点的名称 | ### 可选显示字段 | 列名 | 描述 | |------|------| | `sync_id` | 同步 ID | | `unassigned.reason` | 分片未分配的原因 | | `unassigned.at` | 分片未分配的时间 | | `unassigned.for` | 分片未持续的时长 | | `completion.size` | 完成字段的大小 | | `fielddata.memory_size` | 字段数据缓存内存大小 | | `fielddata.evictions` | 字段数据驱逐次数 | | `query_cache.memory_size` | 查询缓存内存大小 | | `query_cache.evictions` | 查询缓存驱逐次数 | | `flush.total` | 刷新操作总数 | | `flush.total_time` | 刷新操作总耗时 | | `get.current` | 当前 get 操作数 | | `get.time` | get 操作耗时 | | `get.total` | get 操作总数 | | `get.exists_time` | 成功 get 操作耗时 | | `get.exists_total` | 成功 get 操作总数 | | `get.missing_time` | 失败 get 操作耗时 | | `get.missing_total` | 失败 get 操作总数 | | `indexing.delete_current` | 当前删除操作数 | | `indexing.delete_time` | 删除操作耗时 | | `indexing.delete_total` | 删除操作总数 | | `indexing.index_current` | 当前索引操作数 | | `indexing.index_time` | 索引操作耗时 | | `indexing.index_total` | 索引操作总数 | | `indexing.index_failed` | 索引失败操作数 | | `merges.current` | 当前合并操作数 | | `merges.current_docs` | 当前合并的文档数 | | `merges.current_size` | 当前合并的大小 | | `merges.total` | 合并操作总数 | | `merges.total_time` | 合并操作总耗时 | | `refresh.total` | 刷新操作总数 | | `refresh.time` | 刷新操作耗时 | | `refresh.external_total` | 外部刷新操作总数 | | `refresh.external_time` | 外部刷新操作耗时 | | `refresh.listeners` | 待处理的刷新监听器数 | | `search.fetch_current` | 当前获取阶段操作数 | | `search.fetch_time` | 获取阶段耗时 | | `search.fetch_total` | 获取操作总数 | | `search.open_contexts` | 开放的搜索上下文 | | `search.query_current` | 当前查询阶段操作数 | | `search.query_time` | 查询阶段耗时 | | `search.query_total` | 查询操作总数 | | `search.scroll_current` | 开放的滚动上下文 | | `search.scroll_time` | 滚动上下文保持时间 | | `search.scroll_total` | 完成的滚动上下文数 | | `segments.count` | 段数量 | | `segments.memory` | 段内存使用 | | `segments.index_writer_memory` | 索引写入器内存使用 | | `segments.version_map_memory` | 版本图内存使用 | | `segments.fixed_bitset_memory` | 固定位集内存使用 | | `seq_no.max` | 最大序列号 | | `seq_no.local_checkpoint` | 本地检查点 | | `seq_no.global_checkpoint` | 全局检查点 | | `warmer.current` | 当前预热操作数 | | `warmer.total` | 预热操作总数 | | `warmer.total_time` | 预热操作总耗时 | | `path.data` | 分片数据路径 | | `path.state` | 分片状态路径 | ## 分片状态说明 | 状态 | 描述 | |------|------| | `STARTED` | 分片已启动并正常运行 | | `UNASSIGNED` | 分片未分配到任何节点 | | `INITIALIZING` | 分片正在初始化 | | `RELOCATING` | 分片正在迁移到其他节点 | ## 请求示例 ```bash # 查询所有分片 GET /_cat/shards # 显示列头 GET /_cat/shards?v # 查询指定索引的分片 GET /_cat/shards/my-index # 查询多个索引的分片 GET /_cat/shards/index1,index2 # 使用通配符查询 GET /_cat/shards/logs-* # 使用 JSON 格式 GET /_cat/shards?format=json # 只显示特定列 GET /_cat/shards?h=index,shard,prirep,state,store,node # 按存储大小降序排列 GET /_cat/shards?s=store:desc # 显示未分配的分片 GET /_cat/shards?h=index,shard,prirep,state,unassigned.reason # 显示索引操作统计 GET /_cat/shards?h=index,indexing.index_current,indexing.index_total # 显示段统计信息 GET /_cat/shards?h=index,segments.count,segments.memory ``` ## 响应示例 ### 文本格式(默认) ``` index shard prirep state docs store ip node logs 0 p STARTED 1000 5mb 10.0.1.1 data-node-1 logs 0 r STARTED 1000 5mb 10.0.1.2 data-node-2 logs 1 p STARTED 1200 6mb 10.0.1.2 data-node-2 logs 1 r STARTED 1200 6mb 10.0.1.3 data-node-3 ``` ### JSON 格式 ```json [ { "index": "logs", "shard": "0", "prirep": "p", "state": "STARTED", "docs": "1000", "store": "5mb", "ip": "10.0.1.1", "node": "data-node-1" }, { "index": "logs", "shard": "0", "prirep": "r", "state": "STARTED", "docs": "1000", "store": "5mb", "ip": "10.0.1.2", "node": "data-node-2" } ] ``` ### 未分配分片示例 ``` index shard prirep state docs store ip node test-index 0 p UNASSIGNED - - - - test-index 0 r STARTED 100 1mb ... data-node-1 ``` ## 使用场景 1. **分片状态监控**:检查所有分片是否正常分配 2. **负载均衡检查**:确认主副分片分布是否合理 3. **性能分析**:查看索引、查询等操作的统计信息 4. **存储管理**:监控各分片的存储大小 5. **问题排查**:诊断未分配分片的原因 ## 排查未分配分片 ```bash # 查看未分配分片及原因 GET /_cat/shards?h=index,shard,prirep,state,unassigned.reason,unassigned.details ``` 常见的未分配原因: - `INDEX_CREATED`:索引创建后分片尚未分配 - `CLUSTER_RECOVERED`:集群恢复后的分片 - `NODE_LEFT`:节点离开导致分片未分配 - `ALLOCATION_FAILED`:分片分配失败 ## 性能监控示例 ```bash # 查看索引操作统计 GET /_cat/shards?h=index,indexing.index_current,indexing.index_total,indexing.index_failed # 查看搜索操作统计 GET /_cat/shards?h=index,search.query_current,search.fetch_current # 查看合并操作 GET /_cat/shards?h=index,merges.current,merges.total,merges.total_time # 查看段统计 GET /_cat/shards?h=index,segments.count,segments.memory,segments.index_writer_memory ``` ## 注意事项 1. `local=true` 时可能返回过时信息,但响应更快 2. 通配符 `*` 可以匹配多个索引 3. 分片状态变化频繁,建议实时监控 4. 大量分片时响应时间可能较长 5. 某些字段(如 `docs`)可能显示 `-` 表示不可用 ## 最佳实践 1. **定期检查**:定期检查未分配分片,及时处理 2. **均衡分布**:确保主副分片分布在不同节点 3. **监控性能**:关注索引和查询操作的统计信息 4. **段管理**:监控段数量,定期执行 force_merge 5. **告警设置**:对未分配分片设置告警 ## 相关文档 - [查询分片分配](./get-shard-allocation.md) - [查询分段信息Cat格式](./get-segment-info-cat-format.md) - [查询集群健康](./get-cluster-health-cat-format.md) - [获取索引列表](./get-index-list.md)