ES常用操作和经典case整理

文章目录

    • 1 集群操作
      • 1.1 获取集群状态
      • 1.2 获取异常的索引
    • 2 索引操作
      • 2.1 查看索引,查看状态为yellow
      • 2.2 查看索引,按照索引名称排序
      • 2.3 查看索引,按照文档数量排序
      • 2.4 查看索引,按照存储大小排序
      • 2.5 查看索引,按照内存大小排序
    • 3 单个索引操作
      • 3.1 查看单个索引,查看数据内容
      • 3.2 查看单个索引,查看数据内容,根据条件过滤
      • 3.3 查看单个索引,查看数据内容,根据条件过滤,分页
      • 3.4 查看单个索引,查看数据内容,根据条件过滤,按照条件排序
      • 3.5 查看单个索引,查看数据内容,根据条件过滤,按照条件排序, explain原因
      • 3.6 查看单个索引,聚合指标,根据tag排序,获取文档数量排序
      • 3.7 查看单个索引,获取segment情况
    • 4 删除索引
      • 4.1 删除索引
      • 4.2 删除索引中的文档数据
      • 4.3 执行forcemerge,释放磁盘
      • 4.4 查看merge情况
      • 4.5 查看merge任务情况
    • 5 分片操作
      • 5.1 查看分片,按照索引名称排序
      • 5.2 查看分片,按照文档数量排序
    • 5.2 查看分片,按照存储大小排序
      • 5.3 查看分片,获取没有分配原因
    • 6 节点操作
      • 6.1获取节点的磁盘信息
      • 6.2 查看es的磁盘水位配置
        • 6.2.1 低警戒水位线——默认为磁盘容量的85%。
        • 6.2.2 高警戒水位线——默认为磁盘容量的90%。
        • 6.2.3 洪水警戒水位线——默认为磁盘容量的95%
      • 6.3 设置磁盘使用率水位
      • 6.6 获取es索引只读
      • 6.7 取消只读限制
      • 6.8 触发重新分配
      • 6.9 调整es的同步参数
    • 7 常见场景
      • 7.1 磁盘使用率过高,需要删除索引或者文档以降低磁盘使用率
      • 7.2 删除文档后,磁盘使用率没有下降
      • 7.3 磁盘曾经被打满,但是使用率恢复后,es依然提示readonly
    • 参考文档

1 集群操作

1.1 获取集群状态

curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/_cluster/health?pretty'

1.2 获取异常的索引

如果1.1中获取的集群的状态不是green,而是yellow或者red,则需要获取异常的索引从而进行修复

curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/_cat/indices?v&health=yellow'

2 索引操作

h= 过滤所需要需要操作的列
s= 进行聚合,排序等操作

2.1 查看索引,查看状态为yellow

curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/_cat/indices?v&health=yellow'

2.2 查看索引,按照索引名称排序

curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/_cat/indices/?v&s=index'
curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/_cat/indices/?v&s=index:desc'

2.3 查看索引,按照文档数量排序

curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/_cat/indices?v&s=docs.count'
curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/_cat/indices?v&s=docs.count:desc'

2.4 查看索引,按照存储大小排序

curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/_cat/indices?v&s=store.size'
curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/_cat/indices?v&s=store.size:desc'

2.5 查看索引,按照内存大小排序

curl -XGET 'Content-Type: application/json' 'http://localhost:9200/_cat/indices?v&h=health,index,pri,rep,docs.count,docs.deleted,store.size,pri.store.size,tm&s=tm'
curl -XGET 'Content-Type: application/json' 'http://localhost:9200/_cat/indices?v&h=health,index,pri,rep,docs.count,docs.deleted,store.size,pri.store.size,tm&s=tm:desc'

3 单个索引操作

3.1 查看单个索引,查看数据内容

默认输出10行doc

curl -XGET 'Content-Type: application/json' 'http://localhost:9200/index@2022-04-30/_search?pretty'

可以看到一行数据的数据格式,以便后续进行和排序和聚合

      {
        "_index" : "index@2022-04-30",
        "_type" : "log",
        "_id" : "7DtddIAB-AGo1nv-abnm",
        "_score" : 1.0,
        "_source" : {
          "application-name" : "app-demo",
          "local-ip" : "x.x.x.x",
          "app-id" : "1",
          "offset" : 263273337,
          "instance-id" : "demo-7cf675695c-56t88",
          "ns-id" : "ns-96a79v5b",
          "source" : "/data/app_std/stdout/logs/sys_log.log",
          "message" : "2022-04-30 16:08:38.695 DEBUG 1 --- [pool-1-thread-1] c.t.c.t.sdk.core.remoting.NettyChannel   : return netty channel: NettyChannel [channel=[id: 0x53ef4f24, L:/x.x.x.x:38528 - R:/x.x.x.x:28000]], serializationId: 1",
          "type" : "log",
          "appgp-id" : "gp-xxx",
          "timestamp_es" : "2022-04-30T16:08:40.678+08:00",
          "@timestamp" : "2022-04-30T08:08:39.081Z",
          "fields" : {
            "pipename" : "pipeline"
          },
          "application-id" : "app-xxxx",
          "cluster-id" : "cluster-xxxx"
        }
      }

3.2 查看单个索引,查看数据内容,根据条件过滤

curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/index@2022-04-30/_search?pretty' -d '
 {
    "query": {
        "term" : { "appgp-id" : "gp-xxx" }
     }
 }'

3.3 查看单个索引,查看数据内容,根据条件过滤,分页

 curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/index@2022-04-30/_search?pretty' -d '
  {
     "from" : 0, 
     "size" : 10,
     "query": {
         "term" : { "appgp-id" : "gp-xxx" }
      }
  }'

3.4 查看单个索引,查看数据内容,根据条件过滤,按照条件排序

curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/index@2022-04-30/_search?pretty' -d '
{
  "from" : 0, 
  "size" : 10,
  "sort" : [
       { "ns-id": "desc" }
   ],
  "query": {
      "term" : { "appgp-id" : "gp-xxx" }
   }
}'

3.5 查看单个索引,查看数据内容,根据条件过滤,按照条件排序, explain原因

curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/index@2022-04-30/_search?pretty' -d '
{
  "from" : 0, 
  "size" : 10,
  "sort" : [
       { "ns-id": "desc" }
   ],
  "explain": true,
  "query": {
      "term" : { "appgp-id" : "gp-xxx" }
   }
}'

3.6 查看单个索引,聚合指标,根据tag排序,获取文档数量排序

gp_by_tags 是聚合出来的新指标,可以任意命名,功能类似myslq的gp by功能

curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/index@2022-04-30/_search?pretty'  -d '
{
  "size" : 1,
  "aggs": {
      "gp_by_tags": { 
        "terms" : { 
           "field" : "appgp-id",
            "order" : { "_count" : "desc" },
            "size": 50
        }
      }
   }
}'

3.7 查看单个索引,获取segment情况

curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/_cat/segments/index@2022-04-30?v&s=prirep,shard'

4 删除索引

4.1 删除索引

直接删除索引,会把整个索引对应的shard从磁盘中直接删除,磁盘的空间会直接释放

curl -XDEL -H 'Content-Type: application/json' 'http://localhost:9200/index@2022-04-30'

4.2 删除索引中的文档数据

执行删除操作后,只是标记索引中的文档为删除状态(后缀增加.del,进行查询后,会自动被merge掉对应的数据),下次出发merge时,会重新拷贝一个seg(不包含被删除的doc),同时.del的seg会被删除,释放磁盘。

scroll_size=5000 一次batch5000
refresh&slices=5 5个切片,增加5个并发
size=1000 1次只删除1000行数据

curl -H 'Content-Type: application/json' 'http://localhost:9200/index@2022-04-30/_delete_by_query?size=138163&scroll_size=500&refresh&slices=5&pretty'  -d '
{
  "query": { 
    "term" : { 
       "appgp-id" : "gp-xxx"
    }
  }
}'

4.3 执行forcemerge,释放磁盘

curl -XPOST -H "Content-Type: application/json" 'http://localhost:9200/index@2022-04-30/_forcemerge?only_expunge_deletes=true&max_num_segments=1&pretty'

4.4 查看merge情况

curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/_cat/indices/?s=segmentsCount:desc&v&h=index,segmentsCount,segmentsMemory,memoryTotal,mergesCurrent,mergesCurrentDocs,storeSize,p,r'

4.5 查看merge任务情况

curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/_tasks?detailed=true&actions=*forcemerge'

5 分片操作

5.1 查看分片,按照索引名称排序

curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/_cat/shards/?v&s=index'
curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/_cat/shards/?v&s=index:desc'

5.2 查看分片,按照文档数量排序

curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/_cat/shards?v&s=docs'
curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/_cat/shards?v&s=docs:desc'

5.2 查看分片,按照存储大小排序

curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/_cat/shards?v&s=store'
curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/_cat/shards?v&s=store:desc'

5.3 查看分片,获取没有分配原因

curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/_cat/shards?h=index,shard,prirep,state,unassigned.reason'

6 节点操作

6.1获取节点的磁盘信息

curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/_cat/allocation?v'

6.2 查看es的磁盘水位配置

curl -H 'Content-Type: application/json' -XGET 'http://localhost:9200/_cluster/settings?pretty'

如果没有单独配置,则是按照默认的值进行规则限制

3个关键磁盘使用率水位

6.2.1 低警戒水位线——默认为磁盘容量的85%。
cluster.routing.allocation.disk.watermark.low

Elasticsearch不会将分片分配给使用磁盘超过85%的节点。它也可以设置为绝对字节值(如500mb),以防止Elasticsearch在小于指定的可用空间量时分配分片。此设置不会影响新创建的索引的主分片,或者特别是之前任何从未分配过的分片。

6.2.2 高警戒水位线——默认为磁盘容量的90%。
cluster.routing.allocation.disk.watermark.high 

Elasticsearch将尝试从磁盘使用率超过90%的节点重新分配分片。它也可以设置为绝对字节值,以便在节点小于指定的可用空间量时将其从节点重新分配。此设置会影响所有分片的分配,无论先前是否分配。

6.2.3 洪水警戒水位线——默认为磁盘容量的95%

cluster.routing.allocation.disk.watermark.flood_stage

Elasticsearch对每个索引强制执行只读索引块(index.blocks.read_only_allow_delete)。这是防止节点耗尽磁盘空间的最后手段。一旦有足够的可用磁盘空间允许索引操作继续,就必须手动释放索引块。

6.3 设置磁盘使用率水位

curl -XPUT -H 'Content-Type: application/json' 'http://localhost:9200/_cluster/settings?pretty' -d '{
"transient" : {
    "cluster.routing.allocation.disk.watermark.low": "60%",
    "cluster.routing.allocation.disk.watermark.high" : "70%",
    "cluster.info.update.interval" : "1m",
	"cluster.routing.allocation.disk.watermark.flood_stage": "80%"
    }
}'

6.6 获取es索引只读

当磁盘的使用率 洪水警戒水位线 后,es会自己将索引设置为只读,以达到自我保护。并且磁盘使用率恢复后,也不会自动恢复,需要人工进行恢复

curl -XGET -H 'Content-Type: application/json' 'http://localhost:9200/_all/_settings?pretty'|grep '"read_only_allow_delete" : "true"'

6.7 取消只读限制

磁盘使用率恢复后,需要人工取消只读配置,否则es依然无法正常写入数据

curl -XPUT -H "Content-Type: application/json" http://localhost:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'

6.8 触发重新分配

如果部分索引/shard异常,并且超出分配的重试次数后,系统仍然不能恢复。 则需要人工重新触发重新分配,以达到恢复的目的

curl -H 'Content-Type: application/json' -XPOST http://localhost:9200/_cluster/reroute?retry_failed=true

6.9 调整es的同步参数

希望加速集群恢复速度、任务的处理能力

curl -XPUT  'http://localhost:9202/_cluster/settings'   -H 'Content-Type: application/json' -d '{
  "transient": {
    "cluster.routing.allocation.cluster_concurrent_rebalance": "50",
    "cluster.routing.allocation.node_concurrent_recoveries": "50",
    "cluster.routing.allocation.node_initial_primaries_recoveries": "50",
    "indices.recovery.max_bytes_per_sec": "400mb"
  }
}'

7 常见场景

7.1 磁盘使用率过高,需要删除索引或者文档以降低磁盘使用率

  1. 按照存储大小排序找到磁盘占用率最高的索引,并针对索引进行删除或者删除文档操作
  2. 根据实际情况,删除磁盘磁盘使用率过高的索引,释放磁盘。
  3. 根据实际情况,如果不能直接删除索引,而根据需要删除索引中的文档数据,并进行执行forcemerge,释放磁盘

7.2 删除文档后,磁盘使用率没有下降

  1. 文档的删除过程,并没有直接从磁盘进行删除数据。而是讲需要删除的文档进行标记.del
  2. 删除后的文档依然可以查询,但是在会被过滤掉,因此对于客户端来说,无法查看数据,但是实际的磁盘使用率没有下降
  3. 需要等待下次merge后,会将对应的segment复制一个新的出来(不包含已经删除的文档),并将老的segment删除,这时才会释放磁盘
  4. 如果想快速释放磁盘,可以执行forcemerge,释放磁盘

7.3 磁盘曾经被打满,但是使用率恢复后,es依然提示readonly

  1. 当磁盘的使用率超出洪水警戒水位线——默认为磁盘容量的95%
  2. es会自动设置readonly以进行自我保护,可以通过获取es索引只读获取状态。
  3. 如果磁盘的使用率已经恢复,则需要人工进行设置取消只读限制,集群才能恢复可写。
  4. 通常情况下,磁盘恢复的时间比较慢,因此会有部分索引还是不正常的,需要人工触发索引重新分配,从而自动恢复

参考文档

  1. 官方文档

你可能感兴趣的:(ES,中间件,es)