控制集群的再平衡
默認情況下,Elasticsearch視圖把分片和副本在集群中均衡分布。大多數情況下是好的,但有時候想人為控制此行為。
再平衡
再平衡是在集群的不同節點之間移動分片的過程。
集群的就緒
索引由分片和副本構成。主分片用於新文檔被編入索引以及更新或刪除,或者索引發生任何變化時。副本從主分片獲取數據。
當主分片都被分配到集群中的節點上,也就達到了黃色狀態,集群就已經就緒,可以對外提供服務,此時Elasticsearch會初始化副本。
集群再平衡設置
Elasticsearch允許控制再平衡過程,通過設置elasticsearch.yml文件中的幾個屬性,或使用Elasticsearch REST API。
控制再平衡何時開始
cluster.routing.allocation.allow_rebalance
該屬性的取值:
- always:表名再平衡可以在需要時隨時開始
- indices_primaries_active:所有主分片都初始化后,再平衡才會開始。
- indices_all_active:默認設置,所有分片和副本都初始化后,再平衡才會開始。
控制同時在節點移動的分片數量
cluster.routing.allocation.cluster_concurrent_rebalance
指定整個集群中同時可以在節點間移動的分片數量。如果集群由很多節點組成,可以提高這個值。默認值2。
控制單個節點上同時初始化的分片數量
cluster.routing.allocation.node_concurrent_recoveries
設置Elasticsearch在單個節點上一次可以初始化多少分片。分片還原過程是非常耗I/O的,默認是2.
控制單個節點上同時初始化的主分片數量
cluster.routing.allocation.node_initial_primaries_recoveries
控制分配的分片類型
cluster.routing.allocation.enable
控制允許分配哪種類型的分片。取值如下:
- all:默認值,所有類型的分片都可以被分配
- primaries:只分配主分片,不要分配副本
- new_primaries:只分配新創建的主分片
- none:完成禁用了分片的分配
控制單個節點上的並發流數目
indices.recovery.concurrent_streams
允許控制一個節點上一次可以打開多少流,以便從目標分片中恢復一個分片。默認值是3。
控制分片和副本的分配
顯式控制分配
- 指定節點參數
假設希望把更強大的編號為1和2的節點放置在一個叫zone_one的區域,編號3和4的節點資源較少,放在叫zone_two的區域。 - 配置
在節點1和節點2的elasticsearch.yml配置文件中添加node.zone: zone_one屬性。在節點3和節點4的elasticsearch.yml文件中添加類似的node.zone:zone_two。 - 索引的創建
現在創建shop索引。放在更強的節點:
curl -XPUT 'http://localhost:9200/shop' -d'{
"setting":{
"index":{
"routing.allocation.include.zone":"zone_one"
}
}
}'
意味着希望把shop索引放到node.zone屬性等於zone_one的節點。
promotions索引應該放在所有節點,命令如下:
curl -XPOST 'http://localhost:9200/promotions'
curl -XPUT 'http://localhost:9200/promotions/_settings' -d'{
"setting":{
"index":{
"routing.allocation.include.zone":"zone_one, zone_two"
}
}
}'
第一個命令創建索引,第二個命令更新index.routing.allocation.include.zone屬性的值。
- 排除節點的分配

- 節點需求屬性
指定分片必須匹配某種規則才能分配到給定節點上。
index.routing.allocation.require
curl -XPOST 'http://localhost:9200/promotions/_settings' -d'{
"index.routing.allocation.require.size":"big_node",
"index.routing.allocation.require.zone":"zone_one"
}'
Elasticsearch將只會把promotions索引分片分配到node.size屬性等於big_node且node.zone屬性等於zone_one的節點上。
- 使用IP地址分配分片
使用IP地址來指定應該包含排除哪些節點用來做分片和副本的分配。

- 基於磁盤的分片分配
允許基於節點的磁盤使用情況來設置分配規則,因此不會有耗盡磁盤空間或類似的問題。
- 啟動基於磁盤的分片分配:基於磁盤的分片分配默認是禁用的。可以設置cluster.routing.allocation.disk.threshold_enabled屬性為true來啟用。

- 配置基於磁盤的分片分配

第二和第三個屬性值也可以是一個絕對值。
集群范圍的分配

希望把所有新索引都放置在IP地址為10.1.2.10和10.1.2.11的節點上。
每個節點上的分片和副本數量
指定單一節點上為單一索引最多可以放置多少分片
curl -XPOST 'localhost:9200/shop/_settings' -d'{
"index.routing.allocation.total_shards_per_node":1
}'
該屬性可以放在配置文件中。
手動移動分片和副本
使用Elasticsearch的_cluste/reroute REST端點。
有以下可用的操作:
- 把分片從一個節點移動到另一個節點
- 取消分片的分配
- 強制分片的分配
移動分片

move命令允許移動由index屬性指定的索引分片和副本。shard屬性是要移動的分片的編號。最后,from_node屬性指定從哪個節點上移動分片。
取消分片分配

上述命令將取消es_node_one節點上shop索引編號為0的分片分配。
強制分片的分配
分配一個未分配的分片到指定節點上。

預熱
Elasticsearch允許為類型和索引定義預熱查詢。
定義一個新的預熱查詢
預熱查詢和其他查詢類似,只是它存儲在Elasticsearch一個特殊的名為_warmer的索引中。

把上述查詢存儲為library索引的預熱查詢,執行以下命令:

上述命令將注冊一個名為tags_warming_query的預熱查詢。一個索引可以有多個預熱查詢,但是名字唯一。
添加一個預熱查詢后,Elasticsearch允許一個新段執行搜索之前,會在那個段上執行定義的預熱查詢。允許elasticsearch和操作系統緩存數據,以此來加快搜索。
獲取定義的預熱查詢



刪除一個預熱查詢

禁用預熱功能

查詢的選擇
通常選擇執行起來昂貴和需要填充緩存的查詢需要預熱。如:基於索引中的字段做切面和排序,父子查詢,常用的過濾器查詢。也可以通過日志查找不盡人意的查詢。


注意:過多的預熱查詢,也會影響Elasticsearch的性能
