2017年5月26日金曜日

GraylogのElasticsearchのデータを削除する ("Elasticsearch cluster unhealthy (RED)"のエラーを解消する②)

前回、Graylogのディスク拡張を実施したが、以下Elasticsearchのエラーは解消されない状態となっていた。

------------------------------
Elasticsearch cluster unhealthy (RED)
The Elasticsearch cluster state is RED which means shards are unassigned. This usually indicates a crashed and corrupt cluster and needs to be investigated.

~(以下略)~
------------------------------

この状態ではGraylogで受信したログの検索ができない状態となるため、どうにかして復旧する必要があった。復旧までの手順を本記事にて記載するが、先に言っておくと、Elasticsearchのデータを消すことによって対処をした(復旧というより初期化という表現が近いかもしれない)。

大活躍するcurlコマンド

Elasticsearchでは、各種URLにHTTPアクセスをすると、結果を返したり、設定をしたりすることができる。どうもこれがREST APIと呼ばれるものらしいが、とにかくまずは各種確認をしてみることにした。

この際に利用できるコマンドがcurlコマンドである。client for URLの略(?)で、カールと呼ぶようだ。このコマンドでHTTPリクエストを送るとHTTPレスポンスを受けることができる。

例えば、Elasticsearchの状態確認は以下コマンドで実行できる。

◆Elasticsearchの状態確認
# curl -XGET http://192.168.11.151:9200/_cluster/health?pretty=true
------------------------------
{
  "cluster_name" : "graylog",
  "status" : "red",
  "timed_out" : false,
  "number_of_nodes" : 2,
  "number_of_data_nodes" : 1,
  "active_primary_shards" : 2,
  "active_shards" : 2,
  "relocating_shards" : 0,
  "initializing_shards" : 2,
  "unassigned_shards" : 4,
  "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" : 25.0
}
------------------------------

上記下線部にて、冒頭のエラーと同様に、statusが"red"となっていることがわかる。

さて、このコマンドで各種確認をしてみる。まずはNodeとShardの状態を確認。

◆Nodeの確認
# curl -XGET http://192.168.11.151:9200/_node/cat/nodes
------------------------------
192.168.11.151 192.168.11.151 24 82 3.12 d * Manbot
192.168.11.151 192.168.11.151 46 82 3.12 c - graylog-bbbebd4f-8c8b-406a-8a33-b51f00e6facc
------------------------------

◆Shardの確認
# curl -XGET http://192.168.11.151:9200/_cat/shards
------------------------------
graylog_0 3 p STARTED      1633383 439.5mb 192.168.11.151 Manbot
graylog_0 3 r UNASSIGNED                                      
graylog_0 1 p INITIALIZING                 192.168.11.151 Manbot
graylog_0 1 r UNASSIGNED                                      
graylog_0 2 p STARTED      1632406 438.6mb 192.168.11.151 Manbot
graylog_0 2 r UNASSIGNED                                      
graylog_0 0 p INITIALIZING                 192.168.11.151 Manbot
graylog_0 0 r UNASSIGNED                                      
------------------------------

下線部が"STARTED"ではなく、"INITIALIZING"となっているのがあやしい…。

もっと詳細な状態確認は以下コマンドで実施する。

◆詳細状態確認
# curl -XGET http://192.168.11.151:9200/_cluster/state?pretty=true
------------------------------
{
  "cluster_name" : "graylog",
  "version" : 131,
  "state_uuid" : "-R-stME1QAK2WkC4kZS6tQ",
  "master_node" : "GKmS2bPySZ69oHVcxwbTqg",
  "blocks" : { },
  "nodes" : {
    "GKmS2bPySZ69oHVcxwbTqg" : {
      "name" : "Orphan-Maker",
      "transport_address" : "192.168.11.151:9300",
      "attributes" : { }
    },
    "U9D_Bp0NTpKauX89rKWsvg" : {
      "name" : "graylog-bbbebd4f-8c8b-406a-8a33-b51f00e6facc",
      "transport_address" : "192.168.11.151:9350",
      "attributes" : {
        "client" : "true",
        "data" : "false",
        "master" : "false"
      }
    }
  },

~(中略)~

            "state" : "INITIALIZING",
            "primary" : true,
            "node" : "GKmS2bPySZ69oHVcxwbTqg",
            "relocating_node" : null,
            "shard" : 1,
            "index" : "graylog_0",
            "version" : 36,
            "allocation_id" : {
              "id" : "JFJ78yB9Qf6o6s9TfOnrbw"
            },
            "unassigned_info" : {
              "reason" : "ALLOCATION_FAILED",
              "at" : "2017-05-12T14:37:29.179Z",
              "details" : "failed recovery, failure IndexShardRecoveryException[failed to recovery from gateway]; nested: EngineCreationFailureException[failed to recover from translog]; nested: EngineException[failed to recover from translog]; nested: ElasticsearchException[unexpected exception reading from translog snapshot of /var/opt/graylog/data/elasticsearch/graylog/nodes/0/indices/graylog_0/1/translog/translog-855.tlog]; nested: EOFException[read past EOF. pos [532245] length: [4] end: [532245]]; "
            }
          },

~(以下略)~
------------------------------

"INITIALIZING"の理由が記載されているような気がするが、、、残念ながら、これを見ても解決方法はよくわからなかった。

データを消して復旧

結局直し方がよくわからず、最終手段として過去データを削除してみることにした。

まず"Index"の状態を確認する。これはいわばElasticsearchのデータが蓄えられるデータベース領域のようなものである。

◆Indexの確認
# curl -XGET http://192.168.11.151:9200/_cat/indices
------------------------------
red open graylog_0 4 1 3265789 0 878.1mb 878.1mb
------------------------------

現在は878MBを使っている模様。以下コマンドでデータを削除する。

◆データを削除
# curl -XDELETE http://192.168.11.151:9200/graylog_0
------------------------------
{"acknowledged":false}
------------------------------

再度、Indexの確認をする。

◆Indexの確認
# curl -XGET http://192.168.11.151:9200/_cat/indices
------------------------------
red open graylog_0 4 1 0 0 390b 390b
------------------------------

容量が390Bに減少していることがわかる。ディスク使用量を確認してみる。

# df -h
------------------------------
Filesystem      Size  Used Avail Use% Mounted on
udev            2.0G  4.0K  2.0G   1% /dev
tmpfs           396M  692K  395M   1% /run
/dev/dm-0        15G  2.7G   12G  19% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
none            5.0M     0  5.0M   0% /run/lock
none            2.0G     0  2.0G   0% /run/shm
none            100M     0  100M   0% /run/user
/dev/sda1       236M   74M  150M  34% /boot
/dev/sdb1        40G  805M   37G   3% /var/opt/graylog/data
------------------------------

もともと11GBあったデータが805MBまで減ったことがわかる。

これで一度Shardの状態を確認する

◆Shardの確認
# curl -XGET http://192.168.11.151:9200/_cat/shards
------------------------------
graylog_0 3 p STARTED    0 130b 192.168.11.151 Manbot
graylog_0 3 r UNASSIGNED                            
graylog_0 1 p STARTED    0 130b 192.168.11.151 Manbot
graylog_0 1 r UNASSIGNED                            
graylog_0 2 p STARTED    0 130b 192.168.11.151 Manbot
graylog_0 2 r UNASSIGNED                            
graylog_0 0 p UNASSIGNED                            
graylog_0 0 r UNASSIGNED                            
------------------------------

少なくとも"INITIALIZING"となっているShardはいなくなったように見える。一度OSを再起動して再度確認してみる。

◆Shardの確認
# curl -XGET http://192.168.11.151:9200/_cat/shards
------------------------------
graylog_0 2 p STARTED    2701 751.9kb 192.168.11.151 Steve Rogers
graylog_0 2 r UNASSIGNED                                        
graylog_0 3 p STARTED    2531 772.3kb 192.168.11.151 Steve Rogers
graylog_0 3 r UNASSIGNED                                        
graylog_0 1 p STARTED    2579   762kb 192.168.11.151 Steve Rogers
graylog_0 1 r UNASSIGNED                                        
graylog_0 0 p STARTED    2608 751.5kb 192.168.11.151 Steve Rogers
graylog_0 0 r UNASSIGNED                                        
------------------------------

上記の通り、4つのShardが"STARTED"となった。Elasticsearchの状態も確認してみる。

◆Elasticsearchの状態確認
# curl -XGET http://192.168.11.151:9200/_cluster/health?pretty=true
------------------------------
{
  "cluster_name" : "graylog",
  "status" : "yellow",
  "timed_out" : false,
  "number_of_nodes" : 2,
  "number_of_data_nodes" : 1,
  "active_primary_shards" : 4,
  "active_shards" : 4,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 4,
  "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" : 50.0
}
------------------------------

statusが"yellow"となり"red"よりは解消された。一応この状態であれば、ログの検索は実施できるようではある。さらに"yellow"を"green"にするためには、以下の通り、ReplicaのShardの数を0に設定すればよいようだ。

------------------------------コマンドここから
# curl -XPUT 'http://192.168.11.151:9200/_settings' -d '
{
    "index" : {
        "number_of_replicas" : 0
    }
}'
------------------------------コマンドここまで
------------------------------
{"acknowledged":true}
------------------------------

Shardの状態を確認する。

◆Shardの確認
# curl -XGET http://192.168.11.151:9200/_cat/shards
------------------------------
graylog_0 2 p STARTED 90501 23.6mb 192.168.11.151 Steve Rogers
graylog_0 3 p STARTED 90342 23.5mb 192.168.11.151 Steve Rogers
graylog_0 1 p STARTED 90677 23.6mb 192.168.11.151 Steve Rogers
graylog_0 0 p STARTED 90231 23.5mb 192.168.11.151 Steve Rogers
------------------------------

◆Elasticsearchの状態確認
# curl -XGET http://192.168.11.151:9200/_cluster/health?pretty=true
------------------------------
{
  "cluster_name" : "graylog",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 2,
  "number_of_data_nodes" : 1,
  "active_primary_shards" : 4,
  "active_shards" : 4,
  "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
}
------------------------------

以上でElasticsearchのステータスを"red"から"green"に回復させることができた。しかし、データをすべて消すという、復旧方法としてはかなり乱暴な方法となってしまったので、データを消さずに復旧する方法は引き続き調査したい。