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
手工強制分配分片。