一、關於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個數據節點啟動時進行數據恢復。