ElasticSearch运维手册

0. 介绍

主要介绍了ES常用的在运维过程中可能会用到的一些命令。

1. 查看ES集群中节点信息

查看ES集群中所有节点信息,以及各个节点内存和CPU相关的指标

$ curl -X GET 'http://192.168.5.1:9200/_cat/nodes?v'
ip           heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.5.3           45         100  21   10.89   11.62    10.90 -         -      client_2
192.168.5.2           60          98  24   11.04   10.29    10.73 d         -      data_nos62_2
192.168.5.2           41          98  24   11.04   10.29    10.73 m         -      master_1
192.168.5.3           33         100  21   10.89   11.62    10.90 m         *      master_2
192.168.5.1           73         100  28   13.61   12.06    11.71 d         -      data_nos61_0
192.168.5.3           63         100  21   10.89   11.62    10.90 d         -      data_nos63_2
192.168.5.2           48          98  24   11.04   10.29    10.73 -         -      client_1
192.168.5.2           73          98  24   11.04   10.29    10.73 d         -      data_nos62_0
192.168.5.1           42          99  28   13.61   12.06    11.71 m         -      master_0
192.168.5.3           61         100  21   10.89   11.62    10.90 d         -      data_nos63_0
192.168.5.1           64          99  28   13.61   12.06    11.71 -         -      client_0
192.168.5.1           60         100  28   13.61   12.06    11.71 d         -      data_nos61_2
192.168.5.3           57         100  21   10.89   11.62    10.90 d         -      data_nos63_1
192.168.5.2           66          98  24   11.04   10.29    10.73 d         -      data_nos62_1
192.168.5.1           61         100  28   13.61   12.06    11.71 d         -      data_nos61_1

从上面的请求结果可以看出信息:

  • ES集群总共有3台机器:192.168.5.1、192.168.5.2、192.168.5.3
  • 每个机器部署5个节点:1master + 1client + 3data
  • 还可以看出各个机器的内存和cpu负载的情况

2. 查看ES集群健康状态

查看整个ES集群的状态,以及节点、分片等信息

$ curl -XGET 'http://192.168.5.1:9200/_cluster/health?pretty'  
{
  "cluster_name" : "dg_nos_log",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 15,
  "number_of_data_nodes" : 9,
  "active_primary_shards" : 2027,
  "active_shards" : 2068,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "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" : 100.0
}

其中有关参数意义如下:

  • cluster_name:表示集群名称
  • status:用来标识集群健康状况,green-健康,yellow-亚健康,red-病态,具体含义见后面
  • number_of_nodes:节点数量,包括master、data、client节点
  • number_of_data_nodes:data节点数量
  • active_primary_shards:活跃的主分片数目
  • active_shards:活跃的分片数,包括主、从索引的分片

上面一个比较重要的参数是status,用来标识集群的健康状态,green-健康,yellow-亚健康,red-病态,具体含义是:

  • green:所有的主分片和副本分片都已分配。你的集群是 100% 可用的。
  • yellow:所有的主分片已经分片了,但至少还有一个副本是缺失的。不会有数据丢失,所以搜索结果依然是完整的。
  • red:至少一个主分片(以及它的全部副本)都在缺失中。这意味着你在缺少数据:搜索只能返回部分数据,而分配到这个分片上的写入请求会返回一个异常。

如果集群状态不正常了(status是yellow或者red),可以通过以下命令查看具体是哪个index中的哪些shard出问题了:

$ curl -XGET 'http://192.168.5.1:9200/_cluster/health?pretty&level=indices' 
{
  ... # 同上
  "indices" : {
    "logstash-2017.11.01" : {
      "status" : "green",
      "number_of_shards" : 36,
      "number_of_replicas" : 0,
      "active_primary_shards" : 36,
      "active_shards" : 36,
      "relocating_shards" : 0,
      "initializing_shards" : 0,
      "unassigned_shards" : 0
    }
    ... # 其他索引的信息
}

$ curl -XGET 'http://192.168.5.1:9200/_cluster/health?pretty&level=shards'
{
  ... # 同上
  "indices" : {
    "logstash-2017.11.01" : {
      "status" : "green",
      "number_of_shards" : 36,
      "number_of_replicas" : 0,
      "active_primary_shards" : 36,
      "active_shards" : 36,
      "relocating_shards" : 0,
      "initializing_shards" : 0,
      "unassigned_shards" : 0,
      "shards" : {
        "0" : {
          "status" : "green",
          "primary_active" : true,
          "active_shards" : 1,
          "relocating_shards" : 0,
          "initializing_shards" : 0,
          "unassigned_shards" : 0
        }
        ...
      }
    }
    ...
  }
}

3. ES中index相关的操作

列出ES集群中所有的index信息

$ curl -X GET 'http://192.168.5.1:9200/_cat/indices?v'
health status index               uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   logstash-2017.12.01 NzGm6Ie8RiieapK8-Hk3GQ  36   0 1947323922            0      1.3tb          1.3tb
green  open   logstash-2017.12.04 fgqZu2KRR9W7p8MnUDhvhg  36   0  242204838            0    196.8gb        196.8gb
green  open   logstash-2017.11.18 aXBeawaBSHGhWPyJbeEdXA  36   0  689616830            0    594.2gb        594.2gb
green  open   logstash-2017.10.29 bk7rL2pxSV-ZvhMullCKIg  36   0  583979658            0    536.5gb        536.5gb
green  open   logstash-2017.10.23 cg2kChcVS0WxMm756OhT3g  36   0  717746268            0    625.5gb        625.5gb
green  open   logstash-2017.11.23 -0WaKahMT2uxhToVfS7DAA  36   0 1594219545            0        1tb            1tb
green  open   logstash-2017.11.14 5ej6Pln3R0WOkmApF_-kRg  36   0  673786095            0    574.8gb        574.8gb
green  open   logstash-2017.12.03 hphMrGzERHuVCBEzZpkZVQ  36   0 1924764450            0      1.3tb          1.3tb
green  open   logstash-2017.10.22 7dTwPzCGQdqVnJl3erz--w  36   0  711153079            0    623.1gb        623.1gb
...

其中:

  • health:表示健康状况
  • status:索引的状态,open-索引已开启,close-索引已关闭。关闭索引表示锁定了读写操作
  • pri:索引的主分片的数目
  • rep:索引的副本数
  • docs.count:索引包含的文档数目
  • docs.deleted:索引中已删除的文档数
  • store.size:索引占用的存储空间,包括主分片及其副本
  • pri.store.size:索引主分片占用的存储空间

创建索引

$ curl -XPUT 'http://192.168.5.1:9200/test_for_cjf' -d '
{
  "settings" : {
    "index" : {
      "refresh_interval" : "60s",
      "number_of_shards" : "36",
      "translog" : {
        "flush_threshold_size" : "1gb",
        "sync_interval" : "60s",
        "durability" : "async"
      },
      "merge" : {
        "scheduler" : {
          "max_thread_count" : "1",
          "max_merge_count" : "10"
        }
      },
      "query" : {
        "default_field" : "message"
      },
      "number_of_replicas" : "0"
    }
  }
}'

{"acknowledged":true,"shards_acknowledged":true}

其中:

  • index.refresh_interval:表示数据刷新周期,只有刷新之后的数据才能被查询到
  • index.number_of_shards:分片数目
  • index.translog.flush_threshold_size:translog刷新到磁盘的阈值
  • index.translog.durability:translog同步方式
  • index.translog.sync_interval:translog同步间隔,在durability为async的时有效
  • index.number_of_replicas:索引副本数

上面的创建索引的参数已经是经过写优化之后的值

删除索引

$ curl -XDELETE 'http://192.168.5.1:9200/test_for_cjf'
{"acknowledged":true}

关闭索引

$ curl -XPOST 'http://192.168.5.1:9200/test_for_cjf/_close'
{"acknowledged":true}

$ curl -XPUT '192.168.5.1:9200/test_for_cjf/logs/1?pretty' -H 'Content-Type: application/json' -d'{}'
{
  "error" : {
    "root_cause" : [
      {
        "type" : "index_closed_exception",
        "reason" : "closed",
        "index_uuid" : "SJjYVLqwSG6Xb7Vyud1A5Q",
        "index" : "test_for_cjf"
      }
    ],
    "type" : "index_closed_exception",
    "reason" : "closed",
    "index_uuid" : "SJjYVLqwSG6Xb7Vyud1A5Q",
    "index" : "test_for_cjf"
  },
  "status" : 403
}

注意:

  • 不允许对关闭的索引进行读写操作
  • 在修改相关配置的时候需要对索引执行close操作,比如:index.translog.sync_interval

开启索引

$ curl -XPOST 'http://192.168.5.1:9200/test_for_cjf/_open'
{"acknowledged":true}

4 动态修改ES相关配置

index.number_of_replicas

$ curl -XPUT  http://192.168.5.1:9200/test_for_cjf/_settings -d '{"index":{"number_of_replicas":0}}'
{"acknowledged":true}

注意:

  • number_of_replicas用来标识索引的副本数,设置副本是为0在写优化的过程中有比较好的效果
  • 一般将正在写的index的副本数设为0,将归档的index的数目调整为1

index.number_of_shards

  • 创建index的可以指定这个参数,表示分片的数目,默认是5
  • 该参数不允许动态修改,可以通过修改配置文件,然后重启集群实现

index.refresh_interval

$ curl -XPUT  http://192.168.5.1:9200/test_for_cjf/_settings -d '{"index":{"refresh_interval":"60s"}}'
{"acknowledged":true}

注意:

  • 表示数据刷新间隔,只有刷新之后的数据才能被查询到

index.translog

$ curl -XPUT  http://192.168.5.1:9200/test_for_cjf/_settings -d '{"index":{"translog.durability":"async"}}'
{"acknowledged":true}

$ curl -XPUT  http://192.168.5.1:9200/test_for_cjf/_settings -d '{"index":{"translog.flush_threshold_size":"1gb"}}'
{"acknowledged":true}

$ curl -XPOST http://192.168.5.1:9200/test_for_cjf/_close
$ curl -XPUT  http://192.168.5.1:9200/test_for_cjf/_settings -d '{"index":{"translog.sync_interval":"60s"}}'
$ curl -XPOST http://192.168.5.1:9200/test_for_cjf/_open

注意:

  • translog类似于数据库中的binlog
  • 更改sync_interval需要关闭index