ElasticSearch入門 第二篇:集羣配置

這是ElasticSearch 2.4 版本系列的第二篇:html

 

ElasticSearch共有兩個配置文件,都位於config目錄下,分別是elasticsearch.yml和logging.yml,其中,elasticsearch.yml 是全局配置文件,用於在服務器級別對ElasticSearch進行配置。ElasticSearch的配置選項分爲靜態設置和動態設置兩種,靜態設置必須在結點級別(node-level)設置,或配置在elasticsearch.yml配置文件中,或配置在環境變量中,或配置在命令行中,在結點啓動以後,靜態設置不能修改。集羣的名字和結點的名稱:cluster.name 和 node.name,這兩個配置項是靜態配置項,不能在集羣運行時修改,而動態配置項能夠在集羣運行時經過RESTful API進行修改。java

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

經過 cluster.name 屬性配置集羣的名字,用於惟一標識一個集羣,不一樣的集羣,其 cluster.name 不一樣,集羣名字相同的全部節點自動組成一個集羣。若是不配置改屬性,默認值是:elasticsearch。當啓動一個結點時,該結點會自動尋找相同集羣名字的主結點;若是找到主結點,該結點加入集羣中;若是未找到主結點,該結點成爲主結點。正則表達式

注意:在yml中對Elasticsearch進行全局配置,要注意配置選項的格式:option: value,在「:」以後保留一個空格,以後是選項值;配置選項不要有前置空格。bootstrap

配置集羣的名字爲myesclusterwindows

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

 

參考文檔:

Elasticsearch Reference [2.4] » Setup » Configuration

Elasticsearch Reference [2.4] » Modules

Elasticsearch Reference [2.4] » Modules » Node

Install and configure Elasticsearch in Windows

Important Elasticsearch configuration

elasticsearch.yml配置文件

相關文章
相關標籤/搜索