1:shard allocation
分片配置設定就是将索引的各個分片合理的分布到各個節點上去。這個過程可能發生在以下場景下:
初始化(重新開機恢複),副本配置設定,平衡,節點加入,節點移除。
es在這個子產品對應的設定有:
cluster.routing.allocation.allow_rebalance: 根據叢集狀态是否允許平衡操作,什麼時機可以平衡。選項有:always, indices_primaries_active, indices_all_active(default).預設值減少叢集啟動時機器之間的互動。
cluster.routing.allocation.cluster_concurrent_rebalance: 設定叢集級别平衡過程中的shard并發度設定,2(default)
cluster.routing.allocation.node_initial_primaries_recoveries: 設定node級别上初始化資料恢複過程中并發的主分片數量,大多情況下是local gateway,這個過程會很快,是以可以在不增加負載的情況下處理更多的主分片。
cluster.routing.allocation.node_concurrent_recoveries: 設定node級别recovery的并發度。2(default)
cluster.routing.allocation.enable: 哪些分片可以參與重新配置設定。選項有:all(default), primaries(主分片), new_primaries(新增加的主分片), none.
cluster.routing.allocation.same_shard.host: 是否啟用對同一分片在同一個主機上出現多個配置設定執行個體的檢測。預設false。這個選項隻有在同一個node上啟動多個es執行個體的情況下才有意義。
indices.recovery.concurrent_stream:設定node級别上從一個分片恢複另一個分片的并發度。
2:shard allocation awareness
叢集配置設定awareness可以跨一般的屬性來控制節點上分片和副本的配置設定。舉例說明:
假設我們有多個機架。當我們啟動一個節點的時候,配置一個屬性rack_id(任何名稱都可以,這裡隻是舉例),例如:
node.rack_id : rack_one
以上給一個node設定了rank_id屬性,現在我們将rack_id屬性設定為一個awareness allocation屬性(所有node上都要設定):
cluster.routing.allocation.awareness.attributes: racd_id
以上設定将rack_id屬性應用在awareness過程中影響分片和副本的配置設定。例如:我們啟動了2個設定rack_id為rack_one的節點,部署了一個有5分片1副本的索引,那麼索引會部署到所有目前節點中,總共10個分片,每個節點5個。現在如果我們再啟動2個節點,node.rack_id: rack_two。分片就會在目前4個節點中重新配置設定,但是分片和副本不會同時配置設定到rack_id相同的節點上。也就是說如果一個分片落在rack_one上,其副本必定落在rank_two上。
awareness允許多值,例如:
cluster.routing.allocation.awareness.attributes:rank_id, zone。
注意:當應用awareness屬性時,分片不會落在沒有設定屬性值的節點上。
3:forced awareness
有些時候,我們事先就可以知道awareness屬性值的數量,并且我們不想讓超出需求數量以外的副本配置設定到特定的具有相同awareness屬性值的節點群中,這種情況下我們可以使用強制awareness的功能。舉例說明:
假設我們有一個awareness的屬性為zone,而且我們知道隻存在兩個zone的取值:zone1和zone2.是以我們可以配置這樣的一個強制awareness屬性:
cluster.routing.allocation.awareness.force.zone.values: zone1, zone2
cluster.routing.allocation.awareness.attributes: zone
現在我們啟動兩個node.zone:zone1的節點,部署一個5分片1副本的索引,則這兩個節點啟動後,隻會配置設定5個主分片,一個節點2一個節點3,但是不會有副本(請注意跟2中的差別,2中是有副本的,因為預先es并不知道會有rack_two的存在)。隻有我們啟動具有node.zone: zone2的節點,副本才會配置設定。
4:automatic preference when searching/getting
當執行一個查詢或者get操作的時候,節點接受到請求後,會優先在相同屬性值的分片上處理請求。
5:realtime settings update
這些配置都可以通過update api進行實時的更新
6:shard allocation filtering
支援用include/exclude過濾器來控制分片的配置設定。過濾器可以設定在索引級别或者是叢集級别。索引級别設定舉例:
假設有4個節點,每個節點有tag屬性,tag有對應取值:節點1為node.tag: value1, 節點2為node.tag: value2。依次類推。
我們建立一個索引,設定index.routing.allocation.include.tag: value1, value2。
這個配置将索引配置設定限定在tag值為value1和value2的節點上。
另外,我們可以設定索引部署在所有節點,除了tag為value3的節點,
設定index.routing.allocation.exclude.tag: value3.
index.routing.allocation.require.tag可以設定必須滿足的一些規則才能配置設定,是must all的關系,而inclued 是 any的關系。
include,exclude,require可以支援簡單的通配符,例如value*。
另外有一個特殊的屬性_ip可以比對節點的ip,_host可以比對主機名稱也可以比對ip,_name可以比對node name,_id可以比對node id。
顯然一個節點可以設定多個屬性,并且屬性名稱和屬性值可以在setting中指定。比如:
node.group1: group1_value1
node.group2: group2_value4
同樣的,include exclude require 也可以有多個屬性:
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",
"index.routing.allocation.require.group4" : "aaa",
}'
上邊設定的意義是:分片配置設定要符合這樣規則----group4必須為aaa,group3必須不能為zzz,group為xxx或者group2為yyy
以上設定可以通過update api實時改變,當然會觸發shard的重新配置設定。
cluste級别的filter同樣可以定義,也可以實時更新。這個設定在删除節點時很有用途(即使副本為0)
curl -XPUT localhost:9200/_cluster/settings -d '{
"transient" : {
"cluster.routing.allocation.exclude._ip" : "10.0.0.1"
}
}'
顯然10.0.0.1這個節點将要被删除,其上的分片将會重新配置設定~