這是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.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目錄,通常狀況下不須要對結點路徑單獨配置。結點的文件路徑配置項:
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"
上面兩個值是分配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將阻止該操做繼續使用內存。設置較多,通常不須要修改,保持默認值:
4,字段數據緩存
在對一個字段執行排序或聚合操做時,使用字段數據緩存(field data cache)將該字段的值加載到內存,以加快查詢的速度。加載字段數據還原是IO密集的操做,推薦分配足夠的內存,而且不分配過時時間:
5,結點查詢緩存:
查詢緩存用於緩存查詢的結果,每個節點都有一個查詢緩存,緩存過時使用LRU淘汰策略(Least Recently Used eviction):當緩存滿時,最近最少使用的數據被淘汰,從緩存中清除,以存儲新的數據。
6,索引緩存
索引緩存用於存儲最新的索引文檔(newly indexed documents),當該緩存填充滿時,緩存的文件將被寫入到磁盤中的段(segment)中。
7,分片請求緩存:
當對一個索引執行查找請求(Search Request)時,每個相關的分片(involved shard)都在本地執行查詢,返回查詢結果(local result)給協調結點(coordinating node)進行組合(combine),將各個分片的結果合併爲最終的結果集返回。分片請求緩存對每一個分片的查詢結果進行緩存。
8,索引的刷新頻率
索引對象刷新的頻率,刷新頻率越低,文檔對搜索操做可視的時間越長:
9,段(Segment)合併
每一個索引分爲多個段(Segment),一個段寫入硬盤後,就不能再被更新,所以,被刪除文檔的信息存儲在一個單獨的文件中。ElasticSearch支持文檔的更新,在底層,其實是刪除舊文檔,再把更新內存的文檔編入索引。在查找時,須要從返回結果中過濾掉已刪除的文檔。
若是數據更新或刪除的數據比較多,那麼每一個段中的有效數據密度會變低,下降了查詢的性能,經過段合併,將已刪除的數據從段(Segment)中物理刪除,可以提升搜索性能,合併的過程是:底層的Lucene庫獲取若干段,從段中過濾已刪除的數據,保存到一個新的段上;段合併完成以後,將源段從硬盤上物理刪除;段合併操做的CPU和IO的消耗是很是高的,必須控制段合併執行的頻率和時機。
段合併的策略控制段合併的時機,在適當的條件下進行段合併:
段合併的線程控制,以串行或併發方式執行段合併:
合併因子控制段合併的頻率,合併因子越小,合併的頻率越高:
段合併調節器,限制合併的速度:
四,集羣的網絡配置
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發現的默認方法,主要有如下配置選項:
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信號的屬性:
六,本地網關(Gateway)和還原(Recovery)
網關用於持久化存儲集羣的數據,包括集羣的狀態,索引和索引裏面的數據,索引的類型映射和索引級別的配置信息等元數據,網關至關於關係型DB的事務日誌。每一次集羣數據的改變,ElasticSearch都將集羣的數據存儲到網關中。當集羣從新啓動時,它將會從網關中讀取集羣的數據,還原到上一次停機時的狀態。
1,網關的類型
目前只支持local類型(本地網關),在本地文件系統中存儲索引及其元數據;
gateway.type: local
2,還原控制
還原控制的選項有:
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)
七,線程池配置
Elasticsearch公開兩種類型的線程池:
對於固定大小的線程池類型,必須爲ElasticSearch指定一個請求隊列(queue)用來保存請求,請求被存儲到隊列中,直到有一個空閒的線程來執行請求;若是隊列滿了,ElasticSearch沒法把請求存放到隊列中,該請求將被拒絕;
附言:
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