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
參考文件: