1. 程式人生 > >Elasticsearch基本概念及核心配置文件詳解

Elasticsearch基本概念及核心配置文件詳解

last log4j 強烈 內存 文檔 size oca 機制 集群

  Elasticsearch5.X,下列的是Elasticsearch2.X系類配置,其實很多配置都是相互兼容的

1. 配置文件

config/elasticsearch.yml   主配置文件
config/jvm.options         jvm參數配置文件
cofnig/log4j2.properties 日誌配置文件

2. 基本概念

接近實時(NRT)

  • Elasticsearch 是一個接近實時的搜索平臺。這意味著,從索引一個文檔直到這個文檔能夠被搜索到有一個很小的延遲(通常是 1 秒)。

集群(cluster)

  • 代表一個集群,集群中有多個節點(node),其中有一個為主節點,這個主節點是可以通過選舉產生的
    ,主從節點是對於集群內部來說的。es的一個概念就是去中心化,字面上理解就是無中心節點,這是對於集群外部來說的,因為從外部來看es集群,在邏輯上是個整體,你與任何一個節點的通信和與整個es集群通信是等價的。

索引(index)

  • ElasticSearch將它的數據存儲在一個或多個索引(index)中。用SQL領域的術語來類比,索引就像數據庫,可以向索引寫入文檔或者從索引中讀取文檔,並通過ElasticSearch內部使用Lucene將數據寫入索引或從索引中檢索數據。

文檔(document)

  • 文檔(document)是ElasticSearch中的主要實體。對所有使用ElasticSearch的案例來說,他們最終都可以歸結為對文檔的搜索。文檔由字段構成。

映射(mapping)

  • 所有文檔寫進索引之前都會先進行分析,如何將輸入的文本分割為詞條、哪些詞條又會被過濾,這種行為叫做映射(mapping)。一般由用戶自己定義規則。

類型(type)

  • 每個文檔都有與之對應的類型(type)定義。這允許用戶在一個索引中存儲多種文檔類型,並為不同文檔提供類型提供不同的映射。

分片(shards)

  • 代表索引分片,es可以把一個完整的索引分成多個分片,這樣的好處是可以把一個大的索引拆分成多個,分布到不同的節點上。構成分布式搜索。分片的數量只能在索引創建前指定,並且索引創建後不能更改。5.X默認不能通過配置文件定義分片

副本(replicas)

  • 代表索引副本,es可以設置多個索引的副本,副本的作用一是提高系統的容錯性,當個某個節點某個分片損壞或丟失時可以從副本中恢復。二是提高es的查詢效率,es會自動對搜索請求進行負載均衡。

數據恢復(recovery)

  • 代表數據恢復或叫數據重新分布,es在有節點加入或退出時會根據機器的負載對索引分片進行重新分配,掛掉的節點重新啟動時也會進行數據恢復。
  • GET /_cat/health?v #可以看到集群狀態

數據源(River)

  • 代表es的一個數據源,也是其它存儲方式(如:數據庫)同步數據到es的一個方法。它是以插件方式存在的一個es服務,通過讀取river中的數據並把它索引到es中,官方的river有couchDB的,RabbitMQ的,Twitter的,Wikipedia的,river這個功能將會在後面的文件中重點說到。

網關(gateway)

  • 代表es索引的持久化存儲方式,es默認是先把索引存放到內存中,當內存滿了時再持久化到硬盤。當這個es集群關閉再重新啟動時就會從gateway中讀取索引數據。es支持多種類型的gateway,有本地文件系統(默認),分布式文件系統,Hadoop的HDFS和amazon的s3雲存儲服務。

自動發現(discovery.zen)

  • 代表es的自動發現節點機制,es是一個基於p2p的系統,它先通過廣播尋找存在的節點,再通過多播協議來進行節點之間的通信,同時也支持點對點的交互。
  • 5.X關閉廣播,需要自定義

通信(Transport)

  • 代表es內部節點或集群與客戶端的交互方式,默認內部是使用tcp協議進行交互,同時它支持http協議(json格式)、thrift、servlet、memcached、zeroMQ等的傳輸協議(通過插件方式集成)。
  • 節點間通信端口默認:9300-9400

分片和復制(shards and replicas)

  一個索引可以存儲超出單個結點硬件限制的大量數據。比如,一個具有10億文檔的索引占據1TB的磁盤空間,而任一節點可能沒有這樣大的磁盤空間來存儲或者單個節點處理搜索請求,響應會太慢。

為了解決這個問題,Elasticsearch提供了將索引劃分成多片的能力,這些片叫做分片。當你創建一個索引的時候,你可以指定你想要的分片的數量。每個分片本身也是一個功能完善並且獨立的“索引”,這個“索引” 可以被放置到集群中的任何節點上。

分片之所以重要,主要有兩方面的原因:

  • 允許你水平分割/擴展你的內容容量
  • 允許你在分片(位於多個節點上)之上進行分布式的、並行的操作,進而提高性能/吞吐量
    至於一個分片怎樣分布,它的文檔怎樣聚合回搜索請求,是完全由Elasticsearch管理的,對於作為用戶的你來說,這些都是透明的。

在一個網絡/雲的環境裏,失敗隨時都可能發生。在某個分片/節點因為某些原因處於離線狀態或者消失的情況下,故障轉移機制是非常有用且強烈推薦的。為此, Elasticsearch允許你創建分片的一份或多份拷貝,這些拷貝叫做復制分片,或者直接叫復制。

復制之所以重要,有兩個主要原因:

  • 在分片/節點失敗的情況下,復制提供了高可用性。復制分片不與原/主要分片置於同一節點上是非常重要的。因為搜索可以在所有的復制上並行運行,復制可以擴展你的搜索量/吞吐量
  • 總之,每個索引可以被分成多個分片。一個索引也可以被復制0次(即沒有復制) 或多次。一旦復制了,每個索引就有了主分片(作為復制源的分片)和復制分片(主分片的拷貝)。
  • 分片和復制的數量可以在索引創建的時候指定。在索引創建之後,你可以在任何時候動態地改變復制的數量,但是你不能再改變分片的數量。
  • 5.X默認5:1 5個主分片,1個復制分片

默認情況下,Elasticsearch中的每個索引分配5個主分片和1個復制。這意味著,如果你的集群中至少有兩個節點,你的索引將會有5個主分片和另外5個復制分片(1個完全拷貝),這樣每個索引總共就有10個分片。


elasticsearch . yml 詳解


##################### Elasticsearch Configuration Example ##################### 
#
# 只是挑些重要的配置選項進行註釋,其實自帶的已經有非常細致的英文註釋了!
# https://www.elastic.co/guide/en/elasticsearch/reference/current/modules.html
#
################################### Cluster ################################### 
# 代表一個集群,集群中有多個節點,其中有一個為主節點,這個主節點是可以通過選舉產生的,主從節點是對於集群內部來說的. 
# es的一個概念就是去中心化,字面上理解就是無中心節點,這是對於集群外部來說的,因為從外部來看es集群,在邏輯上是個整體,你與任何一個節點的通信和與整個es集群通信是等價的。 
# cluster.name可以確定你的集群名稱,當你的elasticsearch集群在同一個網段中elasticsearch會自動的找到具有相同cluster.name的elasticsearch服務. 
# 所以當同一個網段具有多個elasticsearch集群時cluster.name就成為同一個集群的標識. 

# cluster.name: elasticsearch 

#################################### Node ##################################### 
# https://www.elastic.co/guide/en/elasticsearch/reference/5.1/modules-node.html#master-node
# 節點名稱同理,可自動生成也可手動配置. 
# node.name: node-1

# 允許一個節點是否可以成為一個master節點,es是默認集群中的第一臺機器為master,如果這臺機器停止就會重新選舉master. 
# node.master: true 

# 允許該節點存儲數據(默認開啟) 
# node.data: true 

# 配置文件中給出了三種配置高性能集群拓撲結構的模式,如下: 
# 1. 如果你想讓節點從不選舉為主節點,只用來存儲數據,可作為負載器 
# node.master: false 
# node.data: true 
# node.ingest: true  #默認true

# 2. 如果想讓節點成為主節點,且不存儲任何數據,並保有空閑資源,可作為協調器 
# node.master: true 
# node.data: false
# node.ingest: true

# 3. 如果想讓節點既不稱為主節點,又不成為數據節點,那麽可將他作為搜索器,從節點中獲取數據,生成搜索結果等 
# node.master: false 
# node.data: false 
# node.ingest: true
#
# 4. 僅作為協調器 # node.master: false # node.data: false # node.ingest: false # 監控集群狀態有一下插件和API可以使用: # Use the Cluster Health API [http://localhost:9200/_cluster/health], the # Node Info API [http://localhost:9200/_nodes] or GUI tools # such as <http://www.elasticsearch.org/overview/marvel/>, # A node can have generic attributes associated with it, which can later be used # for customized shard allocation filtering, or allocation awareness. An attribute # is a simple key value pair, similar to node.key: value, here is an example: # 每個節點都可以定義一些與之關聯的通用屬性,用於後期集群進行碎片分配時的過濾 # node.rack: rack314 # 默認情況下,多個節點可以在同一個安裝路徑啟動,如果你想讓你的es只啟動一個節點,可以進行如下設置 # node.max_local_storage_nodes: 1 #################################### Index #################################### # 設置索引的分片數,默認為5 #index.number_of_shards: 5 # 設置索引的副本數,默認為1: #index.number_of_replicas: 1 # 配置文件中提到的最佳實踐是,如果服務器夠多,可以將分片提高,盡量將數據平均分布到大集群中去 # 同時,如果增加副本數量可以有效的提高搜索性能 # 需要註意的是,"number_of_shards" 是索引創建後一次生成的,後續不可更改設置 # "number_of_replicas" 是可以通過API去實時修改設置的 #################################### Paths #################################### # 配置文件存儲位置 # path.conf: /path/to/conf # 數據存儲位置(單個目錄設置) # path.data: /path/to/data # 多個數據存儲位置,有利於性能提升 # path.data: /path/to/data1,/path/to/data2 # 臨時文件的路徑 # path.work: /path/to/work # 日誌文件的路徑 # path.logs: /path/to/logs # 插件安裝路徑 # path.plugins: /path/to/plugins #################################### Plugin ################################### # 設置插件作為啟動條件,如果一下插件沒有安裝,則該節點服務不會啟動 # plugin.mandatory: mapper-attachments,lang-groovy ################################### Memory #################################### # 當JVM開始寫入交換空間時(swapping)ElasticSearch性能會低下,你應該保證它不會寫入交換空間 # 設置這個屬性為true來鎖定內存,同時也要允許elasticsearch的進程可以鎖住內存,linux下可以通過 `ulimit -l unlimited` 命令 # bootstrap.mlockall: true # 確保 ES_MIN_MEM 和 ES_MAX_MEM 環境變量設置為相同的值,以及機器有足夠的內存分配給Elasticsearch # 註意:內存也不是越大越好,一般64位機器,最大分配內存別才超過32G ############################## Network And HTTP ############################### # 設置綁定的ip地址,可以是ipv4或ipv6的,默認為0.0.0.0 # network.bind_host: 192.168.0.1 #只有本機可以訪問http接口 # 設置其它節點和該節點交互的ip地址,如果不設置它會自動設置,值必須是個真實的ip地址 # network.publish_host: 192.168.0.1 # 同時設置bind_host和publish_host上面兩個參數 # network.host: 192.168.0.1 #綁定監聽IP # 設置節點間交互的tcp端口,默認是9300 # transport.tcp.port: 9300 # 設置是否壓縮tcp傳輸時的數據,默認為false,不壓縮 # transport.tcp.compress: true # 設置對外服務的http端口,默認為9200 # http.port: 9200 # 設置請求內容的最大容量,默認100mb # http.max_content_length: 100mb # 使用http協議對外提供服務,默認為true,開啟 # http.enabled: false ###################### 使用head等插件監控集群信息,需要打開以下配置項 ########### # http.cors.enabled: true # http.cors.allow-origin: "*" # http.cors.allow-credentials: true ################################### Gateway ################################### # gateway的類型,默認為local即為本地文件系統,可以設置為本地文件系統 # gateway.type: local # 下面的配置控制怎樣以及何時啟動一整個集群重啟的初始化恢復過程 # (當使用shard gateway時,是為了盡可能的重用local data(本地數據)) # 一個集群中的N個節點啟動後,才允許進行恢復處理 # gateway.recover_after_nodes: 1 # 設置初始化恢復過程的超時時間,超時時間從上一個配置中配置的N個節點啟動後算起 # gateway.recover_after_time: 5m # 設置這個集群中期望有多少個節點.一旦這N個節點啟動(並且recover_after_nodes也符合), # 立即開始恢復過程(不等待recover_after_time超時) # gateway.expected_nodes: 2 ############################# Recovery Throttling ############################# # 下面這些配置允許在初始化恢復,副本分配,再平衡,或者添加和刪除節點時控制節點間的分片分配 # 設置一個節點的並行恢復數 # 1.初始化數據恢復時,並發恢復線程的個數,默認為4 # cluster.routing.allocation.node_initial_primaries_recoveries: 4 # 2.添加刪除節點或負載均衡時並發恢復線程的個數,默認為2 # cluster.routing.allocation.node_concurrent_recoveries: 2 # 設置恢復時的吞吐量(例如:100mb,默認為0無限制.如果機器還有其他業務在跑的話還是限制一下的好) # indices.recovery.max_bytes_per_sec: 20mb # 設置來限制從其它分片恢復數據時最大同時打開並發流的個數,默認為5 # indices.recovery.concurrent_streams: 5 # 註意: 合理的設置以上參數能有效的提高集群節點的數據恢復以及初始化速度 ################################## Discovery ################################## # 設置這個參數來保證集群中的節點可以知道其它N個有master資格的節點.默認為1,對於大的集群來說,可以設置大一點的值(2-4) # discovery.zen.minimum_master_nodes: 1 # 探查的超時時間,默認3秒,提高一點以應對網絡不好的時候,防止腦裂 # discovery.zen.ping.timeout: 3s # For more information, see # <http://elasticsearch.org/guide/en/elasticsearch/reference/current/modules-discovery-zen.html> # 設置是否打開多播發現節點.默認是true. # 當多播不可用或者集群跨網段的時候集群通信還是用單播吧 # discovery.zen.ping.multicast.enabled: false # 這是一個集群中的主節點的初始列表,當節點(主節點或者數據節點)啟動時使用這個列表進行探測 # discovery.zen.ping.unicast.hosts: ["host1", "host2:port"] # Slow Log部分與GC log部分略,不過可以通過相關日誌優化搜索查詢速度 ################ X-Pack ########################################### # 官方插件 相關設置請查看此處 # https://www.elastic.co/guide/en/x-pack/current/xpack-settings.html # ############## Memory(重點需要調優的部分) ################ # Cache部分: # es有很多種方式來緩存其內部與索引有關的數據.其中包括filter cache # filter cache部分: # filter cache是用來緩存filters的結果的.默認的cache type是node type.node type的機制是所有的索引內部的分片共享filter cache.node type采用的方式是LRU方式.即:當緩存達到了某個臨界值之後,es會將最近沒有使用的數據清除出filter cache.使讓新的數據進入es. # 這個臨界值的設置方法如下:indices.cache.filter.size 值類型:eg.:512mb 20%。默認的值是10%。 # out of memory錯誤避免過於頻繁的查詢時集群假死 # 1.設置es的緩存類型為Soft Reference,它的主要特點是據有較強的引用功能.只有當內存不夠的時候,才進行回收這類內存,因此在內存足夠的時候,它們通常不被回收.另外,這些引用對象還能保證在Java拋出OutOfMemory異常之前,被設置為null.它可以用於實現一些常用圖片的緩存,實現Cache的功能,保證最大限度的使用內存而不引起OutOfMemory.在es的配置文件加上index.cache.field.type: soft即可. # 2.設置es最大緩存數據條數和緩存失效時間,通過設置index.cache.field.max_size: 50000來把緩存field的最大值設置為50000,設置index.cache.field.expire: 10m把過期時間設置成10分鐘. # index.cache.field.max_size: 50000 # index.cache.field.expire: 10m # index.cache.field.type: soft # field data部分&&circuit breaker部分: # 用於fielddata緩存的內存數量,主要用於當使用排序,faceting操作時,elasticsearch會將一些熱點數據加載到內存中來提供給客戶端訪問,但是這種緩存是比較珍貴的,所以對它進行合理的設置. # 可以使用值:eg:50mb 或者 30%(節點 node heap內存量),默認是:unbounded #indices.fielddata.cache.size: unbounded # field的超時時間.默認是-1,可以設置的值類型: 5m #indices.fielddata.cache.expire: -1 # circuit breaker部分: # 斷路器是elasticsearch為了防止內存溢出的一種操作,每一種circuit breaker都可以指定一個內存界限觸發此操作,這種circuit breaker的設定有一個最高級別的設定:indices.breaker.total.limit 默認值是JVM heap的70%.當內存達到這個數量的時候會觸發內存回收 # 另外還有兩組子設置: #indices.breaker.fielddata.limit:當系統發現fielddata的數量達到一定數量時會觸發內存回收.默認值是JVM heap的70% #indices.breaker.fielddata.overhead:在系統要加載fielddata時會進行預先估計,當系統發現要加載進內存的值超過limit * overhead時會進行進行內存回收.默認是1.03 #indices.breaker.request.limit:這種斷路器是elasticsearch為了防止OOM(內存溢出),在每次請求數據時設定了一個固定的內存數量.默認值是40% #indices.breaker.request.overhead:同上,也是elasticsearch在發送請求時設定的一個預估系數,用來防止內存溢出.默認值是1 # Translog部分: # 每一個分片(shard)都有一個transaction log或者是與它有關的預寫日誌,(write log),在es進行索引(index)或者刪除(delete)操作時會將沒有提交的數據記錄在translog之中,當進行flush 操作的時候會將tranlog中的數據發送給Lucene進行相關的操作.一次flush操作的發生基於如下的幾個配置 #index.translog.flush_threshold_ops:當發生多少次操作時進行一次flush.默認是 unlimited #index.translog.flush_threshold_size:當translog的大小達到此值時會進行一次flush操作.默認是512mb #index.translog.flush_threshold_period:在指定的時間間隔內如果沒有進行flush操作,會進行一次強制flush操作.默認是30m #index.translog.interval:多少時間間隔內會檢查一次translog,來進行一次flush操作.es會隨機的在這個值到這個值的2倍大小之間進行一次操作,默認是5s #index.gateway.local.sync:多少時間進行一次的寫磁盤操作,默認是5s # 以上的translog配置都可以通過API進行動態的設置 - See more at: http://bigbo.github.io/pages/2015/04/10/elasticsearch_config/#sthash.AvOSUcQ4.dpuf

引用:

http://blog.csdn.net/zxf_668899/article/details/54582849

Elasticsearch基本概念及核心配置文件詳解