cat API

我们可以通过 _cat 来查看集群信息,_cat API 支持以下参数:

  • v:展示每一列的列名
  • help:解释每一列的列名含义
  • h:指定只返回某些列
  • format:指定返回的信息格式,通过 format=json 以 JSON 格式输出
  • s:指定字段排序,默认按升序进行排序,格式可以是 s=column1,column2:desc,column3

1. aliases

_cat/aliases 命令用于显示索引的别名,也包括过滤器和路由信息。

  1. alias index filter routing.index routing.search is_write_index
  2. alias1 test1 - - - -
  3. alias2 test1 * - - -
  4. alias3 test1 - 1 1 -
  5. alias4 test1 - 2 1,2 true

如果想只查看某个别名的信息,可以执行 /_cat/aliases/{alias}

2. allocation

_cat/allocation 命令可以查看每个节点分片的分配数量以及它们所使用的磁盘空间大小。

  1. shards disk.indices disk.used disk.avail disk.total disk.percent host ip node
  2. 16 2.3mb 183.9gb 281.6gb 465.6gb 39 127.0.0.1 127.0.0.1 lei.xu
  • disk.indices:索引占用的空间大小
  • disk.used:节点所在机器已使用的磁盘空间大小
  • disk.avail:节点所在机器的可用空间大小
  • disk.total:节点所在机器的总空间大小
  • disk.percent:节点所在机器的磁盘占用百分比

3. count

_cat/count 命令可以快速查询整个集群或单个索引的文档数量。统计的文档数量表示活动文档的数量,不包括尚未被合并进程清除的已删除文档。

  1. epoch timestamp count
  2. 1625636387 05:39:47 77

如果想只查看单个索引的文档数量,可以执行 /_cat/count/{index}

4. health

_cat/health 命令用于显示集群的健康信息,常用于验证节点之间的运行状况是否一致。

  1. epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
  2. 1625636794 05:46:34 elasticsearch yellow 1 1 16 16 0 0 8 0 - 66.7%
  • node.total:节点总数
  • node.data:数据节点总数
  • shards:总分片数
  • pri:总的主分片数
  • relo:正在迁移的分片数
  • init:正在初始化的分片数
  • unassign:未分配分片的数量
  • pending_tasks:等待的任务数
  • max_task_wait_time:等待任务的最大等待时间
  • active_shards_percent:活动分片占总分片的百分比

还可以将 ts 设为 false 来屏蔽时间戳信息:

  1. curl -X GET "localhost:9200/_cat/health?v&ts=false"

5. indices

_cat/indices 命令可以查看索引信息,包括索引健康状态、索引开关状态、分片数、副本数、文档数量、标记为删除的文档数量、占用的存储空间等信息。

  1. health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
  2. yellow open test i2ISyW0vRP-QXt_6nYDHfQ 1 1 2 0 4.5kb 4.5kb
  3. yellow open twitter KpzW0ao2QlCwZeIZJJywzQ 1 1 18 0 7.1kb 7.1kb
  • pri:索引的主分片数量
  • rep:索引的副本分片数量
  • store.size:主分片+副本分片占用的总的磁盘空间
  • pri.store.size:主分片占用的总的磁盘空间

实际上,这些指标都直接来自于 Lucene 的统计,由于文档和被删除的文档数显示在 Lucene 级别,它包括所有隐藏的文档(例如嵌套的文档)。因此如果要在 Elasticsearch 级别获得文档的实际数量,推荐的方法是使用 _cat/count 来查看。

如果想只查看单个索引的信息,可以执行 /_cat/indices/{index}

6. master

_cat/master 命令可以显示 master 节点的节点 ID、绑定的 IP 和节点名。

  1. id host ip node
  2. 7f-bO8KZQj-bjxa6Wxlt0A 127.0.0.1 127.0.0.1 lei.xu

这些信息也可以通过 _cat/nodes 命令获得,但是如果你想要做的只是验证所有节点是否同意主节点,那么该命令就会稍短一些。

7. nodes

_cat/nodes 命令可以查看集群的拓扑结构。

  1. ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
  2. 127.0.0.1 31 100 12 3.16 cdfhilmrstw * lei.xu
  • heap.percent:节点已使用的堆内存的百分比

  • ram.percent:节点所在机器已使用的机器内存的百分比,该值是按 used/total 计算得出的,并没有把 buff/cache 占用的内存排除在外,所以 100 也算正常

  • cpu:节点所在机器的 CPU 使用率

  • load_1m、load_5m、load_15m:节点所在机器的 1、5、15 分钟的负载

8. pending_tasks

_cat/pending_tasks 命令用于查看正在等待执行的任务。

  1. insertOrder timeInQueue priority source
  2. 1685 855ms HIGH update-mapping [foo][t]
  3. 1686 843ms HIGH update-mapping [foo][t]
  • insertOrder:任务插入的顺序
  • timeInQueue:任务排队等待了多长时间
  • priority:任务优先级
  • source:任务来源

9. plugins

_cat/plugins 命令用于查看已加载的插件列表。

  1. name component version
  2. node-1 sql 5.0.2
  • name:节点名称
  • component:插件名称
  • version:插件版本

10. thread_pool

_cat/thread_pool 命令用于展示集群中每一个节点线程池的统计信息。

  1. node_name name active queue rejected
  2. TD-lei.xul analyze 0 0 0
  3. TD-lei.xul ccr 0 0 0
  4. TD-lei.xul fetch_shard_started 0 0 0
  5. TD-lei.xul fetch_shard_store 0 0 0
  6. TD-lei.xul flush 0 0 0
  • node_name:节点名称
  • name:线程池名称
  • active:活跃线程数
  • queue:线程池任务队列中的任务数
  • rejected:被拒绝的任务数

11. shards

_cat/shards 命令用于查看节点包含的分片信息。

  1. index shard prirep state docs store ip node
  2. my_index 0 p STARTED 2 6.6kb 127.0.0.1 TD-lei.xul
  3. my_index 0 r UNASSIGNED
  4. twitter 0 p STARTED 18 7.1kb 127.0.0.1 TD-lei.xul
  5. twitter 0 r UNASSIGNED
  • index:索引名称
  • shard:分片序号
  • prirep:分片类型,p 表示主分片,r 表示副本分片
  • state:分片状态
  • store:该分片占用的存储空间大小

如果想只查看单个索引的分片信息,可以执行 /_cat/shards/{index}

分片未被分配的可能原因:https://www.elastic.co/guide/en/elasticsearch/reference/7.0/cat-shards.html#reason-unassigned

12. segments

_cat/segments 命令用于查看索引分片的 segment 信息。

  1. index shard prirep ip segment generation docs.count docs.deleted size size.memory committed searchable version compound
  2. twitter 0 p 127.0.0.1 _f 15 18 0 6.8kb 2004 true true 8.8.2 false
  3. my_index 0 p 127.0.0.1 _2 2 2 0 6.3kb 3308 true true 8.8.2 true
  • segment:segment 名称,该名称在内部用于生成此段所属分片目录中的文件名

  • generation:每写入一个 segment,该生成号就加一

  • docs.count:存储在此 segment 中的未删除文档的数量。注意,这些都是 Lucene 文档,所以计数将包括隐藏的文档(例如嵌套类型的文档)。

  • docs.deleted:存储在此 segment 中的已删除文档的数量。

  • size:此 segment 使用的磁盘空间大小

  • size.memory:segment 会将一些数据存储到内存中提高搜索性能,此列显示了所使用的内存大小。

  • committed:该 segment 是否已在磁盘上同步。未提交的数据会存储在事务日志中,以便 Elasticsearch 能够在下次重启时重放。

  • searchable:该 segment 是否可搜索,为 false 很可能意味着该 segment 已被写入磁盘,但此后没有发生刷新以使其可搜索。

  • version:Lucene 版本

  • compound:该 segment 是否存储在复合文件中。当为 true 时,这意味着 Lucene 将来自该 segment 的所有文件合并为一个文件,以减少文件描述符的使用。

如果想只查看单个索引的 segment 信息,可以执行 /_cat/segments/{index}

13. templates

_cat/templates 命令用于查看集群中的模版。

  1. name index_patterns order version composed_of
  2. metrics [metrics-*-*] 100 0 [metrics-mappings, metrics-settings]
  3. logs [logs-*-*] 100 0 [logs-mappings, logs-settings]

cluster API

1. cluster health

通过 _cluster/health 命令可以查看当前集群的健康信息。

  1. {
  2. "cluster_name" : "elasticsearch",
  3. "status" : "yellow",
  4. "timed_out" : false,
  5. "number_of_nodes" : 1,
  6. "number_of_data_nodes" : 1,
  7. "active_primary_shards" : 16,
  8. "active_shards" : 16,
  9. "relocating_shards" : 0,
  10. "initializing_shards" : 0,
  11. "unassigned_shards" : 8,
  12. "delayed_unassigned_shards" : 0,
  13. "number_of_pending_tasks" : 0,
  14. "number_of_in_flight_fetch" : 0,
  15. "task_max_waiting_in_queue_millis" : 0,
  16. "active_shards_percent_as_number" : 66.66666666666666
  17. }

返回结果中各个属性的含义解释如下:

  • number_of_nodes:节点数,包括 master 节点和 data 节点
  • number_of_data_nodes:data 节点数
  • active_primary_shards:活动的主分片
  • active_shards:所有活动的分片数,包括主分片和副本分片
  • relocating_shards:正在发生迁移的分片
  • initializing_shards:正在初始化的分片
  • unassigned_shards:没有被分配的分片
  • delayed_unassigned_shards:延迟未被分配的分片
  • number_of_pending_tasks:master 节点任务队列中的任务数
  • number_of_in_flight_fetch:正在进行迁移的分片数量
  • task_max_waiting_in_queue_millis:队列中任务的最大等待时间
  • active_shards_percent_as_number:活动分片的百分比

上面的命令用于获取整个集群的健康信息,也可以获取一个或多个索引的健康信息,命令如下:

  1. curl -X GET "localhost:9200/_cluster/health/test1,test2?pretty"

此外,通过 level 参数可以指定健康信息的统计级别,可选值为:cluster、indices、shards

  1. curl -X GET "localhost:9200/_cluster/health/twitter?level=shards&pretty"

2. cluster state

通过 _cluster/state 命令可以对整个集群的元信息进行一个全面的了解,包括集群信息、集群中的每个节点的信息、元数据、路由表等。

该命令返回的信息非常多,可以添加以下参数进行过滤处理,只返回部分信息:

  1. /_cluster/state/{metrics}
  2. /_cluster/state/{metrics}/{indices}

其中 metrics 可选值如下:

  • version:返回集群状态版本信息
  • master_node:返回当前的 master 节点信息
  • nodes:返回集群中的节点的配置信息,主要包括节点名称、IP、是否是 master 节点
  • routing_table:返回每个节点的路由信息
  • metadata:返回元数据信息,包括每个索引的 mapping、setting 等信息
  • blocks:返回集群中的块数据信息
    1. curl -X GET "localhost:9200/_cluster/state/metadata,routing_table/foo,bar?pretty"

    3. cluster stats

    通过 _cluster/stats 命令可以从集群中获取各种统计信息。该 API 返回的信息主要有两部分,一部分是索引层面:包括分片数、存储大小、内存使用情况等指标;另一部分是节点层面:包括节点数量、节点角色、操作系统、JVM 版本、内存、CPU、安装的插件等指标。

可以通过 human 参数返回可读性的数据:

  1. curl -X GET "localhost:9200/_cluster/stats?human&pretty"

还可以使用节点筛选器将此 API 限制为节点的子集:

  1. curl -X GET "localhost:9200/_cluster/stats/nodes/node1,node*,master:false?pretty"

4. cluster settings

通过 _cluster/settings 命令可以查看和动态更改集群内的设置

  1. curl -X GET "localhost:9200/_cluster/settings?pretty"

默认情况下,此 API 调用只返回已显式定义的设置,但也可以包括默认设置:

  1. curl -X GET "localhost:9200/_cluster/settings?include_defaults=true&pretty"

对设置的更新可以是持久的,这意味着它们可以在重新启动时应用,也可以是暂时的,在整个集群重新启动时它们不能存活。适用示例如下:

  1. # 持久更新
  2. curl -X PUT "localhost:9200/_cluster/settings?pretty" -H 'Content-Type: application/json' -d'
  3. {
  4. "persistent" : {
  5. "indices.recovery.max_bytes_per_sec" : "50mb"
  6. }
  7. }'
  8. # 暂时更新
  9. curl -X PUT "localhost:9200/_cluster/settings?flat_settings=true&pretty" -H 'Content-Type: application/json' -d'
  10. {
  11. "transient" : {
  12. "indices.recovery.max_bytes_per_sec" : "20mb"
  13. }
  14. }'

集群设置的优先级顺序为:

  1. elasticsearch 中的短暂集群设置
  2. elasticsearch 中的持久集群设置
  3. elasticsearch.yml 配置文件中的设置

最好使用 settings API 设置所有集群范围的设置,并使用 elasticsearch.yml 文件仅用于本地配置。这样就可以确保所有节点上的设置都是相同的。另一方面,如果使用配置文件意外地在不同节点上定义了不同的设置,则很难注意到这些差异。

5. node stats

Cluster Node Stats API 可以获取集群中一个或多个节点的统计信息。

  1. curl -X GET "localhost:9200/_nodes/stats?pretty"
  2. curl -X GET "localhost:9200/_nodes/nodeId1,nodeId2/stats?pretty"

默认情况下会返回所有的统计数据,此外我们还可以指定返回的信息,可选项如下:

  • indices:索引统计信息
  • os:操作系统统计信息,包括平均负载、内存、swap 使用
  • process:进程统计信息,包括内存占用、CPU 使用、打开的文件描述符
  • jvm:JVM 统计信息,包括内存、GC、直接内存使用、类加载
  • thread_pool:每个线程池的统计信息
  • fs:文件系统的统计信息,包括数据存储路径、可用磁盘空间、读写统计
  • transport:对集群通信中发送和接收字节的传输统计
  • http:HTTP 连接信息
  • breakers:内存断路器信息
  • ingest:预处理节点信息,包含 pipeline 和 processes 信息
    1. curl -X GET "localhost:9200/_nodes/stats/os,process?pretty"

    6. tasks

    通过 _tasks 可获取 Elasticsearch 集群中一个或多个节点正在执行中的任务信息
    1. curl -X GET "localhost:9200/_tasks?pretty"
    2. curl -X GET "localhost:9200/_tasks?nodes=nodeId1,nodeId2&pretty"

    7. cluster allocation explain

    Cluster Allocation Explain API 的目的是为集群中的分片分配提供解释。对于未分配的分片,explain API 提供了为什么分片未分配的解释。对于已分配的分片,explain API 解释了为什么分片仍在当前节点上,而没有移动或重新平衡到另一个节点。
    1. curl -X GET "localhost:9200/_cluster/allocation/explain?pretty" -H 'Content-Type: application/json' -d'
    2. {
    3. "index": "twitter",
    4. "shard": 0,
    5. "primary": true
    6. }'
    • index:指定想要解释的分片的索引
    • shard:指定想要解释的分片序号
    • primary:为给定的分片解释主分片还是它的一个副本分片

上面这三个请求参数是可选的,未设置则查询全部索引的全部分片。通过将 include_disk_info 参数设置为 true 还可以返回集群收集的关于磁盘使用情况和分片大小的信息:

  1. curl -X GET "localhost:9200/_cluster/allocation/explain?include_disk_info=true&pretty"

slow log

当遇到查询慢的时候,想知道对方的查询语句是什么,在日志中记录所有查询语句可能会导致日志量太大,因此 ES 允许只将执行慢的请求记录日志,”慢” 的程度可以自己定义。写入慢或查询慢的原因可能会有多种因素,慢日志对于我们诊断这些问题非常有用。

目前 ES 记录了两种类型的慢日志:慢搜索日志和慢索引日志。

慢搜索日志
用来记录哪些查询比较慢, 针对每个节点可以设置不同的阈值。ES 的搜索由两个阶段组成:查询和取回。慢搜索日志给出了每个阶段所花费的时间,以及整个查询内容本身。具体有如下索引级配置项:

  1. index.search.slowlog.threshold.query.warn:
  2. index.search.slowlog.threshold.query.info:
  3. index.search.slowlog.threshold.query.debug:
  4. index.search.slowlog.threshold.query.trace:
  5. index.search.slowlog.threshold.fetch.warn:
  6. index.search.slowlog.threshold.fetch.info:
  7. index.search.slowlog.threshold.fetch.debug:
  8. index.search.slowlog.threshold.fetch.trace:
  9. index.search.slowlog.level:

慢搜索日志可以为查询和取回阶段单独设置以时间为单位的阈值,如果设置为 0 则输出全部搜索日志。在定义好每个级别的时间后,通过 level 决定输出哪个级别的日志。

慢索引日志
用来记录哪些索引操作比较慢,其记录了哪些索引操作耗时比较长,阈值同样可以设置。与慢搜索不同,索引内容可能非常大,因此默认记录源文档内容的前 1000 行。可以设置为捕获整个文档或者不记录原始文档本身。具体有如下索引级配置项:

  1. index.indexing.slowlog.threshold.index.warn:
  2. index.indexing.slowlog.threshold.index.info:
  3. index.indexing.slowlog.threshold.index.debug:
  4. index.indexing.slowlog.threshold.index.trace:
  5. index.indexing.slowlog.level:
  6. index.indexing.slowlog.source:

与慢搜索日志的配置类似,同样可以定义 4 种不同的慢日志级别,为每个级别设置不同的时间,然后通过 level 来决定输出哪个级别的日志。如果阈值设置为 0 则将输出全部索引日志。source 参数设置了在日志中捕获源文档的行数。