ElasticSearch5.1 基本概念和配置

1、說明

使用的是新版本5.1,直接從官網下載rpm包進行安裝,https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.1.1.rpmhtml

#查看安裝包安裝的相關路徑
#rpm -ql elasticsearch-5.1.1-1.noarch
幾個重要的配置文件
#/etc/sysconfig/elasticsearch          配置elasticsearch環境變量 
#/etc/elasticsearch/elasticsearch.yml  配置elasticsearch集羣
#/etc/elasticsearch/jvm.options        配置elasticsearch的jvm參數
#/etc/elasticsearch/log4j2.properties  配置elasticsearch日誌參數

2、幾個基本概念

接近實時(NRT)

Elasticsearch 是一個接近實時的搜索平臺。這意味着,從索引一個文檔直到這個文檔可以被搜索到有一個很小的延遲(一般是 1 秒)。node

集羣(cluster)

表明一個集羣,集羣中有多個節點(node),其中有一個爲主節點,這個主節點是能夠經過選舉產生的,主從節點是對於集羣內部來講的。es的一個概念就是去中心化,字面上理解就是無中心節點,這是對於集羣外部來講的,由於從外部來看es集羣,在邏輯上是個總體,你與任何一個節點的通訊和與整個es集羣通訊是等價的。linux

索引(index)

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

文檔(document)

文檔(document)是ElasticSearch中的主要實體。對全部使用ElasticSearch的案例來講,他們最終均可以歸結爲對文檔的搜索。文檔由字段構成。github

映射(mapping)

全部文檔寫進索引以前都會先進行分析,如何將輸入的文本分割爲詞條、哪些詞條又會被過濾,這種行爲叫作映射(mapping)。通常由用戶本身定義規則。數據庫

類型(type)

每一個文檔都有與之對應的類型(type)定義。這容許用戶在一個索引中存儲多種文檔類型,併爲不一樣文檔提供類型提供不一樣的映射。json

分片(shards)

表明索引分片,es能夠把一個完整的索引分紅多個分片,這樣的好處是能夠把一個大的索引拆分紅多個,分佈到不一樣的節點上。構成分佈式搜索。分片的數量只能在索引建立前指定,而且索引建立後不能更改。bootstrap

副本(replicas)

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

數據恢復(recovery)

表明數據恢復或叫數據從新分佈,es在有節點加入或退出時會根據機器的負載對索引分片進行從新分配,掛掉的節點從新啓動時也會進行數據恢復。bash

數據源(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等的傳輸協議(經過插件方式集成)。

3、集羣配置文件詳解

##################### Elasticsearch Configuration Example ##################### 
# 只是挑些重要的配置選項進行註釋,其實自帶的已經有很是細緻的英文註釋了.有理解誤差的地方請以官方原版解釋爲準. 

################################### Cluster ################################### 
# 表明一個集羣,集羣中有多個節點,其中有一個爲主節點,這個主節點是能夠經過選舉產生的,主從節點是對於集羣內部來講的. 
# es的一個概念就是去中心化,字面上理解就是無中心節點,這是對於集羣外部來講的,由於從外部來看es集羣,在邏輯上是個總體,你與任何一個節點的通訊和與整個es集羣通訊是等價的。 
# cluster.name能夠肯定你的集羣名稱,當你的elasticsearch集羣在同一個網段中elasticsearch會自動的找到具備相同cluster.name的elasticsearch服務. 
# 因此當同一個網段具備多個elasticsearch集羣時cluster.name就成爲同一個集羣的標識. 

# cluster.name: elasticsearch 

#################################### Node ##################################### 
# 節點名稱同理,可自動生成也可手動配置. 
# node.name: node-1

# 容許一個節點是否能夠成爲一個master節點,es是默認集羣中的第一臺機器爲master,若是這臺機器中止就會從新選舉master. 
# node.master: true 

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

# 配置文件中給出了三種配置高性能集羣拓撲結構的模式,以下: 
# 1. 若是你想讓節點從不選舉爲主節點,只用來存儲數據,可做爲負載器 
# node.master: false 
# node.data: true 

# 2. 若是想讓節點成爲主節點,且不存儲任何數據,並保有空閒資源,可做爲協調器 
# node.master: true 
# node.data: false 

# 3. 若是想讓節點既不稱爲主節點,又不成爲數據節點,那麼可將他做爲搜索器,從節點中獲取數據,生成搜索結果等 
# node.master: false 
# node.data: 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/>, 
# <http://github.com/karmi/elasticsearch-paramedic>, 
# <http://github.com/lukas-vlcek/bigdesk> and 
# <http://mobz.github.com/elasticsearch-head> to inspect the cluster state. 

# 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 

# 設置其它節點和該節點交互的ip地址,若是不設置它會自動設置,值必須是個真實的ip地址 
# network.publish_host: 192.168.0.1 

# 同時設置bind_host和publish_host上面兩個參數 
# network.host: 192.168.0.1 

# 設置節點間交互的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部分略,不過能夠經過相關日誌優化搜索查詢速度 

############## 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

4、參考網址

https://endymecy.gitbooks.io/elasticsearch-guide-chinese/content/getting-started/basic-concepts.html

http://www.cnblogs.com/hujihon/p/5656981.html

http://www.yubingzhe.com/137.html

相關文章
相關標籤/搜索