ElasticSearch配置


轉自:http://www.cnblogs.com/ljhdo/p/4959412.html

 

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: true
node.data: false

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:

三,索引配置

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.expected_nodes:5,設置集群期望的結點數量,當集群中結點的數目等於5,並且滿足gateway.recover_after_nodes屬性(集群中至少有3個結點)時,ElasticSearch將立即執行還原進程;
  • 網關對數據結點和主結點的還原控制:
    • gateway.recover_after_master_nodes 和 gateway.expected_master_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 2.0 開始默認單播的形式。

單播配置下

節點向指定的主機發送單播請求,配置如下:
discovery.zen.ping.multicast.enabled: false
discovery.zen.fd.ping_timeout: 100s
discovery.zen.ping.timeout: 100s
discovery.zen.minimum_master_nodes: 2
discovery.zen.ping.unicast.hosts: [“172.31.26.200”, “172.31.26.222”]

多播配置下

意思就是說,你只需要在每個節點配置好了集群名稱,節點名稱,互相通信的節點會根據es自定義的服務發現協議去按照多播的方式來尋找網絡上配置在同樣集群內的節點。和其他的服務發現功能一樣,es是支持多播和單播的。多播和單播的配置分別根據這幾個參數:
discovery.zen.ping.multicast.enabled: true
discovery.zen.fd.ping_timeout: 100s
discovery.zen.ping.timeout: 100s
discovery.zen.minimum_master_nodes: 2
discovery.zen.ping.unicast.hosts: [“172.31.26.200”]
discovery.zen.ping.multicast.enabled //這個設置把組播的自動發現給關閉了,為了防止其他機器上的節點自動連入。

discovery.zen.fd.ping_timeout和discovery.zen.ping.timeout是設置了節點與節點之間的連接ping時長
discovery.zen.minimum_master_nodes //這個設置為了避免腦裂。比如3個節點的集群,如果設置為2,那么當一台節點脫離后,不會自動成為master。
discovery.zen.ping.unicast.hosts //這個設置了自動發現的節點。
action.auto_create_index: false //這個關閉了自動創建索引。為的也是安全考慮,否則即使是內網,也有很多掃描程序,一旦開啟,掃描程序會自動給你創建很多索引。

關於es 單播和多播的選擇

多播是需要看服務器是否支持的,由於其安全性,其實現在基本的雲服務(比如阿里雲)是不支持多播的,所以即使你開啟了多播模式,你也僅僅只能找到本機上的節點。單播模式安全,也高效,但是缺點就是如果增加了一個新的機器的話,就需要每個節點上進行配置才生效了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM