Elasticsearch 2.2.0 叢集配置詳解
叢集分片配置
Elasticsearch master 節點的主要role就是決定每個shard分配到什麼節點,以及什麼時候在節點間遷移shard以reblance 叢集。有許多引數可以控制shard分配過程
叢集層面的分片分配引數分成3類:包括分片分配設定,分片平衡設定,啟發式分片平衡配置。
分片分配設定:下面的動態設定可以用來控制分片的分配和recovery。
cluster.routing.allocation.enable:可選的引數有:
all | 允許所有的分片被分配 |
primaries | 只允許主分片被分配 |
new_primaries | 只允許新建立的索引的主分片被分配 |
none | 不允許任何分片進行分配 |
cluster.routing.allocation.node_concurrent_recoveries:允許在一個節點上併發recovery的分片個數,預設為2。
cluster.routing.allocation.node_initial_primaries_recoveries:當副本分片recovery已經在網路間發生時,在節點上進行主分片(本地)recovery時的併發數量,預設是4個。
cluster.routing.allocation.same_shard.host:配置是否檢查允許同一個主機上有一個shard的多個副本。預設為false,即不檢查。此引數僅在同一臺機器上啟動
indices.recovery.concurrent_streams:從一個節點recovery一個shard的時候,允許同時開啟的網路流量數,預設為3。
indices.recovery.concurrent_small_file_streams:從同伴的分片恢復時開啟每個節點的小檔案(小於5M)流的數目,預設為2。
分片平衡設定
下面的動態設定可以用來控制整個叢集shard的再平衡策略,配置有:
cluster.routing.rebalance.enable:啟用或禁用特定種類的分片再平衡,可選的引數有:
all | 允許所有的分片進行分片平衡,預設配置。 |
primaries | 只允許主分片進行平衡。 |
replicas | 只允許從分片進行平衡。 |
none | 不允許任何分片進行平衡。 |
cluster.routing.allocation.allow_rebalance:定義分片再平衡的時機,可以的引數有:
always | 總是允許再平衡。 |
indices_primaries_active | 僅在主索引都分配時允許再平衡。 |
indices_all_active | 僅在所有的分片都分配時允許再平衡,預設引數。 |
cluster.routing.allocation.cluster_concurrent_rebalance:允許多少個分片(整個叢集)同時進行再平衡,預設為2。
啟發式分片再平衡
以下設定來確定在何處放置每個碎片的資料。
cluster.routing.allocation.balance.shard:在節點上分配每個分片的權重,預設是0.45。
cluster.routing.allocation.balance.index:在特定節點上,每個索引分配的分片的數量,預設0.55。
cluster.routing.allocation.balance.threshold:操作的最小最優化的值。預設為1。
基於磁碟的分片分配配置
Elasticsearch可以根據磁碟的大小來決定是否從新進行分片的分配。
cluster.routing.allocation.disk.threshold_enabled:是否啟用磁碟分配決策,預設為true。
cluster.routing.allocation.disk.watermark.low:允許分配時的磁碟空間最小值,可以是比例或者絕對值,比如85%或者1G。當磁碟佔用超過設定的值之後,系統將不會對此節點進行分配操作。
cluster.routing.allocation.disk.watermark.high:允許儲存分片節點磁碟空間的最大值,當超過這個值後,系統會把分片遷移到別的節點。預設90%。也可以設定一個具體的大小值,當空間小於這個值的時候,系統會自動遷移到別的節點。
cluster.info.update.interval:檢查叢集中的每個節點的磁碟使用情況的時間間隔,預設30秒。
cluster.routing.allocation.disk.include_relocations:當計算節點的磁碟使用時需要考慮當前被分片的情況。
比如下面的一個配置例項:
1 2 3 4 5 6 7 |
PUT /_cluster/settings{
"transient" : {
"cluster.routing.allocation.disk.watermark.low" : "80%" ,
"cluster.routing.allocation.disk.watermark.high" : "5gb" ,
"cluster.info.update.interval" : "1m"
}
}
|
例項的含義是,每分鐘檢查一下磁碟空間,當磁碟空間小於80%的時候參與分片分配,當空間不足5G的時候,遷移節點的分片到別的節點。
需要注意的是,在2.0.0版本前,當系統有多個數據盤的時候,系統考慮的是總大小,在2.0.0之後,系統考慮的是每個磁碟的使用情況。
本文由賽克 藍德(secisland)原創,轉載請標明作者和出處。
區域分片分配(Shard Allocation Awareness)
實際部署的時候,很多時候是部署在虛擬機器中,共享同一個物理節點,或者部署的時候在同一個機架或者同一個網路區域中。當這些情況下遇到故障的時候,很多節點會同時發生故障,導致系統出現問題。如果在配置Elasticsearch的時候事先能夠注意到吧不同的節點分佈在不同的物理機器,不同的機架或者不同的網路區域,這樣當一個節點出現問題的時候,會使風險降到最低。
區域分片分配(Shard Allocation Awareness)設定允許配置Elasticsearch關於硬體的資訊,例如,我們在啟動的時候在啟動程式後面加上--node.rack_id,後面跟上一個指定的名稱,這個配置也可以放在配置檔案中:
elasticsearch --node.rack_id rack_one
同時我們需要設定cluster.routing.allocation.awareness.attributes: rack_id,可以在配置檔案中設定,或者通過cluster-update-settings API介面設定。
假設有兩個節點node.rack_id的名稱為rack_one,我們建立一個索引有5個主要的分片和一個副本分片。所有的主分片和副本分片被分配在兩個節點上。然後我們新加兩個節點,節點node.rack_id的名稱為rack_two,這樣配置後,系統會自定分配節分片到新的節點上,確保沒有兩個相同的分片在同一個區域中。
當搜尋的時候,系統會智慧的處理,只在一個區域中搜索, 這樣會比在不同的區域中搜索更快。
當使用區域分片分配屬性,碎片不會分配給沒有設定這些屬性的值的節點。在相同屬性的上主從分片分配節點的數量是由屬性值的數量決定的。當一組節點的數量是不平衡的,可能有許多的副本,複製分片可能會停止。
強制分配屬性,解決了不允許相同的分片副本被分配到同一區域的問題。假設當我們有兩個區域的時候,每個區域的大小隻夠分配一半的分片,如果一個區域不可用,全部分片都在一個區域會導致空間不夠,引起系統異常,這個時候,強制分配屬性就有意義了。配置:
cluster.routing.allocation.awareness.force.zone.values: zone1,zone2
cluster.routing.allocation.awareness.attributes: zone
這個時候,如果我們啟動了zone1上的兩個節點,並建立有5個分片一個副本的索引,這個時候在zone1上只會啟動主分片,只到zone2的節點啟動後,才會啟動副本分片。
分片配置過濾
分片配置過濾可以允許或禁止索引的分片分配到特定節點。這個配置主要的作用是當想停止一個節點到叢集中的比較有用。例如我們想停止10.0.0.1這個ip上的所有節點:
1 2 3 4 5 |
PUT /_cluster/settings{
"transient" : {
"cluster.routing.allocation.exclude._ip" : "10.0.0.1"
}
}
|
這樣正常情況下,10.0.0.1節點上的分片會被遷移到其他節點。動態配置的屬性如下:
cluster.routing.allocation.include.{attribute}:將索引分配給一個節點,其{attribute}至少有一個逗號分隔的值。
cluster.routing.allocation.require.{attribute}:將索引分配給一個節點,該節點的{attribute}具有所有的逗號分隔值。
cluster.routing.allocation.exclude.{attribute}:將索引分配給一個節點,其{attribute}沒有一個逗號分隔的值。
attributes 可以包含的值有:
_name:通過節點名稱匹配節點
_ip:通過IP地址匹配節點
_host:通過機器名稱匹配節點
所有的屬性值可以用萬用字元,如:
1 2 3 4 5 |
PUT _cluster/settings{
"transient" : {
"cluster.routing.allocation.include._ip" : "192.168.2.*"
}
}
|
其他叢集設定
只讀設定:可以設定cluster.blocks.read_only使整個群集為只讀。
日誌記錄:設定日誌記錄的級別,例如增加的indices.recovery模組的日誌記錄級別的除錯:
1 2 3 4 5 |
PUT /_cluster/settings{
"transient" : {
"logger.indices.recovery" : "DEBUG"
}
}
|