1. 程式人生 > >Elasticsearch 2.2.0 叢集配置詳解

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" } }