1. 程式人生 > >ElasticSearch入門 第二篇:叢集配置

ElasticSearch入門 第二篇:叢集配置

ElasticSearch共有兩個配置檔案,都位於config目錄下,分別是elasticsearch.yml和logging.yml,其中,elasticsearch.yml 是全域性配置檔案,用於在伺服器級別對ElasticSearch進行配置。ElasticSearch的配置選項分為靜態設定和動態設定兩種,靜態設定必須在結點級別(node-level)設定,或配置在elasticsearch.yml配置檔案中,或配置在環境變數中,或配置在命令列中,在結點啟動之後,靜態設定不能修改。叢集的名字和結點的名稱:cluster.name 和 node.name,這兩個配置項是靜態配置項,不能在叢集執行時修改,而動態配置項可以在叢集執行時通過RESTful API進行修改。

一,配置叢集的標識(cluster.name)

通過 cluster.name 屬性配置叢集的名字,用於唯一標識一個叢集,不同的叢集,其 cluster.name 不同,叢集名字相同的所有節點自動組成一個叢集。如果不配置改屬性,預設值是:elasticsearch。當啟動一個結點時,該結點會自動尋找相同叢集名字的主結點;如果找到主結點,該結點加入叢集中;如果未找到主結點,該結點成為主結點。

注意:在yml中對Elasticsearch進行全域性配置,要注意配置選項的格式:option: value,在“:”之後保留一個空格,之後是選項值;配置選項不要有前置空格。

配置叢集的名字為myescluster

cluster.name: myescluster

二,結點的配置

ElasticSearch叢集中,共有五種結點型別:主結點(Master),候選主結點(Master-eligible),資料結點(Data),吸收結點(Ingest)和部落結點(Tribe)。在一個叢集中,主結點只有一個,負責管理叢集,執行叢集級別的操作,比如建立或刪除索引,跟蹤叢集的組成結點的狀態,決定將分片分配的目標結點,對叢集來說,一個穩定的主結點十分重要。叢集會自動進行健康檢測,當主結點出現故障時,叢集中的候選主結點進行選舉,在選舉結束之後,一個候選主結點被選舉成為新的主結點,實現叢集故障的自動轉移。候選主結點具有投票權,其他結點沒有投票權。

1,配置候選主結點和資料結點

預設情況下,ElasticSearch將當前節點配置為同時作為候選主結點和資料結點:

node.data:true 配置該結點是資料結點,用於儲存資料,執行資料相關的操作(CRUD,Aggregation);

node.master:true 配置該結點有資格被選舉為主結點(候選主結點),用於處理請求和管理叢集。如果結點沒有資格成為主結點,那麼該結點永遠不可能成為主結點;如果結點有資格成為主結點,只有在被其他候選主結點認可和被選舉為主結點之後,才真正成為主結點。

配置當前結點只儲存資料:

node.master: false
node.data: true

配置當前結點不儲存資料,只做候選主結點:

node.master: false
node.data: true

2,主結點選取的配置

discovery.zen.minimum_master_nodes 屬性:預設值是1,該屬性定義的是為了組成一個叢集,相互連線的候選主結點的最小數目,強烈推薦該屬性的設定使用多數原則:(master_eligible_nodes / 2) + 1,既能避免出現腦裂(split-brain),又能在故障發生後,快速選舉出新的主結點,例如,有5個候選主結點,推薦把該屬性設定為3。

3,結點的路徑(Path)

預設情況下,ElasticSearch使用基於安裝目錄的相對路徑來配置結點的路徑,安裝目錄由屬性path.home顯示,在home path下,ElasticSearch自動建立config,data,logs和plugins目錄,一般情況下不需要對結點路徑單獨配置。結點的檔案路徑配置項:

  • path.config 設定ElasticSearch的配置檔案儲存的目錄;
  • path.data 設定ElasticSearch結點的索引資料儲存的目錄,多個數據檔案使用逗號隔開,例如,path.data: /path/to/data1,/path/to/data2;
  • path.logs 設定ElasticSearch結點的日誌檔案儲存的目錄;
  • path.plugins  設定ElasticSearch外掛安裝的目錄;
  • path.work 設定ElasticSearch的臨時檔案儲存的目錄;

4,單個ElasticSearch例項的Java虛擬機器(JVM)的堆記憶體限制

ElasticSearch例項必須執行在安裝JDK的機器上,在安裝完Java Runtime元件之後,必須建立系統變數JAVA_HOME,指定JDK安裝的位置,比如:

JAVA_HOME: C:\Program Files\Java\jre1.8.0_121\bin

預設的JVM記憶體限制是 1GB,對小專案而言,1GB記憶體足夠使用,不會出現問題,但是,對大專案而言,這個預設限制太小了,如果日誌檔案中經常出現OutOfMemoryError異常訊息,就考慮重新設定 ES_HEAP_SIZE 環境變數,為JVM分配足夠的記憶體,同時,必須為OS分配足夠的記憶體,建議JVM使用的實體記憶體最大不應超過32GB,推薦分配機器實體記憶體的50%,在Windows中建立新的系統環境變數 ES_HEAP_SIZE,設定堆記憶體大小為5G:

環境變數
ElasticSearch 首先讀取通用的JAVA_OPTS環境變數來獲取JVM引數, 除了可以用JAVA_OPTS配置JVM引數外, 還可以通過ElasticSearch提供的ES_JAVA_OPTS環境變數配置JVM引數, ES_JAVA_OPTS會覆蓋JAVA_OPTS中配置的相同引數, 官方建議是在JAVA_OPTS中配置通用的引數, 在ES_JAVA_OPTS中配置針對Elasticsearch需要調整的引數。環境變數最主要的作用是指定 -Xmx 最大堆大小和 -Xms 最小堆大小。

JAVA_OPTS ,是用來設定JVM相關執行引數的環境變數,例如:JAVA_OPTS="-server -Xms2048m -Xmx2048m"

  • -server:一定要作為第一個引數,在多個CPU時效能佳
  • -Xms:初始Heap大小,使用的最小記憶體,cpu效能高時此值應設的大一些
  • -Xmx:java heap最大值,使用的最大記憶體

上面兩個值是分配JVM的最小和最大記憶體,取決於硬體實體記憶體的大小,建議均設為實體記憶體的一半。

三,索引配置

1,配置索引的分片(shard)和副本(replica)數量

預設的配置是把索引分為5個分片,每個分片1個副本,共10個結點:

index.number_of_shards: 5
index.number_of_replicas: 1

禁用索引的分散式特性,使索引只建立在本地主機上:

index.number_of_shards: 1
index.number_of_replicas: 0

2,當前節點鎖住記憶體

當JVM做分頁切換(swapping)時,ElasticSearch執行的效率會降低,推薦把ES_MIN_MEM和ES_MAX_MEM兩個環境變數設定成同一個值,並且保證機器有足夠的實體記憶體分配給ES,同時允許ElasticSearch程序鎖住記憶體:

bootstrap.mlockall: true

3,斷路器(Circuit Breaker)控制記憶體的使用量

斷路器用於阻止產生OutOfMemoryError的操作,每一個斷路器設定一個記憶體使用的上限,一旦操作達到該上限,ElasticSearch將阻止該操作繼續使用記憶體。設定較多,一般不需要修改,保持預設值:

  • indices.breaker.total.limit: defaults to 70% of JVM heap
  • indices.breaker.request.limit: defaults to 60% of JVM heap
  • indices.breaker.request.overhead: defaults to 1
  • network.breaker.inflight_requests.limit: defaults to 100% of JVM heap
  • network.breaker.inflight_requests.overhead: defaults to 1
  • script.max_compilations_per_minute: defaults to 15

4,欄位資料快取

在對一個欄位執行排序或聚合操作時,使用欄位資料快取(field data cache)將該欄位的值載入到記憶體,以加快查詢的速度。載入欄位資料還原是IO密集的操作,推薦分配足夠的記憶體,並且不分配過期時間:

  • indices.fielddata.cache.size,控制結點級別的欄位資料快取大小,預設值是無限大(unbounded),建議分配足夠的實體記憶體;
  • indices.fielddata.cache.expire,控制欄位資料快取的過期時間,預設值是欄位資料永不過期;
  • indices.breaker.fielddata.limit,斷路器,預設值是JVM堆記憶體的 80%;當載入欄位值所需要的記憶體超過JVM堆記憶體的80%,將引發異常;
  • indices.breaker.fielddata.overhead: 斷路器,預設值是1.03;

5,結點查詢快取:

查詢快取用於快取查詢的結果,每一個節點都有一個查詢快取,快取過期使用LRU淘汰策略(Least Recently Used eviction):當快取滿時,最近最少使用的資料被淘汰,從快取中清除,以儲存新的資料。

  • indices.queries.cache.enabled,預設值是true;
  • indices.queries.cache.size,預設值是10%;

6,索引快取

索引快取用於儲存最新的索引文件(newly indexed documents),當該快取填充滿時,快取的檔案將被寫入到磁碟中的段(segment)中。 

  • indices.memory.index_buffer_size,預設值是10%,在單個結點上,所有索引的分片佔用的最大記憶體大小,或佔用JVM堆記憶體的百分比;
  • indices.memory.min_index_buffer_size,當indices.memory.index_buffer_size指定為百分比時,使用該選項配置絕對值,預設值是48MB;
  • indices.memory.max_index_buffer_size,當indices.memory.index_buffer_size指定為百分比時,使用該選項配置絕對值,預設值是無限大;

7,分片請求快取:

  • indices.requests.cache.enable:預設值是true
  • indices.requests.cache.size: 預設值是1%

當對一個索引執行查詢請求(Search Request)時,每一個相關的分片(involved shard)都在本地執行查詢,返回查詢結果(local result)給協調結點(coordinating node)進行組合(combine),將各個分片的結果合併為最終的結果集返回。分片請求快取對每個分片的查詢結果進行快取。

8,索引的重新整理頻率

索引物件重新整理的頻率,重新整理頻率越低,文件對搜尋操作可視的時間越長:

  • index.refresh_interval,在索引級別指定索引的重新整理頻率,預設值是1s

9,段(Segment)合併

每個索引分為多個段(Segment),一個段寫入硬碟後,就不能再被更新,因此,被刪除文件的資訊儲存在一個單獨的檔案中。ElasticSearch支援文件的更新,在底層,實際上是刪除舊文件,再把更新記憶體的文件編入索引。在查詢時,需要從返回結果中過濾掉已刪除的文件。

如果資料更新或刪除的資料比較多,那麼每個段中的有效資料密度會變低,降低了查詢的效能,通過段合併,將已刪除的資料從段(Segment)中物理刪除,能夠提高搜尋效能,合併的過程是:底層的Lucene庫獲取若干段,從段中過濾已刪除的資料,儲存到一個新的段上;段合併完成之後,將源段從硬碟上物理刪除;段合併操作的CPU和IO的消耗是非常高的,必須控制段合併執行的頻率和時機。

段合併的策略控制段合併的時機,在適當的條件下進行段合併:

  • index.merge.policy.type,有效值:tiered,log_byte_size,log_doc
    • tiered:預設的合併策略,合併尺寸大致相似的段
    • log_byte_size:根據文件的位元組數量進行合併
    • log_doc:根據文件的數量進行合併

段合併的執行緒控制,以序列或併發方式執行段合併:

  • index.merge.scheduler.type,有效值:serial(序列),concurrent(併發)

合併因子控制段合併的頻率,合併因子越小,合併的頻率越高:

  • index.merge.policy.merge_factor,預設值是10

段合併調節器,限制合併的速度:

  • indices.store.throttle.type,有效值:none,merge,all
  • indices.store.throttle.max_bytes_per_sec:預設值10mb

四,叢集的網路配置

1,結點的IP地址配置

配置當前結點繫結的IP地址,預設為0.0.0.0

network.bind_host: 192.168.0.1

設定其它結點和該結點互動的ip地址,如果不設定它會自動判斷,值必須是個真實的ip地址

network.publish_host: 192.168.0.1

同時設定bind_host和publish_host兩個引數

network.host: 192.168.0.1

2,設定結點間互動的TCP埠,預設是9300

transport.tcp.port: 9300

3,設定對外服務的HTTP埠,預設為9200

http.port: 9200

4,設定是否壓縮TCP傳輸時的資料,預設為false,不壓縮

transport.tcp.compress: true

5,設定HTTP包內容的最大容量,預設100mb

http.max_content_length: 100mb

6,是否啟用HTTP協議對外提供服務,預設為true,開啟

http.enabled: true

五,叢集的發現機制(Discovery)

ElasticSearch使用zen發現來尋找結點和選舉主結點,組建叢集;zen發現預設使用多播,但是,單播發現比較安全,推薦使用單播發現。

1,配置多播(multicast)

多播(multicast)是zen發現的預設方法,主要有以下配置選項:

  • discovery.zen.ping.multicast.group:用於多播請求的群組地址,預設值是224.2.2.4;
  • discovery.zen.ping.multicast.port:設定多播通訊的埠,預設值是54328;
  • discovery.zen.ping.multicast.ttl;設定多播請求被認為有效的時間,預設值是3s;
  • discovery.zen.ping.multicast.address:設定ElasticSearch繫結的網路介面,預設為null,意味著ElasticSearch嘗試繫結所有網路介面;
  • discovery.zen.ping.multicast.enable:啟用或禁用多播;

2,配置單播(unicast)

使用單播時,總是禁用多播,單播的配置選項:

discovery.zen.ping.unicast. hosts:指定接收單播請求的主機IP地址,推薦包含組成叢集的所有主機,主機之間用逗號隔開;

discovery.zen.ping.multicast.enabled: false
discovery.zen.ping.unicast.hosts: ["host1", "host2:port"]

3,結點之間的狀態檢測

ping是結點之間傳送的心跳訊號,用於檢測其他結點是否健康執行,如果其他結點無法響應該訊號,那麼叢集認為該結點發生故障,配置ping訊號的屬性:

  • discovery.zen.fd.ping_interval:預設為1s,設定結點之間互相ping訊號的時間間隔;
  • discovery.zen.fd.ping_timeout:預設為30s,設定當前結點發送ping訊號後等待目標結點響應的時間,超過該時間,當前結點認為目標結點無法響應;
  • discovery.zen.fd.ping_retries:預設為3次,設定重試次數,超過此次數之後,判定目標結點出現故障,停止工作;
  • discovery.zen.ping.timeout: 預設值是3s,設定當前結點等待其他結點的ping訊號的超時時間;

六,本地閘道器(Gateway)和還原(Recovery)

閘道器用於持久化儲存叢集的資料,包括叢集的狀態,索引和索引裡面的資料,索引的型別對映和索引級別的配置資訊等元資料,閘道器相當於關係型DB的事務日誌。每一次叢集資料的改變,ElasticSearch都將叢集的資料儲存到閘道器中。當叢集重新啟動時,它將會從閘道器中讀取叢集的資料,還原到上一次停機時的狀態。

1,閘道器的型別

目前只支援local型別(本地閘道器),在本地檔案系統中儲存索引及其元資料;

gateway.type: local

2,還原控制

還原控制的選項有:

  • gateway.recover_after_nodes:3,表示當叢集中有3個結點之後,允許執行還原程序;
  • gateway.recover_after_time:10m,表示當叢集滿足gateway.recover_after_nodes屬性(叢集中至少有3個結點)之後,ElasticSearch在10分鐘之後開始執行還原程序;
  • gateway.expected_nodes:5,設定叢集期望的結點數量,當叢集中結點的數目等於5,並且滿足gateway.recover_after_nodes屬性(叢集中至少有3個結點)時,ElasticSearch將立即執行還原程序;
  • 閘道器對資料結點和主結點的還原控制:
    • gateway.recover_after_master_nodes 和 gateway.expected_master_nodes
    • gateway.recover_after_data_nodes 和 gateway.expected_data_nodes

3,保護動作

預設情況下,ElasticSearch自動建立索引,推薦關閉該選項

action.disable_close_all_indices: true
action.disable_delete_all_indices: true
action.disable_shutdown: true
action.auto_create_index: false

4,還原限制(Recovery Throttling)

  • cluster.routing.allocation.node_initial_primaries_recoveries: 4,在初始化還原期間,控制單個結點中執行並行還原程序的數量;
  • cluster.routing.allocation.node_concurrent_recoveries: 2,在增加/移除結點,重平衡期間,控制單個結點中執行並行還原程序的數量;
  • indices.recovery.max_bytes_per_sec: 100mb,在還原時,吞吐量的上限,預設值是20MB;
  • indices.recovery.concurrent_streams: 5,在還原分片時,設定開啟的併發流的上限;

七,執行緒池配置

Elasticsearch公開兩種型別的執行緒池:

  • cache:無限制的執行緒池,為每個請求建立一個執行緒;
  • fixed:固定大小的執行緒池,大小由size屬性指定,

對於固定大小的執行緒池型別,必須為ElasticSearch指定一個請求佇列(queue)用來儲存請求,請求被儲存到佇列中,直到有一個空閒的執行緒來執行請求;如果佇列滿了,ElasticSearch無法把請求存放到佇列中,該請求將被拒絕;

  • threadpool.index.type: fixed
  • threadpool.index.size: 100
  • threadpool.index.queue_size: 500

附言:

ElasticSearch引擎的配置選項非常多,並且要真正理解這些配置選項對引擎的影響,也不是一件容易的事,不過,不用擔心,在使用ElasticSearch時,真正需要修改配置選項的情況少之又少,所以,通常使用預設的配置就能滿足生產環境的要求,ElasticSearch重要配置示例:

複製程式碼
## cluster
cluster.name: "my-es-cluster"

## node
node.name: "node-1"
node.master: true
node.data: true

## index
index.number_of_shards: 1
index.number_of_replicas: 0

## memory
bootstrap.mlockall: true

## network
network.host: 192.168.0.1
transport.tcp.port: 9300
http.port: 9200

## discovery
discovery.zen.minimum_master_nodes: 1
discovery.zen.ping.multicast.enabled: false
discovery.zen.ping.unicast.hosts: ["host1", "host2:port"]

## protection
action.auto_create_index: false

## scripting
script.inline: true
script.indexed: true
複製程式碼

參考文件: