集羣健康狀態
$ curl -XGET 127.0.0.1:9200/_cluster/health?pretty
green 綠燈,所有分片都正確運行,集羣非常健康。
yellow 黃燈,所有主分片都正確運行,但是有副本分片缺失。這種情況意味着 ES 當前還是正常運行的,但是有一定風險。注意,在 Kibana4 的 server 端啓動邏輯中,即使是黃燈狀態,Kibana 4 也會拒絕啓動,死循環等待集羣狀態變成綠燈後才能繼續運行。
red 紅燈,有主分片缺失。這部分數據完全不可用。而考慮到 ES 在寫入端是簡單的取餘算法,輪到這個分片上的數據也會持續寫入報錯。
節點下線
集羣中個別節點出現故障預警等情況,需要下線,也是 Elasticsearch 運維工作中常見的情況。如果已經穩定運行過一段時間的集羣,每個節點上都會保存有數量不少的分片。這種時候通過 reroute 接口手動轉移,就顯得太過麻煩了。這個時候,有另一種方式:
$ curl -XPUT 127.0.0.1:9200/_cluster/settings -d '{
"transient" :{
"cluster.routing.allocation.exclude._ip" : "10.0.0.1"
}
}'
Elasticsearch 集羣就會自動把這個 IP 上的所有分片,都自動轉移到其他節點上。等到轉移完成,這個空節點就可以毫無影響的下線了。和 _ip 類似的參數還有 _host, _name 等。此外,這類參數不單是 cluster 級別,也可以是 index 級別。下一小節就是 index 級別的用例。
reroute 接口
reroute 接口支持五種指令:allocate_replica, allocate_stale_primary, allocate_empty_primary,move 和 cancel。
常用的一般是 allocate 和 move:
allocate_* 指令
因爲負載過高等原因,有時候個別分片可能長期處於 UNASSIGNED 狀態,我們就可以手動分配分片到指定節點上。默認情況下只允許手動分配副本分片(即使用 allocate_replica),所以如果要分配主分片,需要單獨加一個 accept_data_loss 選項:
$ curl -XPOST 127.0.0.1:9200/_cluster/reroute -d '{
"commands" : [ {
"allocate_stale_primary" :
{
"index" : "logstash-2015.05.27", "shard" : 61, "node" : "10.19.0.77", "accept_data_loss" : true
}
}
]
}'
因爲負載過高,磁盤利用率過高,服務器下線,更換磁盤等原因,可以會需要從節點上移走部分分片:
$ curl -XPOST 127.0.0.1:9200/_cluster/reroute -d '{
"commands" : [ {
"move" :
{
"index" : "logstash-2015.05.22", "shard" : 0, "from_node" : "10.19.0.81", "to_node" : "10.19.0.104"
}
}
]
}'
集羣更新節點配置
剛上線的服務,最近一再的更新基礎配置(硬盤)
- 關閉分片自動均衡
$ curl -XPUT 127.0.0.1:9200/_cluster/settings
{
"transient" : {
"cluster.routing.allocation.enable" : "none"
}
}
-
升級重啓該節點,並確認該節點重新加入到了集羣中
-
其他節點重複第2步,升級重啓。
-
最後所有節點配置更新完成後,重啓集羣的shard均衡
$ curl -XPUT 127.0.0.1:9200/_cluster/settings -d'
{
"transient" : {
"cluster.routing.allocation.enable" : "all"
}
}'
設置磁盤空間水位線
$ curl -XPUT 127.0.0.1:9200/_cluster/settings
{
"transient": {
"cluster.routing.allocation.disk.watermark.low": "80%",
"cluster.routing.allocation.disk.watermark.high": "90%",
}
}