Elasticsearch相關配置(二)


一、關於elasticsearch的基本概念

term
  索引詞,在elasticsearch中索引詞(term)是一個能夠被索引的精確值。foo,Foo Foo幾個單詞是不相同的索引詞。索引詞(term)是可以通過term查詢進行准確的搜索。

text
  文本是一段普通的非結構化文字,通常,文本會被分析稱一個個的索引詞,存儲在elasticsearch的索引庫中,為了讓文本能夠進行搜索,文本字段需要事先進行分析;當對文本中的關鍵詞進行查詢的時候,搜索引擎應該根據搜索條件搜索出原文本。

analysis
  分析是將文本轉換為索引詞的過程,分析的結果依賴於分詞器,比如: FOO BAR, Foo-Bar, foo bar這幾個單詞有可能會被分析成相同的索引詞foo和bar,這些索引詞存儲在elasticsearch的索引庫中。當用 FoO:bAR進行全文搜索的時候,搜索引擎根據匹配計算也能在索引庫中搜索出之前的內容。這就是elasticsearch的搜索分析。

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

node
  每一個運行實例稱為一個節點,每一個運行實例既可以在同一機器上,也可以在不同的機器上。
  所謂運行實例,就是一個服務器進程,在測試環境中可以在一台服務器上運行多個服務器進程,在生產環境中建議每台服務器運行一個服務器進程。

routing
  路由,當存儲一個文檔的時候,他會存儲在一個唯一的主分片中,具體哪個分片是通過散列值的進行選擇。默認情況下,這個值是由文檔的id生成。如果文檔有一個指定的父文檔,從父文檔ID中生成,該值可以在存儲文檔的時候進行修改。

index
  Elasticsearch里的索引概念是名詞而不是動詞,在elasticsearch里它支持多個索引。 一個索引就是一個擁有相似特征的文檔的集合。比如說,你可以有一個客戶數據的索引,另一個產品目錄的索引,還有一個訂單數據的索引。一個索引由一個名字來 標識(必須全部是小寫字母的),並且當我們要對這個索引中的文檔進行索引、搜索、更新和刪除的時候,都要使用到這個名字。在一個集群中,你能夠創建任意多個索引。

type
  代表類型,在一個索引中,你可以定義一種或多種類型。一個類型是你的索引的一個邏輯上的分類/分區,其語義完全由你來定。通常,會為具有一組相同字段的文檔定義一個類型。比如說,我們假設你運營一個博客平台 並且將你所有的數據存儲到一個索引中。在這個索引中,你可以為用戶數據定義一個類型,為博客數據定義另一個類型,當然,也可以為評論數據定義另一個類型。

document
  一個文檔是一個可被索引的基礎信息單元。比如,你可以擁有某一個客戶的文檔、某一個產品的一個文檔、某個訂單的一個文檔。文檔以JSON格式來表示,而JSON是一個到處存在的互聯網數據交互格式。
在一個index/type里面,你可以存儲任意多的文檔。注意,一個文檔物理上存在於一個索引之中,但文檔必須被索引/賦予一個索引的type。

shards
  代表索引分片,es可以把一個完整的索引分成多個分片,這樣的好處是可以把一個大的索引拆分成多個,分布到不同的節點上。構成分布式搜索。分片的數量只能在索引創建前指定,並且索引創建后不能更改。

primary shard
  主分片,每個文檔都存儲在一個分片中,當你存儲一個文檔的時候,系統會首先存儲在主分片中,然后會復制到不同的副本中。默認情況下,一個索引有5個主分片。你可以在事先制定分片的數量,當分片一旦建立,分片的數量則不能修改。

replica shard
  副本分片,每一個分片有零個或多個副本。副本主要是主分片的復制,其中有兩個目的:
    1、增加高可用性:當主分片失敗的時候,可以從副本分片中選擇一個作為主分片。
    2、提高性能:當查詢的時候可以到主分片或者副本分片中進行查詢。默認情況下,一個主分配有一個副本,但副本的數量可以在后面動態的配置增加。副本必須部署在不同的節點上,不能部署在和主分片相同的節點上。

template
  
索引可使用預定義的模板進行創建,這個模板稱作Index templates。模板設置包括settings和mappings。

mapping
  映射像關系數據庫中的表結構,每一個索引都有一個映射,它定義了索引中的每一個字段類型,以及一個索引范圍內的設置。一個映射可以事先被定義,或者在第一次存儲文檔的時候自動識別。

field
  一個文檔中包含零個或者多個字段,字段可以是一個簡單的值(例如字符串、整數、日期),也可以是一個數組或對象的嵌套結構。字段類似於關系數據庫中的表中的列。每個字段都對應一個字段類型,例如整數、字符串、對象等。字段還可以指定如何分析該字段的值。

source field
  默認情況下,你的原文檔將被存儲在_source這個字段中,當你查詢的時候也是返回這個字段。這允許您可以從搜索結果中訪問原始的對象,這個對象返回一個精確的json字符串,這個對象不顯示索引分析后的其他任何數據。

id
  id是一個文件的唯一標識,如果在存庫的時候沒有提供id,系統會自動生成一個id,文檔的index/type/id必須是唯一的。

recovery
  代表數據恢復或叫數據重新分布,es在有節點加入或退出時會根據機器的負載對索引分片進行重新分配,掛掉的節點重新啟動時也會進行數據恢復。

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的系統,它先通過廣播尋找存在的節點,再通過多播協議來進行節點之間的通信,同時也支持點對點的交互。

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

 

二、elasticsearch 的配置文件詳細配置講解

  elasticsearch的配置文件是在elasticsearch目錄下的config文件下的elasticsearch.yml,同時它的日志文件在elasticsearch目錄下的logs,由於elasticsearch的日志也是使用log4j來寫日志的,所以其配置模式與log4j基本相同。所以主要詳述

elasticsearch.yml中的內容,當然也可以查看官方文檔。

Cluster部分

cluster.name: elasticsearch (默認值:elasticsearch)
cluster.name可以確定你的集群名稱,當你的elasticsearch集群在同一個網段中elasticsearch會自動的找到具有相同cluster.name 的elasticsearch服務。所以當同一個網段具有多個elasticsearch集群時cluster.name就成為同一個集群的標識。

 

Node部分

node.name: “Franz Kafka”  節點名,可自動生成也可手動配置。 node.master: true (默認值:true)  允許一個節點是否可以成為一個master節點,es是默認集群中的第一台機器為master,如果這台機器停止就會重新選舉master。 node.client  當該值設置為true時,node.master值自動設置為false,不參加master選舉。 node.data: true (默認值:true)  允許該節點存儲數據。 node.rack  無默認值,為節點添加自定義屬性。 node.max_local_storage_nodes: 1 (默認值:1) 設置能運行的節點數目,一般采用默認的1即可,因為我們一般也只在一台機子上部署一個節點。 配置文件中給出了三種配置高性能集群拓撲結構的模式,如下:   1、workhorse:如果你想讓節點從不選舉為主節點,只用來存儲數據,可作為負載器     node.master: false     node.data: true
  2. coordinator:如果想讓節點成為主節點,且不存儲任何數據,並保有空閑資源,可作為協調器     node.master: true     node.data: false
  3. search load balancer:( fetching data from nodes, aggregating results, etc.理解為搜索的負載均衡節點,從其他的節點收集數據或聚集后的結果等),客戶端節點可以直接將請求發到數據存在的節點,而不用查詢所有的數據節點,另外可以在它的上面可以進行數據的匯總工作,可以減輕數據節點的壓力。     node.master: false     node.data: false 
另外配置文件提到了幾種監控es集群的API或方法:   Cluster Health API:http:
//127.0.0.1:9200/_cluster/health   Node Info API:http://127.0.0.1:9200/_nodes

還有圖形化工具:   https://www.elastic.co/products/marvel   https://github.com/karmi/elasticsearch-paramedic   https://github.com/hlstudio/bigdesk   https://github.com/mobz/elasticsearch-head

 

Indices部分

index.number_of_shards: 5 (默認值為5) 設置默認索引分片個數。 index.number_of_replicas: 1(默認值為1)    設置索引的副本個數

  服務器夠多,可以將分片提高,盡量將數據平均分布到集群中,增加副本數量可以有效的提高搜索性能。
需要注意的是,"number_of_shards" 是索引創建后一次生成的,后續不可更改設置 "number_of_replicas" 是可以通過update-index-settings API實時修改設置。

Indices Circuit Breaker
  elasticsearch包含多個circuit breaker來避免操作的內存溢出。每個breaker都指定可以使用內存的限制。另外有一個父級breaker指定所有的breaker可以使用的總內存。

indices.breaker.total.limit  所有breaker使用的內存值,默認值為 JVM 堆內存的70%,當內存達到最高值時會觸發內存回收。

 

Field data circuit breaker 允許elasticsearch預算待加載field的內存,防止field數據加載引發異常。

indices.breaker.fielddata.limit  field數據使用內存限制,默認為JVM 堆的60%。 indices.breaker.fielddata.overhead  elasticsearch使用這個常數乘以所有fielddata的實際值作field的估算值。默認為 1.03。

 

請求斷路器(Request circuit breaker) 允許elasticsearch防止每個請求的數據結構超過了一定量的內存。

indices.breaker.request.limit     request數量使用內存限制,默認為JVM堆的40%。
indices.breaker.request.overhead   elasticsearch使用這個常數乘以所有request占用內存的實際值作為最后的估算值。默認為 1。

Indices Fielddata cache

  字段數據緩存主要用於排序字段和計算聚合。將所有的字段值加載到內存中,以便提供基於文檔快速訪問這些值。

indices.fielddata.cache.size:unbounded 
設置字段數據緩存的最大值,值可以設置為節點堆空間的百分比,例:30%,可以值絕對值,例:12g。默認為無限。
該設置是靜態設置,必須配置到集群的每個節點。

 

Indices Node query cache
  query cache負責緩存查詢結果,每個節點都有一個查詢緩存共享給所有的分片。緩存實現一個LRU驅逐策略:當緩存使用已滿,最近最少使用的數據將被刪除,來緩存新的數據。query cache只緩存過濾過的上下文。

indices.queries.cache.size
查詢請求緩存大小,默認為10%。也可以寫為絕對值,例:512m。
該設置是靜態設置,必須配置到集群的每個數據節點。

 

Indexing Buffer
  索引緩沖區用於存儲新索引的文檔。緩沖區寫滿,緩沖區的文件才會寫到硬盤。緩沖區划分給節點上的所有分片。
  Indexing Buffer的配置是靜態配置,必須配置都集群中的所有數據節點。

indices.memory.index_buffer_size
允許配置百分比和字節大小的值。默認10%,節點總內存堆的10%用作索引緩沖區大小。
indices.memory.min_index_buffer_size
如果index_buffer_size被設置為一個百分比,這個設置可以指定一個最小值。默認為 48mb。
indices.memory.max_index_buffer_size
如果index_buffer_size被設置為一個百分比,這個設置可以指定一個最小值。默認為無限。
indices.memory.min_shard_index_buffer_size
設置每個分片的最小索引緩沖區大小。默認為4mb。

 

Indices Shard request cache
  當一個搜索請求是對一個索引或者多個索引的時候,每一個分片都是進行它自己內容的搜索然后把結果返回到協調節點,然后把這些結果合並到一起統一對外提供。分片緩存模塊緩存了這個分片的搜索結果。這使得搜索頻率高的請求會立即返回。
  注意:請求緩存只緩存查詢條件 size=0的搜索,緩存的內容有hits.total, aggregations, suggestions,不緩存原始的hits。通過now查詢的結果將不緩存。
  緩存失效:只有在分片的數據實際上發生了變化的時候刷新分片緩存才會失效。刷新的時間間隔越長,緩存的數據越多,當緩存不夠的時候,最少使用的數據將被刪除。
  緩存過期可以手工設置,例如:

curl -XPOST 'localhost:9200/kimchy,elasticsearch/_cache/clear?request_cache=true'

 

默認情況下緩存未啟用,但在創建新的索引時可啟用,例如:

curl -XPUT localhost:9200/my_index -d' {   "settings": {     "index.requests.cache.enable": true   } } '

 

當然也可以通過動態參數配置來進行設置:

curl -XPUT localhost:9200/my_index/_settings -d' { "index.requests.cache.enable": true } '

 

每請求啟用緩存,查詢字符串參數request_cache可用於啟用或禁用每個請求的緩存。例如:

curl 'localhost:9200/my_index/_search?request_cache=true' -d' {   "size": 0,   "aggs": {     "popular_colors": {       "terms": {         "field": "colors"       }     }   } } '

注意:如果你的查詢使用了一個腳本,其結果是不確定的(例如,它使用一個隨機函數或引用當前時間)應該設置 request_cache=false 禁用請求緩存。

緩存key,數據的緩存是整個JSON,這意味着如果JSON發生了變化 ,例如如果輸出的順序順序不同,緩存的內容江將會不同。不過大多數JSON庫對JSON鍵的順序是固定的。

分片請求緩存是在節點級別進行管理的,並有一個默認的值是JVM堆內存大小的1%,可以通過配置文件進行修改。 例如: indices.requests.cache.size: 2% 
分片緩存大小的查看方式:

curl 'localhost:9200/_stats/request_cache?pretty&human'

curl 'localhost:9200/_nodes/stats/indices/request_cache?pretty&human'

 

 

Indices Recovery

indices.recovery.concurrent_streams  限制從其它分片恢復數據時最大同時打開並發流的個數。默認為 3。 indices.recovery.concurrent_small_file_streams  從其他的分片恢復時打開每個節點的小文件(小於5M)流的數目。默認為 2。 indices.recovery.file_chunk_size  默認為 512kb。 indices.recovery.translog_ops  默認為 1000。 indices.recovery.translog_size  默認為 512kb。 indices.recovery.compress  恢復分片時,是否啟用壓縮。默認為 true。 indices.recovery.max_bytes_per_sec  限制從其它分片恢復數據時每秒的最大傳輸速度。默認為 40mb。

 

Indices TTL interval

indices.ttl.interval 允許設置多久過期的文件會被自動刪除。默認值是60s。
indices.ttl.bulk_size 設置批量刪除請求的數量。默認值為1000。

 

Paths部分

path.conf: /path/to/conf  配置文件存儲位置。 path.data: /path/to/data  數據存儲位置,索引數據可以有多個路徑,使用逗號隔開。 path.work: /path/to/work  臨時文件的路徑 。 path.logs: /path/to/logs  日志文件的路徑 。 path.plugins: /path/to/plugins  插件安裝路徑 。

 

 

Memory部分

bootstrap.mlockall: true(默認為false) 鎖住內存,當JVM進行內存轉換的時候,es的性能會降低,所以可以使用這個屬性鎖住內存。同時也要允許elasticsearch的進程可以鎖住內存,linux下可以通過`ulimit -l unlimited`命令,或者在/etc/sysconfig/elasticsearch文件中取消 MAX_LOCKED_MEMORY=unlimited 的注釋即可。
如果使用該配置則ES_HEAP_SIZE必須設置,設置為當前可用內存的50%,最大不能超過31G,默認配置最小為256M,最大為1G。

可以通過請求查看mlockall的值是否設定:

curl http://localhost:9200/_nodes/process?pretty

如果mlockall的值是false,則設置失敗。可能是由於elasticsearch的臨時目錄(/tmp)掛載的時候沒有可執行權限。
可以使用下面的命令來更改臨時目錄:

./bin/elasticsearch -Djna.tmpdir=/path/to/new/dir

 

 

Network 、Transport and HTTP

network.bind_host
設置綁定的ip地址,可以是ipv4或ipv6的。
network.publish_host
設置其它節點和該節點交互的ip地址,如果不設置它會自動設置,值必須是個真實的ip地址。
network.host
同時設置bind_host和publish_host兩個參數,值可以為網卡接口、
127.0.0.1、私有地址以及公有地址。
http_port
接收http請求的綁定端口。可以為一個值或端口范圍,如果是一個端口范圍,節點將綁定到第一個可用端口。默認為:
9200-9300
transport.tcp.port
節點通信的綁定端口。可以為一個值或端口范圍,如果是一個端口范圍,節點將綁定到第一個可用端口。默認為:
9300-9400
transport.tcp.connect_timeout
套接字連接超時設置,默認為 30s。
transport.tcp.compress
設置為true啟用節點之間傳輸的壓縮(LZF),默認為false。
transport.ping_schedule
定時發送ping消息保持連接,默認transport客戶端為5s,其他為
-1(禁用)。
httpd.enabled
是否使用http協議提供服務。默認為:
true(開啟)。
http.max_content_length
最大http請求內容。默認為100MB。如果設置超過100MB,將會被MAX_VALUE重置為100MB。
http.max_initial_line_length
http的url的最大長度。默認為:4kb。
http.max_header_size
http中header的最大值。默認為8kb。
http.compression
支持壓縮(Accept
-Encoding)。默認為:false
http.compression_level
定義壓縮等級。默認為:
6
http.cors.enabled
啟用或禁用跨域資源共享。默認為:
false
http.cors.allow
-origin

啟用跨域資源共享后,默認沒有源站被允許。在//中填寫域名支持正則,例如 /https?:\/\/localhost(:[0-9]+)?/。 * 是有效的值,但是開放任何域名的跨域請求被認為是有安全風險的elasticsearch實例。

http.cors.max-age
瀏覽器發送‘preflight’OPTIONS-request 來確定CORS設置。max-age 定義緩存的時間。默認為:1728000 (20天)。
http.cors.allow
-methods
允許的http方法。默認為OPTIONS、HEAD、GET、POST、PUT、DELETE。
http.cors.allow
-headers

允許的header。默認 X-Requested-With, Content-Type, Content-Length。
http.cors.allow
-credentials

是否允許返回Access-Control-Allow-Credentials頭部。默認為:false
http.detailed_errors.enabled
啟用或禁用輸出詳細的錯誤信息和堆棧跟蹤響應輸出。默認為:
true
http.pipelining
啟用或禁用http管線化。默認為:
true
http.pipelining.max_events
一個http連接關閉之前最大內存中的時間隊列。默認為:
10000

 

 Discovery

discovery.zen.minimum_master_nodes: 3
預防腦裂(split brain)通過配置大多數節點(總節點數/2+1)。默認為3。
discovery.zen.
ping.multicast.enabled: false
設置是否打開組播發現節點。默認false。
discovery.zen.
ping.unicast.host

單播發現所使用的主機列表,可以設置一個屬組,或者以逗號分隔。每個值格式為 host:port 或 host(端口默認為:9300)。默認為 127.0.0.1,[::1]。
discovery.zen.
ping.timeout: 3s
設置集群中自動發現其它節點時ping連接超時時間,默認為3秒,對於比較差的網絡環境可以高點的值來防止自動發現時出錯。
discovery.zen.join_timeout
節點加入到集群中后,發送請求到master的超時時間,默認值為ping.timeout的20倍。
discovery.zen.master_election.filter_client:
true
當值為true時,所有客戶端節點(node.client:true或node.date,node.master值都為false)將不參加master選舉。默認值為:true
discovery.zen.master_election.filter_data:
false
當值為true時,不合格的master節點(node.data:true和node.master:false)將不參加選舉。默認值為:false
discovery.zen.fd.ping_interval
發送ping監測的時間間隔。默認為:1s。
discovery.zen.fd.ping_timeout
ping的響應超時時間。默認為30s。
discovery.zen.fd.ping_retries
ping監測失敗、超時的次數后,節點連接失敗。默認為3。
discovery.zen.publish_timeout
通過集群api動態更新設置的超時時間,默認為30s。
discovery.zen.no_master_block
設置無master時,哪些操作將被拒絕。all 所有節點的讀、寫操作都將被拒絕。
write 寫操作將被拒絕,可以讀取最后已知的集群配置。默認為:write

 

Gateway

gateway.expected_nodes: 0
設置這個集群中節點的數量,默認為0,一旦這N個節點啟動,就會立即進行數據恢復。
gateway.expected_master_nodes
設置這個集群中主節點的數量,默認為0,一旦這N個節點啟動,就會立即進行數據恢復。
gateway.expected_data_nodes
設置這個集群中數據節點的數量,默認為0,一旦這N個節點啟動,就會立即進行數據恢復。
gateway.recover_after_time: 5m
設置初始化數據恢復進程的超時時間,默認是5分鍾。
gateway.recover_after_nodes
設置集群中N個節點啟動時進行數據恢復。
gateway.recover_after_master_nodes
設置集群中N個主節點啟動時進行數據恢復。
gateway.recover_after_data_nodes
設置集群中N個數據節點啟動時進行數據恢復。

 


免責聲明!

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



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