あきろぐ

いろいろめもするよ🐈🐈🐈

Elasticsearchの調査系コマンド&便利な使い方

基本的なElasticsearchのコマンドは、たくさんまとまった記事があると思うので特に困らないと思いますが、プラスαとしてElasticsearchクラスタを運用していく上で知っていると便利かもと感じたコマンドや使い方を備忘録としてまとめてみました。

定期的に追加していくかもしれないです。

表示するカラムを絞り込む

例えば、クラスタに所属するノードの情報を表示させたい場合、cat nodes APIを利用しますが、デフォルトだとレスポンスは以下のようになります。

$ curl -X GET "localhost:9200/_cat/nodes?v"

ip           heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
xxx.xx.x.xxx           65          97  19    0.08    0.12     0.09 mdi       -      node-1
xxx.xx.x.xxx            72          97  17    0.24    0.19     0.16 mdi       *      node-2

レスポンスに含めるのは必要な情報だけで良い場合、以下のようにクエリパラメータにhを使うことでカラムを絞り込むことができます。

# ip, cpu, heapPercentだけ表示
$ curl "localhost:9200/_cat/nodes?h=ip,cpu,heapPercent&v=true"

ip           heap.percent cpu
xxx.xx.x.xxx          80   8
xxx.xx.x.xxx           85   4

また、デフォルトでは表示されないカラムを指定し、レスポンスに含めることも可能です。表示できるカラムは公式ドキュメントを確認してください。

# heap.max, pidも含めて表示(選出は適当)
$ curl -X GET "localhost:9200/_cat/nodes?h=ip,heap.percent,heap.max,cpu,pid&v=true"

ip           heap.percent heap.max cpu pid
xxx.xx.x.xxx            69  495.3mb   2 4257
xxx.xx.x.xxx            65  495.3mb  11 3686

www.elastic.co

特定カラムの昇順、降順でソートする

ノードのリソース使用状況を確認する上で、使用率が高いもの順に表示させたいというユースケースもあると思います。その場合、クエリパラメータsを使うことで降順または昇順にソートさせることができます。

# heapPercent降順で表示
$ curl -X GET "localhost:9200/_cat/nodes?h=ip,heap.percent,cpu&s=heap.percent:desc&v=true"
ip           heap.percent cpu
xxx.xx.x.xxx            84  10
xxx.xx.x.xxx            61   5

シャードがUNASSIGNEDになった原因を調べる

Elasticsearchクラスタを運用する上で、基本的に可用性担保のためアロケーションを有効化している場合が多いかと思います。 ノードに障害が発生しても自動的に正常なノードにシャードがアロケーションされるようになっているので、アロケーションによってシャードが配置されないことは稀にしか発生しないと思いますが、何かしらの作業によってシャードがUNASSIGNEDになってしまい困った・・・という場合に使えるコマンドが、cluster allocation explain APIです。 このコマンドは、UNASSIGNEDになってしまった原因について確認することができます。

UNASSIGNEDが発生する原因は、ノード数に対してインデックスのレプリカ数が多かったり、アロケーションが無効化されていることによってシャードが配置できない等いくつか挙げられます。

# レスポンスは公式ドキュメントの例
$ curl localhost:9200/_cluster/allocation/explain?pretty

{
  "index" : "my-index-000001",
  "shard" : 0,
  "primary" : true,
  "current_state" : "unassigned",                 
  "unassigned_info" : {
    "reason" : "INDEX_CREATED",                   
    "at" : "2017-01-04T18:08:16.600Z",
    "last_allocation_status" : "no"
  },
  "can_allocate" : "no",                          
  "allocate_explanation" : "cannot allocate because allocation is not permitted to any of the nodes",
  "node_allocation_decisions" : [
    {
      "node_id" : "xxxxxx",
      "node_name" : "node-0",
      "transport_address" : "127.0.0.1:9401",
      "node_attributes" : {},
      "node_decision" : "no",                     
      "weight_ranking" : 1,
      "deciders" : [
        {
          "decider" : "filter",                   
          "decision" : "NO",
          "explanation" : "node does not match index setting [index.routing.allocation.include] filters [_name:\"nonexistent_node\"]"  
        }
      ]
    }
  ]
}

www.elastic.co

アロケーションの有効化、無効化

例えば、ノードの入れ替え作業で一時的にアロケーションを無効化したい場合などに使えます。

現在のアロケーション設定の確認および変更は、cluster APIを使います。 cluster.routing.allocation.enableに設定できるのは、allprimariesnew_primariesnoneの4つです。allは全てのシャードがアロケーション対象になります。

www.elastic.co

# アロケーション確認(有効な場合、cluster.routing.allocation.enable = allなどnone以外)
$ curl localhost:9200/_cluster/settings?pretty

{
  "persistent" : {
    "cluster" : {
      "routing" : {
        "allocation" : {
          "enable" : "all"
        }
      }
    }
  },
  "transient" : {
    "cluster" : {
      "routing" : {
        "allocation" : {
          "exclude" : {
            "_name" : ""
          }
        }
      }
    }
  }
}
# アロケーション無効にする(cluster.routing.allocation.enable = node)
$ curl -XPUT localhost:9200/_cluster/settings -d '{
"persistent": {"cluster.routing.allocation.enable": "none"}
}'

# 確認
$ curl localhost:9200/_cluster/settings?pretty
{
  "persistent" : {
    "cluster" : {
      "routing" : {
        "allocation" : {
          "enable" : "none"
        }
      }
    }
  },
  "transient" : { }
}

特定ノードにアロケーションされないようにする

ノードの入れ替え作業で特定ノードにアロケーションされないようにするときに使うコマンドです。 cluster.routing.allocation.exclude._nameにdataノード名を指定することでそのノードにアロケーションされないようになります。

curl -XPUT localhost:9200/_cluster/settings -d '{
  "transient": {
    "cluster.routing.allocation.exclude._name": "dataノード名"
  }
}'

ノード名(_name)だけでなく_ip_hostなどで指定することも可能です。

www.elastic.co

参考

Elasticsearch関連の本はこちらがおすすめです。