elasticsearch高級配置之分片分布規則設置

DebKohl 8年前發布 | 18K 次閱讀 ElasticSearch 搜索引擎

來自: http://blog.csdn.net//jiao_fuyou/article/details/50510482


Java代碼   收藏代碼

</div>

  1. cluster.routing.allocation.allow_rebalance  
</div>
設置根據集群中機器的狀態來重新分配分片,可以設置為always, indices_primaries_active和indices_all_active,默認是設置成indices_all_active來減少集群初始啟動時機器之間的交互。  
Java代碼   收藏代碼

</div>

  1. cluster.routing.allocation.cluster_concurrent_rebalance  
</div>
設置在集群中最大允許同時進行分片分布的個數,默認為2,也就是說整個集群最多有兩個分片在進行重新分布。  
Java代碼   收藏代碼

</div>

  1. cluster.routing.allocation.node_initial_primaries_recoveries  
</div>
設置指定初始每個節點。由于多數情況下是使用local的gateway,這應該會更快,  
Java代碼   收藏代碼

</div>

  1. cluster.routing.allocation.node_concurrent_recoveries  
</div>
設置在節點中最大允許同時進行分片分布的個數,默認為2  
Java代碼   收藏代碼

</div>

  1. cluster.routing.allocation.disable_allocation  
</div>
使主要分片或副本的分布失效。要知道,如果主分片不存在(那個節點掛了)那么其副本仍然會被提升為主分片,這個設置只有在動態地使用集群更新設置api調用時才生效。  
Java代碼   收藏代碼

</div>

  1. cluster.routing.allocation.disable_replica_allocation  
</div>
使副本分布失效。和上一個設置一樣,只有動態地使用集群更新設置api調用時才生效。  
Java代碼   收藏代碼

</div>

  1. indices.recovery.concurrent_streams  
</div>
當從一個點(peer)恢復分片時當前節點最多允許的文件讀取流的個數,默認為5 

自定義分片分布規則 
可以通過設置分片的分布規則來人為地影響分片的分布,下面是個例子: 

假設我們有幾個機架。當我們啟動一個節點,我們可以設置一個叫rack_id(其它名字也可以)的屬性,例如下面設置:
 
Java代碼   收藏代碼

</div>

  1. node.rack_id: rack_one  
</div>
上面這個例子設置了一個屬性叫rack_id,它的值為rack_one。現在,我們要設置rack_id作為分片分布規則的一個屬性(在所有節點都要設置)。  
Java代碼   收藏代碼

</div>

  1. cluster.routing.allocation.awareness.attributes: rack_id  
</div>

上面設置意味著rack_id會用來作為分片分布的依據。例如:我們啟動兩個node.rack_id設置rack_one的節點,然后建立一個5個分片,一個副本的索引。這個索引就會完全分布在這兩個節點上。如果再啟動另外兩個節點,node.rack_id設置成rack_two,分片會重新分布,但是一個分片和它的副本不會分配到同樣rack_id值的節點上。

However if rack_two were to fail, taking down both of its nodes, Elasticsearch will still allocate the lost shard copies to nodes in rack_one.


可以為分片分布規則設置多個屬性,例如: 

Java代碼   收藏代碼

</div>

  1. cluster.routing.allocation.awareness.attributes: rack_id,zone  
</div>
注意:當設置了分片分布屬性時,如果集群中的節點沒有設置其中任何一個屬性,那么分片就不會分布到這個節點中。 

強制分布規則 
更多的時候,我們不想更多的副本被分布到相同分布規則屬性值的一群節點上,那么,我們可以強制分片規則為一個指定的值。 
例如,我們有一個分片規則屬性叫zone,并且我們知道有兩個zone,zone1和zone2.下面是設置:
 
Java代碼   收藏代碼

</div>

  1. cluster.routing.allocation.awareness.force.zone.values: zone1,zone2  
  2. cluster.routing.allocation.awareness.attributes: zone  
</div>
現在我們啟動兩個node.zone設置成zone1的節點,然后創建一個5個分片,一個副本的索引。索引建立完成后只有5個分片(沒有副本),只有當我們啟動node.zone設置成zone2的節點時,副本才會分配到那節點上。 
分片分布過濾 
允許通過include/exclude過濾器來控制分片的分布。這些過濾器可以設置在索引級別上或集群級別上。下面是個索引級別上的例子: 

假如我們有四個節點,每個節點都有一個叫tag(可以是任何名字)的屬性。每個節點都指定一個tag的值。如:節點一設置成node.tag: value1,節點二設置成node.tag: value2,如此類推。我們可以創建一個索引然后只把它分布到tag值為value1和value2的節點中,可以通過設置 
index.routing.allocation.include.tag 為value1,value2達到這樣的效果,如:
 
Java代碼   收藏代碼

</div>

  1. curl -XPUT localhost:9200/test/_settings -d '{      
  2.     "index.routing.allocation.include.tag" : "value1,value2"      
  3. }'  
</div>

與此相反,通過設置index.routing.allocation.exclude.tag為value3,我們也可以創建一個索引讓其分布在除了tag設置為value3的所有節點中,如:  
Java代碼   收藏代碼

</div>

  1. curl -XPUT localhost:9200/test/_settings -d '{      
  2.     "index.routing.allocation.exclude.tag" : "value3"      
  3. }'  
</div>

include或exclude過濾器的值都會使用通配符來匹配,如value*。一個特別的屬性名是_ip,它可以用來匹配節點的ip地址。 
顯然,一個節點可能擁有多個屬性值,所有屬性的名字和值都在配置文件中配置。如,下面是多個節點的配置:
 
Java代碼   收藏代碼

</div>

  1. node.group1: group1_value1   
  2. node.group2: group2_value4  
</div>

同樣的方法,include和exclude也可以設置多個值,如:  
Java代碼   收藏代碼

</div>

  1. curl -XPUT localhost:9200/test/_settings -d '{      
  2.     "index.routing.allocation.include.group1" : "xxx"      
  3.     "index.routing.allocation.include.group2" : "yyy",      
  4.     "index.routing.allocation.exclude.group3" : "zzz",      
  5. }'  
</div>

上面的設置可以通過索引更新的api實時更新到索引上,允許實時移動索引分片。 

集群范圍的過濾器也可以定義,可以通過集群更新api實時更新到集群上。這些設置可以用來做讓一些節點退出集群的操作。下面是通過ip地址去掉一個節點的操作:
 
Java代碼   收藏代碼

</div>

  1. curl -XPUT localhost:9200/_cluster/settings -d '{      
  2.     "transient" : {      
  3.         "cluster.routing.allocation.exclude._ip" : "10.0.0.1"      
  4.     }      
  5. }'  
</div>

 本文由用戶 DebKohl 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!