Elasticsearch狀態API接口排障總結


ES的Restful API,共四類API:
    1. 檢查集群、節點、索引等健康與否,以及獲取其相應狀態。
    2. 管理集群、節點、索引及元數據
    3. 執行CRUB操作(即:增刪查改)
    4. 執行高級操作,如:paging,filtering等。

    ES API的訪問接口: TCP:9200,並且ES是基於HTTP協議工作的.

    curl -X <Verb> '<Protocol>://Host:Port/<Path>?<Query_String>' -d '<Body>'

        注:
            Verb: 即HTTP的操作,GET, PUT, DELETE等.
            Protocol: http,https
            Path: 訪問路徑.
            Query_String:查詢參數,如: '?pretty':表示使用容易讀的JSON格式顯示輸出.
            Body:請求的主體。

    如查看node1的狀態:
        curl -X GET 'http://1.1.1.1:9200/?pretty'


ES的API接口:

_cat API:
    查看ES集群的狀態:
        curl -X GET 'http://1.1.1.1:9200/_cat/nodes?v'
            注:
                _cat:     這是ES的API接口名,一般ES的API接口名使用下划線開頭.
                          此接口的功能是輸出顯示的。
                ?v:      問號v,是修飾符,v:是verbose,顯示詳情。
                ?help:     可顯示幫助信息。
                ?h=name,ip,port,uptime,heap.current :可定義顯示那些列.
        curl -XGET 'http://1.1.1.1:9200/_cat/indices'      #查看ES集群中所有的索引信息
        curl   localhost:9200/_cat/indices?s      #默認可省略s,s: status
        curl   localhost:9200/_cat/indices?help        #可查看支持的查詢關鍵字

_cluster APIs:
    查看ES集群健康狀態詳情:
        curl -X GET 'http://1.1.1.1:9200/_cluster/health?pretty'

    查看索引的健康狀態:
    health
        curl -X GET 'http://1.1.1.1:9200/_cluster/health/索引名1,索引名2,...'
        curl -X GET 'http://1.1.1.1:9200/_cluster/health/索引名1?level=Level'
            注:
                cluster:顯示到集群級別
                indices:顯示到索引級別
                shards:分片級別

    查看集群的狀態信息:
    state:
        curl -X GET 'http://1.1.1.1:9200/_cluster/state/version'

        curl -X GET 'http://1.1.1.1:9200/_cluster/state/master_node?pretty'
        curl -X GET 'http://1.1.1.1:9200/_cluster/state/nodes?pretty'

    查看集群的統計數據:
    stats:
        curl -X GET 'http://1.1.1.1:9200/_cluster/stats?pretty'
查看集群節點狀態信息:
# curl 192.168.10.80:9200/_cat/nodes?v
               堆內存%    總內存%    CPU   1分鍾    5分鍾    15分鍾   角色    *:主節點 節點名
  ip        heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
            10.2.2.81           14          87   0    0.14    0.12     0.11 mdi       -      node81
            10.2.2.80           27          95   0    0.02    0.02     0.00 mdi       *      node80

# curl 192.168.10.80:9200/_cat/health?v
 epoch      timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
  1564141337 11:42:17  myes1   green      2         2       40    20    0    0        0           0       -                 100.0%
            
            
# 下面可以看當前所有Index(索引)的狀態統計,通過它,可獲取當前ES集群中是否有red 或 yellow的Index,若有,
  則需要通過下面的 _cluster/health?level=indices&pretty 來具體查看該Index分片的詳細信息。
        curl 192.168.10.80:9200/_cat/indices?v

   

 #查看Index分片的狀態信息
# curl "localhost:9200/_cluster/health?level=indices&pretty"
 {
  "cluster_name" : "myes1",
  "status" : "green",   #整個ES集群的狀態為green,是因為下面所有Index的狀態為green,若其中有任何一個Index的狀態非Green,則整個ES的狀態將會非Green。
  "timed_out" : false,
  "number_of_nodes" : 2,
  "number_of_data_nodes" : 2,
  "active_primary_shards" : 20,
  "active_shards" : 40,
  "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,
  "indices" : {
    ".kibana_task_manager" : {
      "status" : "green",     #當前.kibana_task_manager這個Index的狀態為green。 
                              #通常若Index的分片出現丟失,狀態將會是red或yellow:  
                              #red:則表示有一個主分片丟失!  yellow:則表示一個副本分片丟失!!但主分片依然可讀
      "number_of_shards" : 1,      #shard的數量為1,即分片為1個
      "number_of_replicas" : 1,                #副本分片數為1,副本分片數決定了shard的個數,若shard個數與它不相同,則該Index的狀態一定不是green:
      "active_primary_shards" : 1, #當前活動的主分片數量
      "active_shards" : 2,         #這是當前所有活動的分片數量
      "relocating_shards" : 0,     #正在調度分配的分片個數【根據字面理解,不完全正確】
      "initializing_shards" : 0,   #正在初始化分片的個數
      "unassigned_shards" : 0      #未分配的分片個數
    },
    ...........................

 

 #查看shard分片中那個分片沒有分配,以及它在那個Node上丟失分片了
 # curl "localhost:9200/_cat/shards?v&pretty"
 #    shard: 它表示index的分片編號
 #    prirep: 這是主分片和副本分片,其中:p: 表示主分片, r:表示副本分片
 #    state: 這個狀態可能有這幾種: relocating,initializing ,Started, unassigned ,其中unassigned 這表示未分配,若是這種狀態,就需要注意了。
 #    docs 和 store: 就是此Index下文檔數量和該docs所占的磁盤空間大小。

  

ElasticSearch集群出現Red 和 Yellow狀態的原因

參考鏈接:https://www.jianshu.com/p/74fe89ab4af7
集群 RED 和 YELLOW 是 Elasticsearch 集群最常見的問題之一.
無論 RED 還是 YELLOW,原因只有一個:有部分分片沒有分配,而且那怕只有一個也會導致集群故障。

  red:則表示有主分片沒有分配!
  yellow:則表示有副本分片沒有分配!!但主分片依然可讀

對於集群 RED 或 YELLOW 的問題診斷推薦使用 Cluster Allocation Explain API,該 API 可以給出造成分片未分配的具體原因。
例如,如下請求可以返回第一個未分配的分片的具體原因:
  curl -XGET localhost:9200/_cluster/allocation/explain?pretty

集群 RED 或 YELLOW 時,一般我們首先需要看一下是否有節點離線。
但單個的未分配分片也導致集群狀態變為 RED 或 YELLOW,一些常見的未分配原因如下:
  • 由於配置問題導致的,需要修正相應的配置
  • 由於節點離線導致的,需要重啟離線的節點
  • 由於分片規則限制的,例如 total_shards_per_node,或磁盤剩余空間限制等,需要調整相應的規則
  • 分配主分片時,由於找不到最新的分片數據,導致主分片未分配,這種要觀察是否有節點離線,
     極端情況下只能手工將舊的副本分片修改為主分片,但這會導致丟失一些新入庫的數據。

# curl "localhost:9200/_cat/shards?v&pretty" | grep  unassingned
    #若上面查詢中出現了 unassingned ,則可通過,下面命令來查看 該index的分片是什么原因導致未分配
    curl   -sXGET   localhost:9200/_cluster/allocation/explain?pretty  -d  '{
                        "index":"myindex",       #可指定index名
                        "shard":3,                        #指定要查看的Shard(分片)編號
                        "primary":true  
                }' 
     #若輸出結果為:
         {
              "index" : "myindex",
              "shard" : 0,
              "primary" : true,
              "current_state" : "unassigned",      
              ..............
        },
            "can_allocate" : "no_valid_shard_copy",
             "allocate_explanation" : "cannot allocate because all found copies of the shard are either stale or corrupt", 
        #無法分配,因為所找到的分片的所有副本都已陳舊或損壞
          ...........................
    #這種錯誤可理解為:
         Elasticsearch 找到了這個分片在磁盤中的數據,但是由於分片的數據不是最新的,無法將其分配為主分片。



分配分片的方法 若知道哪個索引的哪個分片丟失或損壞,就開始手動修復,通過reroute的allocate分配 curl -XPOST '{ESIP}:9200/_cluster/reroute' -H "content-type: application/json" -d '{ "commands" : [ { "allocate" : { "index" : "eslog1", "shard" : 4, "node" : "es1", "allow_primary" : true } } ] }' 分配時可能遇到的坑,需要注意的地方 分配副本時必須要帶參數"allow_primary" : true, 不然會報錯 當集群中es版本不同時,如果這個未分配的分片是高版本生成的,不能分配到低版本節點上,反過來低版本的分片可以分配給高版本,
如果遇到了,只要升級低版本節點的ES版本即可
(升級ES版本詳見官方詳細文檔,我是ubuntu系統apt安裝的,直接apt-get install elasticsearch升級的,elasticsearch.yml
配置文件沒變不用修改,但是/usr/share/elasticsearch/bin/elasticsearch文件中有個內存配置ES_HEAP_SIZE=6G需要再手動加一下&重啟es)
【摘自網絡】
#分片沒有被分配的最初原因有下列類型: 1. INDEX_CREATED 由於 create index api 創建索引導致,索引創建過程中,把索引的全部分片分配完畢需要一個過程,
      在全部分片分配完畢之前,該索引會處於短暫的 RED 或 YELLOW 狀態。因此監控系統如果發現集群 RED,不一定代表出現了故障。
    2. CLUSTER_RECOVERED
        集群完全重啟時,所有分片都被標記為未分配狀態,因此在集群完全重啟時的啟動階段,reason屬於此種類型。
    3. INDEX_REOPENED
        open 一個之前 close 的索引, reopen 操作會將索引分配重新分配。
    4. DANGLING_INDEX_IMPORTED
        正在導入一個 dangling index,什么是 dangling index?
        磁盤中存在,而集群狀態中不存在的索引稱為 dangling index,例如從別的集群拷貝了一個索引的數據目錄到當前集群,
      Elasticsearch 會將這個索引加載到集群中,因此會涉及到為 dangling index 分配分片的過程。
    5. NEW_INDEX_RESTORED
        從快照恢復到一個新索引。
    6. EXISTING_INDEX_RESTORED,
        從快照恢復到一個關閉狀態的索引。
    7. REPLICA_ADDED
        增加分片副本。
    8. ALLOCATION_FAILED
        由於分配失敗導致。
    9. NODE_LEFT
        由於節點離線。
    10. REROUTE_CANCELLED
        由於顯式的cancel reroute命令。
    11. REINITIALIZED
        由於分片從 started 狀態轉換到 initializing 狀態。
    12. REALLOCATED_REPLICA
        由於遷移分片副本。
    13. PRIMARY_FAILED
        初始化副分片時,主分片失效。
    14. FORCED_EMPTY_PRIMARY
        強制分配一個空的主分片。
    15. MANUAL_ALLOCATION
        手工強制分配分片。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM