【Elasticsearch从入门到精通】第36篇:Elasticsearch集群API——节点类型、信息查询与动态配置
上一篇【第35篇】Elasticsearch CAT API完全指南——集群状态可视化查看下一篇【第37篇】Elasticsearch集群路由与分片管理——Reroute API详解摘要Elasticsearch集群的日常运维离不开一系列集群管理API。与上一篇CAT API侧重查看不同集群API不仅能读取集群状态信息还能动态修改集群配置——无需重启节点即可调整参数。本文首先讲解节点过滤表达式_local/_master/_coordinating/节点名称/角色过滤让你能精确指定API的目标节点。然后系统梳理七种节点类型master eligible/data/coordinating/ingest/machine learning/remote_cluster_client/transform的职责与配置要点。接下来详解集群信息查询五大API_cluster/health健康状态/_cluster/state元数据/_cluster/stats统计信息/_nodes节点信息/_nodes/hot_threads热点线程最后深入讲解动态更新集群设置persistent持久性 vstransient临时性并通过实战案例演示动态调整集群参数而不重启服务的完整工作流。关键词集群API、节点类型、动态设置、集群健康、熔断器。一、节点过滤表达式1.1 为什么需要节点过滤在多节点集群中很多API如_nodes/stats、_nodes/info返回所有节点的信息。当集群节点很多时全量返回既慢又难定位问题。节点过滤表达式让你精确指定要查询的节点。1.2 过滤表达式语法表达式含义示例_local当前接收请求的节点GET _nodes/_local_master当前主节点GET _nodes/_master_coordinating仅协调节点非数据节点、非主节点GET _nodes/_coordinating节点名称指定名称的节点GET _nodes/es-node-01逗号分隔多个节点GET _nodes/es-node-01,es-node-02通配符*模式匹配GET _nodes/es-node-*data:true数据节点GET _nodes/data:truemaster:truemaster eligible节点GET _nodes/master:trueingest:trueingest节点GET _nodes/ingest:true1.3 使用示例# 查看当前主节点的信息curl-slocalhost:9200/_nodes/_master|jq# 查看所有数据节点的统计信息curl-slocalhost:9200/_nodes/data:true/stats|jq# 查看指定节点的操作系统信息curl-slocalhost:9200/_nodes/es-node-01,es-node-02/info/os|jq节点过滤还可以组合使用# 同时查看当前节点和主节点curl-slocalhost:9200/_nodes/_local,_master/stats二、节点类型详解2.1 七种节点类型概览Elasticsearch节点可以同时承担多种角色但生产环境中推荐职责分离节点类型角色配置职责资源需求Master Eligiblenode.master: true参与主节点选举、集群元数据管理低CPU/内存Datanode.data: true存储数据、执行CRUD和搜索操作高CPU/内存/磁盘Coordinating仅搜索负载均衡分发搜索请求、合并结果中CPU/内存Ingestnode.ingest: true执行ingest pipeline预处理中CPUMachine Learningxpack.ml.enabled: true运行ML作业异常检测等高CPU/内存Remote Cluster Clientnode.remote_cluster_client: true连接远程集群跨集群搜索低CPU/内存Transformnode.transform: true运行continuous transform任务中CPU/内存2.2 Master Eligible节点主候选节点参与集群管理。Elasticsearch通过选举产生一个主节点Active Master负责创建/删除索引分配分片到节点维护集群状态元数据监控节点加入和离开# elasticsearch.ymlnode.roles:[master]# 或旧版写法# node.master: true# node.data: false# node.ingest: false生产建议至少3个master eligible节点组成奇数节点集以确保选举的容错性。2.3 Data节点数据节点负责存储索引数据和处理数据相关的操作索引、搜索、聚合node.roles:[data]生产建议大量磁盘空间SSD优先充足的堆内存不要在数据节点上运行ingest pipeline避免影响搜索性能2.4 Coordinating Only节点纯粹的协调节点也叫负载均衡节点不存储数据也不参与选举只负责接收请求、分发到数据节点、合并结果node.roles:[]# 空数组表示纯粹协调节点# 旧版写法# node.master: false# node.data: false# node.ingest: false适用场景集群规模较大数据节点多时用协调节点减轻数据节点的搜索分发压力对外提供统一的API入口2.5 Ingest节点Ingest节点在文档索引之前执行预处理pipeline如字段重命名、格式转换、数据富化node.roles:[ingest]如果不设置任何节点为ingest节点数据节点将默认承担ingest任务。2.6 节点角色组合建议集群规模推荐节点组合小型10节点master data ingest单节点多角色中型10-50节点3个master节点 data节点 2个ingest节点大型50节点3个master节点 data节点 2个ingest节点 协调节点三、查看集群信息3.1 _cluster/health——集群健康状态_cluster/health是使用频率最高的集群API返回集群级别的健康摘要curl-slocalhost:9200/_cluster/health?pretty{cluster_name:my-application,status:yellow,timed_out:false,number_of_nodes:3,number_of_data_nodes:2,active_primary_shards:150,active_shards:295,relocating_shards:0,initializing_shards:0,unassigned_shards:5,delayed_unassigned_shards:0,number_of_pending_tasks:0,number_of_in_flight_fetch:0,task_max_waiting_in_queue_millis:0,active_shards_percent_as_number:98.3}常用参数# 查看指定索引的健康状态curl-slocalhost:9200/_cluster/health/logs,product?pretty# 查看更详细的级别包含shard级别信息curl-slocalhost:9200/_cluster/health?levelshardsprettystatus字段详解状态含义处理建议green所有主分片和副本分片都已分配正常无需处理yellow所有主分片已分配部分副本未分配排查副本未分配原因red至少一个主分片未分配紧急处理数据可能不可访问3.2 _cluster/state——集群元数据与路由表_cluster/state返回集群的完整元数据数据量较大# 查看集群状态的元数据部分curl-slocalhost:9200/_cluster/state/metadata?pretty# 查看集群状态的路由表curl-slocalhost:9200/_cluster/state/routing_table?pretty# 查看集群状态的路由节点信息curl-slocalhost:9200/_cluster/state/routing_nodes?pretty# 查看指定索引的元数据curl-slocalhost:9200/_cluster/state/metadata/logs,product?pretty# 查看集群的master_node和版本信息curl-slocalhost:9200/_cluster/state/version,master_node?pretty注意_cluster/state返回的数据量可能非常大数百MB在生产环境要谨慎使用建议通过filter_path限制返回字段curl-slocalhost:9200/_cluster/state?filter_pathmetadata.indices.*.settings.number_of_shardspretty3.3 _cluster/stats——集群级别统计信息_cluster/stats提供整个集群的汇总统计数据curl-slocalhost:9200/_cluster/stats?pretty{cluster_name:my-application,cluster_uuid:abc123,version:8.12.0,indices:{count:15,shards:{total:150,primaries:75,replication:1.0,index:{shards:{min:2,max:10,avg:5.0},primaries:{min:1,max:5,avg:2.5},replication:{min:1.0,max:1.0,avg:1.0}}},docs:{count:2500000,deleted:50000},store:{size_in_bytes:5368709120,total_data_set_size_in_bytes:10737418240}},nodes:{count:{total:3,data:2,coordinating_only:0,master:3,ingest:2},os:{available_processors:24,allocated_processors:24,mem:{total_in_bytes:34359738368}},jvm:{max_uptime_in_millis:604800000,mem:{heap_used_in_bytes:8589934592,heap_max_in_bytes:17179869184}}}}适用场景获取集群的整体数据概况文档总量、索引数量、分片数量、JVM堆使用率等常用于容量规划和监控大盘。3.4 _nodes——节点详细信息_nodes端点提供节点的详细信息有两个子端点_nodes/stats——节点统计信息# 所有节点的统计信息curl-slocalhost:9200/_nodes/stats?pretty# 指定统计类别减少返回数据量curl-slocalhost:9200/_nodes/stats/jvm,os,process?pretty# 指定节点curl-slocalhost:9200/_nodes/es-node-01/stats/indices?pretty主要统计类别类别内容indices索引操作统计索引/搜索/合并/刷新jvmJVM内存、GC、线程信息os操作系统CPU、内存、文件描述符process进程CPU、内存、打开文件数fs文件系统IO统计transport节点间通信统计httpHTTP连接统计breakers断路器状态thread_pool线程池统计_nodes/info——节点元信息# 查看节点的配置和版本信息curl-slocalhost:9200/_nodes/info?pretty# 查看节点的操作系统信息curl-slocalhost:9200/_nodes/info/os?pretty# 查看节点的插件信息curl-slocalhost:9200/_nodes/info/plugins?pretty_nodes/hot_threads——热点线程排查当集群响应变慢时hot_threadsAPI帮助定位哪个线程在消耗CPU# 查看当前节点的热点线程curl-slocalhost:9200/_nodes/hot_threads# 查看所有节点的热点线程curl-slocalhost:9200/_nodes/_all/hot_threads# 只显示前5个热点线程curl-slocalhost:9200/_nodes/hot_threads?threads5# 指定时间间隔curl-slocalhost:9200/_nodes/hot_threads?interval500ms输出示例文本格式类似线程栈::: {es-node-01}{abc123}{192.168.1.10:9300} Hot threads at 2026-05-22T10:30:00.000Z, interval500ms, busiestThreads3, ignoreIdleThreadstrue: 75.2% (472ms out of 500ms) cpu usage by thread elasticsearch[es-node-01][search][T#10] org.elasticsearch.search.query.QueryPhase.execute(QueryPhase.java:123) org.elasticsearch.search.SearchService.executeQueryPhase(SearchService.java:456) org.elasticsearch.action.search.SearchTransportService$5.run(SearchTransportService.java:789) 15.3% (76ms out of 500ms) cpu usage by thread elasticsearch[es-node-01][write][T#5] org.elasticsearch.index.engine.InternalEngine.flush(InternalEngine.java:234) org.elasticsearch.index.shard.IndexShard.flush(IndexShard.java:567)3.5 五大集群信息API对比API返回内容数据量典型用途_cluster/health集群健康摘要小健康检查、监控_cluster/state完整元数据和路由表大深度排查、调试_cluster/stats集群级汇总统计中容量规划、大盘_nodes/stats节点级运行统计中~大性能分析、资源监控_nodes/info节点配置和版本信息中版本管理、插件查看四、动态更新集群设置4.1 两种设置级别Elasticsearch的集群设置分为两个级别级别作用域持久性APIpersistent集群重启后保留永久直到被覆盖或显式删除PUT _cluster/settingstransient集群重启后失效临时重启后消失PUT _cluster/settings当persistent和transient设置了同一个键时transient的值优先。transient设置特别适合临时调试和应急处理。4.2 基本操作读取当前设置curl-slocalhost:9200/_cluster/settings?prettycurl-slocalhost:9200/_cluster/settings?include_defaultstruepretty设置persistent参数curl-XPUTlocalhost:9200/_cluster/settings?pretty-HContent-Type: application/json-d{ persistent: { cluster.routing.allocation.enable: all } }设置transient参数curl-XPUTlocalhost:9200/_cluster/settings?pretty-HContent-Type: application/json-d{ transient: { cluster.routing.allocation.enable: primaries } }同时设置两个级别curl-XPUTlocalhost:9200/_cluster/settings?pretty-HContent-Type: application/json-d{ persistent: { cluster.max_shards_per_node: 1000 }, transient: { cluster.routing.rebalance.enable: none } }删除设置将值设为null即可删除curl-XPUTlocalhost:9200/_cluster/settings?pretty-HContent-Type: application/json-d{ transient: { cluster.routing.rebalance.enable: null } }4.3 常见动态调整场景场景一控制分片重平衡在节点重启或维护期间关闭自动重平衡以避免不必要的分片移动# 关闭重平衡curl-XPUTlocalhost:9200/_cluster/settings?pretty-HContent-Type: application/json-d{ transient: { cluster.routing.rebalance.enable: none } }# 维护完成后恢复curl-XPUTlocalhost:9200/_cluster/settings?pretty-HContent-Type: application/json-d{ transient: { cluster.routing.rebalance.enable: all } }rebalance.enable的可选值值含义all允许所有类型的重平衡默认primaries只重平衡主分片replicas只重平衡副本分片none关闭重平衡场景二分片分配过滤将特定索引的分片限制分配到特定节点上如冷热分离架构# 给节点打标签在elasticsearch.yml中配置或通过节点属性设置# node.attr.box_type: hot# 通过集群设置限制分片分配curl-XPUTlocalhost:9200/_cluster/settings?pretty-HContent-Type: application/json-d{ persistent: { cluster.routing.allocation.include.box_type: hot,warm, cluster.routing.allocation.exclude.box_type: cold } }也可以在索引级别设置curl-XPUTlocalhost:9200/logs/_settings?pretty-HContent-Type: application/json-d{ index.routing.allocation.require.box_type: hot }分配过滤规则规则含义include分片可以分配到匹配的节点白名单exclude分片不能分配到匹配的节点黑名单require分片必须分配到匹配的节点强制场景三调整熔断器阈值熔断器Circuit Breaker防止JVM堆内存溢出。当请求占用的内存超过阈值时熔断器会拒绝请求并返回429错误。# 查看当前熔断器状态curl-slocalhost:9200/_nodes/stats/breakers?pretty调整熔断器阈值通常不建议修改仅在特殊情况下curl-XPUTlocalhost:9200/_cluster/settings?pretty-HContent-Type: application/json-d{ persistent: { indices.breaker.total.limit: 70% } }主要熔断器类型熔断器配置键默认值说明Parentindices.breaker.total.limit70% of JVM heap所有请求的总量上限Requestindices.breaker.request.limit60% of JVM heap单个请求聚合/搜索的上限Field dataindices.breaker.fielddata.limit40% of JVM heapfielddata缓存的上限In flight requestsnetwork.breaker.inflight_requests.limit100MB正在传输的请求体上限场景四调整分片分配感知当节点分布在不同机架或可用区时启用分配感知以提高容灾能力curl-XPUTlocalhost:9200/_cluster/settings?pretty-HContent-Type: application/json-d{ persistent: { cluster.routing.allocation.awareness.attributes: rack_id } }同时需要在elasticsearch.yml中配置每个节点的rack_id属性。场景五限制每节点最大分片数防止分片过多导致集群不稳定curl-XPUTlocalhost:9200/_cluster/settings?pretty-HContent-Type: application/json-d{ persistent: { cluster.max_shards_per_node: 1000 } }Elasticsearch 7.x默认值为10008.x默认为1000。如果创建索引时单节点分片数会超过此限制创建请求会被拒绝。4.4 常见集群设置速查表设置键默认值说明cluster.routing.allocation.enableall分片分配开关cluster.routing.rebalance.enableall分片重平衡开关cluster.max_shards_per_node1000每节点最大分片数cluster.routing.allocation.awareness.attributes-分配感知属性cluster.routing.allocation.exclude._ip-排除指定IP的节点cluster.routing.allocation.exclude._name-排除指定名称的节点indices.breaker.total.limit70%总熔断器阈值indices.breaker.request.limit60%请求熔断器阈值indices.fielddata.cache.sizeunboundedfielddata缓存上限五、实战动态调整集群参数而不重启服务场景描述生产环境中节点es-node-02磁盘使用率已达到88%即将触发Elasticsearch的自动保护机制。需要在不重启服务的情况下完成以下操作排除该节点上的新分片分配迁移该节点上的现有分片到其他节点磁盘空间释放后恢复实操步骤第一步确认当前状态curl-slocalhost:9200/_cat/allocation?vbytesgbcurl-slocalhost:9200/_cat/nodes?vhip,name,heap.percent,disk.used_percent第二步排除目标节点的分片分配使用transient临时设置curl-XPUTlocalhost:9200/_cluster/settings?pretty-HContent-Type: application/json-d{ transient: { cluster.routing.allocation.exclude._name: es-node-02 } }此设置会触发Elasticsearch自动将es-node-02上的分片迁移到其他节点。第三步等待分片迁移完成监控进度# 查看分片迁移状态curl-slocalhost:9200/_cat/recovery?v|grep-vdone# 查看集群健康状态curl-slocalhost:9200/_cat/health?v第四步迁移完成后清理磁盘空间删除旧索引、清理日志等第五步磁盘空间充足后移除排除规则curl-XPUTlocalhost:9200/_cluster/settings?pretty-HContent-Type: application/json-d{ transient: { cluster.routing.allocation.exclude._name: null } }第六步确认分片重新均衡完成curl-slocalhost:9200/_cat/health?vcurl-slocalhost:9200/_cat/shards?v|grepUNASSIGNED关键要点整个过程中集群始终保持可用状态这就是动态配置的核心价值。使用transient级别确保如果操作过程中出了问题重启节点可以恢复到之前的配置。六、总结与最佳实践核心要点回顾节点过滤表达式_local/_master/节点名/角色过滤让你精确指定API的目标节点七种节点类型各有职责生产环境推荐职责分离至少3个master eligible节点五大集群信息API覆盖从健康检查到性能排查的各种场景**_nodes/hot_threads**是排查CPU问题的利器能直接看到哪个线程在消耗资源动态设置分persistent和transient两级transient适合临时调试persistent适合永久配置分片分配过滤是实现冷热分离和节点维护的核心机制最佳实践建议优先使用transient设置进行调试临时关闭rebalance或排除节点时用transient避免操作失误永久生效操作前先读取当前设置GET _cluster/settings查看当前值避免覆盖已有配置设置完transient参数后要做记录transient在重启后丢失需要文档化记录节点维护的标准流程exclude节点 → 等待迁移 → 维护 → 清除exclude → 等待均衡不要频繁修改熔断器阈值熔断器是保护机制出现频繁触发说明应该优化查询或扩容用CAT API配合集群APICAT API快速扫读集群API获取详细信息两者互补上一篇【第35篇】Elasticsearch CAT API完全指南——集群状态可视化查看下一篇【第37篇】Elasticsearch集群路由与分片管理——Reroute API详解