elasticsearch高階配置之分片分佈規則設定
阿新 • • 發佈:2019-01-01
Java程式碼
設定根據叢集中機器的狀態來重新分配分片,可以設定為always, indices_primaries_active和indices_all_active,預設是設定成indices_all_active來減少叢集初始啟動時機器之間的互動。
Java程式碼
設定在叢集中最大允許同時進行分片分佈的個數,預設為2,也就是說整個叢集最多有兩個分片在進行重新分佈。
Java程式碼
設定指定初始每個節點。由於多數情況下是使用local的gateway,這應該會更快,
Java程式碼
設定在節點中最大允許同時進行分片分佈的個數,預設為2
Java程式碼
使主要分片或副本的分佈失效。要知道,如果主分片不存在(那個節點掛了)那麼其副本仍然會被提升為主分片,這個設定只有在動態地使用叢集更新設定api呼叫時才生效。
Java程式碼
使副本分佈失效。和上一個設定一樣,只有動態地使用叢集更新設定api呼叫時才生效。
Java程式碼
當從一個點(peer)恢復分片時當前節點最多允許的檔案讀取流的個數,預設為5
自定義分片分佈規則
可以通過設定分片的分佈規則來人為地影響分片的分佈,下面是個例子:
假設我們有幾個機架。當我們啟動一個節點,我們可以設定一個叫rack_id(其它名字也可以)的屬性,例如下面設定:
Java程式碼
上面這個例子設定了一個屬性叫rack_id,它的值為rack_one。現在,我們要設定rack_id作為分片分佈規則的一個屬性(在所有節點都要設定)。
Java程式碼
注意:當設定了分片分佈屬性時,如果叢集中的節點沒有設定其中任何一個屬性,那麼分片就不會分佈到這個節點中。
強制分佈規則
更多的時候,我們不想更多的副本被分佈到相同分佈規則屬性值的一群節點上,那麼,我們可以強制分片規則為一個指定的值。
例如,我們有一個分片規則屬性叫zone,並且我們知道有兩個zone,zone1和zone2.下面是設定:
Java程式碼
現在我們啟動兩個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程式碼
與此相反,通過設定index.routing.allocation.exclude.tag為value3,我們也可以建立一個索引讓其分佈在除了tag設定為value3的所有節點中,如:
Java程式碼
include或exclude過濾器的值都會使用萬用字元來匹配,如value*。一個特別的屬性名是_ip,它可以用來匹配節點的ip地址。
顯然,一個節點可能擁有多個屬性值,所有屬性的名字和值都在配置檔案中配置。如,下面是多個節點的配置:
Java程式碼
同樣的方法,include和exclude也可以設定多個值,如:
Java程式碼
上面的設定可以通過索引更新的api實時更新到索引上,允許實時移動索引分片。
叢集範圍的過濾器也可以定義,可以通過叢集更新api實時更新到叢集上。這些設定可以用來做讓一些節點退出叢集的操作。下面是通過ip地址去掉一個節點的操作:
Java程式碼
- cluster.routing.allocation.allow_rebalance
設定根據叢集中機器的狀態來重新分配分片,可以設定為always, indices_primaries_active和indices_all_active,預設是設定成indices_all_active來減少叢集初始啟動時機器之間的互動。
Java程式碼
- cluster.routing.allocation.cluster_concurrent_rebalance
設定在叢集中最大允許同時進行分片分佈的個數,預設為2,也就是說整個叢集最多有兩個分片在進行重新分佈。
Java程式碼
- cluster.routing.allocation.node_initial_primaries_recoveries
設定指定初始每個節點。由於多數情況下是使用local的gateway,這應該會更快,
Java程式碼
- cluster.routing.allocation.node_concurrent_recoveries
設定在節點中最大允許同時進行分片分佈的個數,預設為2
Java程式碼
- cluster.routing.allocation.disable_allocation
使主要分片或副本的分佈失效。要知道,如果主分片不存在(那個節點掛了)那麼其副本仍然會被提升為主分片,這個設定只有在動態地使用叢集更新設定api呼叫時才生效。
Java程式碼
- cluster.routing.allocation.disable_replica_allocation
使副本分佈失效。和上一個設定一樣,只有動態地使用叢集更新設定api呼叫時才生效。
Java程式碼
- indices.recovery.concurrent_streams
當從一個點(peer)恢復分片時當前節點最多允許的檔案讀取流的個數,預設為5
自定義分片分佈規則
可以通過設定分片的分佈規則來人為地影響分片的分佈,下面是個例子:
假設我們有幾個機架。當我們啟動一個節點,我們可以設定一個叫rack_id(其它名字也可以)的屬性,例如下面設定:
Java程式碼
- node.rack_id: rack_one
上面這個例子設定了一個屬性叫rack_id,它的值為rack_one。現在,我們要設定rack_id作為分片分佈規則的一個屬性(在所有節點都要設定)。
Java程式碼
- cluster.routing.allocation.awareness.attributes: rack_id
上面設定意味著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程式碼- cluster.routing.allocation.awareness.attributes: rack_id,zone
注意:當設定了分片分佈屬性時,如果叢集中的節點沒有設定其中任何一個屬性,那麼分片就不會分佈到這個節點中。
強制分佈規則
更多的時候,我們不想更多的副本被分佈到相同分佈規則屬性值的一群節點上,那麼,我們可以強制分片規則為一個指定的值。
例如,我們有一個分片規則屬性叫zone,並且我們知道有兩個zone,zone1和zone2.下面是設定:
Java程式碼
- cluster.routing.allocation.awareness.force.zone.values: zone1,zone2
- cluster.routing.allocation.awareness.attributes: zone
現在我們啟動兩個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程式碼
- curl -XPUT localhost:9200/test/_settings -d '{
- "index.routing.allocation.include.tag" : "value1,value2"
- }'
與此相反,通過設定index.routing.allocation.exclude.tag為value3,我們也可以建立一個索引讓其分佈在除了tag設定為value3的所有節點中,如:
Java程式碼
- curl -XPUT localhost:9200/test/_settings -d '{
- "index.routing.allocation.exclude.tag" : "value3"
- }'
include或exclude過濾器的值都會使用萬用字元來匹配,如value*。一個特別的屬性名是_ip,它可以用來匹配節點的ip地址。
顯然,一個節點可能擁有多個屬性值,所有屬性的名字和值都在配置檔案中配置。如,下面是多個節點的配置:
Java程式碼
- node.group1: group1_value1
- node.group2: group2_value4
同樣的方法,include和exclude也可以設定多個值,如:
Java程式碼
- curl -XPUT localhost:9200/test/_settings -d '{
- "index.routing.allocation.include.group1" : "xxx"
- "index.routing.allocation.include.group2" : "yyy",
- "index.routing.allocation.exclude.group3" : "zzz",
- }'
上面的設定可以通過索引更新的api實時更新到索引上,允許實時移動索引分片。
叢集範圍的過濾器也可以定義,可以通過叢集更新api實時更新到叢集上。這些設定可以用來做讓一些節點退出叢集的操作。下面是通過ip地址去掉一個節點的操作:
Java程式碼
- curl -XPUT localhost:9200/_cluster/settings -d '{
- "transient" : {
- "cluster.routing.allocation.exclude._ip" : "10.0.0.1"
- }
- }'