Elasticsearch是什么
Elasticsearch(簡稱ES)是一個基于Apache Lucene(TM)的開源搜索引擎,無論在開源還是專有領域,Lucene可以被認為是迄今為止最先進、性能最好的、功能最全的搜索引擎庫。
但是,Lucene只是一個庫。想要發(fā)揮其強大的作用,你需使用Java并要將其集成到你的應用中。Lucene非常復雜,你需要深入的了解檢索相關知識來理解它是如何工作的。
Elasticsearch也是使用Java編寫并使用Lucene來建立索引并實現搜索功能,但是它的目的是通過簡單連貫的RESTful API讓全文搜索變得簡單并隱藏Lucene的復雜性。
不過,Elasticsearch不僅僅是Lucene和全文搜索引擎,它還提供:
- 分布式的實時文件存儲,每個字段都被索引并可被搜索
- 實時分析的分布式搜索引擎
- 可以擴展到上百臺服務器,處理PB級結構化或非結構化數據
而且,所有的這些功能被集成到一臺服務器,你的應用可以通過簡單的RESTful API、各種語言的客戶端甚至命令行與之交互。上手Elasticsearch非常簡單,它提供了許多合理的缺省值,并對初學者隱藏了復雜的搜索引擎理論。它開箱即用(安裝即可使用),只需很少的學習既可在生產環(huán)境中使用。Elasticsearch在Apache 2 license下許可使用,可以免費下載、使用和修改。
隨著知識的積累,你可以根據不同的問題領域定制Elasticsearch的高級特性,這一切都是可配置的,并且配置非常靈活。
Elasticsearch的功能
分布式的搜索引擎和數據分析引擎
搜索:互聯(lián)網搜索、電商網站站內搜索、OA系統(tǒng)查詢。
數據分析:電商網站查詢近1周哪些品類的圖書銷售前十;新聞網站最近三天閱讀量最高的10個關鍵詞;輿情分析。全文檢索、結構化檢索、數據分析
全文檢索:搜索商品包含java的圖書
結構化檢索:搜索商品分類為Spring的圖書有哪些
數據分析:分析每一個分類下有多少種圖書對海量數據進行近實時的處理
分布式:ES自動可以將海量數據分散到多臺服務器上去存儲和檢索,進行并行查詢,提高檢索效率。相對的Lucene是單機應用。
近實時:數據庫上億條數據查詢,搜索一次耗時幾個小時,是批處理(batch-processing)。而ES只需秒級即可查詢海量數據,所以叫近實時,秒級。
Elasticsearch的使用場景
國外:
- 維基百科,類似百度百科,“網絡七層協(xié)議”的維基百科,全文檢索,高亮搜索推薦。
- Stack Overflow(國外的程序討論論壇),相當于程序員的貼吧,遇到it問題去上面發(fā)帖,熱心網友下面回答問題。
- GitHub(開源代碼管理),搜索上千億行代碼。
- 電商網站,站內搜索,檢索商品。
- 日志數據分析,logstash采集數據,ES進行復雜的數據分析(ELK技術,Elasticsearch+logstash+Kibana)
- 商品價格監(jiān)控網站,用戶設定某商品的價格閾值,當價格低于該閾值的時候,發(fā)送通知消息給用戶。
- BI系統(tǒng),商業(yè)智能(Business Intelligence)。大型連鎖超市,分析全國網點傳回的數據,分析各個商品在什么季節(jié)銷售量最好、利潤最高。成本管理、店面租金、員工工資、負債等信息進行分析,從而部署下一個階段的戰(zhàn)略目標。
國內:
- 百度搜索,第一次查詢使用Elasticsearch找到相應的文檔,第二次查詢加入相應的廣告之類的,然后返回給用戶。
- OA、ERP、電商、站內搜索。
Elasticsearch的特點
- 可拓展性:大型分布式集群(數百臺服務器)技術,處理PB級數據,大公司可以使用。小公司數據量小,也可以部署單機。且大數據領域使用廣泛。
- 技術整合:將全文檢索、數據分析、分布式相關技術整合在一起,Lucene(全文檢索)、商用的數據分析軟件(BI軟件),分布式數據庫。
- 接口簡單:使用restful api進行交互,跨語言。
- 功能強大:Elasticsearch作為傳統(tǒng)數據庫的一個補充,提供了傳統(tǒng)數據庫所不能提供的很多功能,如全文檢索、同義詞處理、相關度排名等。
Elasticsearch和Lucene的關系
- Lucene:最先進,功能最強大的搜索庫。如果直接基于Lucene開發(fā),非常復雜,api復雜。
- Elasticsearch:基于Lucene,封裝了許多Lucene的底層功能,提供簡單易用的restful api接口和許多語言的客戶端,如Java的高級客戶端(Java High Level Rest Client)和底層客戶端(Java Low Level Rest Client)
Elasticsearch的核心概念
NRT(Near Realtime):近實時
Elasticsearch是一個接近實時的搜索平臺,這意味著,從索引一個文檔直到這個文檔能夠被搜索到有一個輕微的延遲(通常是1秒)。主要體現在兩個方面:
- 寫入數據時,過1秒才會被搜索到,因為內部在分詞、錄入索引。
- ES搜索時,搜索和分析數據需要秒級出結果。
文檔、索引
Document:文檔
- Elasticsearch是面向文檔的,文檔是所有可搜索數據的最小基礎信息單元。
- 一個Document就像數據庫中的一行記錄,文檔會被序列化成JSON格式,保持在Elasticsearch中,多個Document存儲于一個索引(Index)中。文檔以JSON(Javascript Object Notation)格式來表示,而JSON是一個到處存在的互聯(lián)網數據交互格式。
- 每一個文檔都有一個UniqueID

文檔的元數據
- 元數據:用于標注穩(wěn)定的相關信息
- _index:文檔所屬的索引名
- _type:文檔所屬的類型名
- _id:文檔的主鍵,在寫入的時候,可以指定該Doc的ID值,如果不指定,則系統(tǒng)自動生成一個唯一的UUID值。
- _source:文檔的原始Json數據
- _version:文檔的版本信息,Elasticsearch通過使用version來保證對文檔的變更能以正確的順序執(zhí)行,避免亂序造成的數據丟失。
- _score:相關性打分。
- _seq_no:嚴格遞增的順序號,每個文檔一個,Shard級別嚴格遞增,保證后寫入的Doc的_seq_no大于先寫入的Doc的_seq_no。
- primary_term:primary_term也和_seq_no一樣是一個整數,每當Primary Shard發(fā)生重新分配時,比如重啟,Primary選舉等,_primary_term會遞增1。
- found:查詢的ID正確那么ture, 如果 Id 不正確,就查不到數據,found字段就是false。
Index:索引
Index- 索引是文檔的容器,是一類文檔的結合,一個索引就是包含一堆有相似結構的文檔數據。
- Index體現了邏輯空間的概念:每一個索引都有自己的Mapping定義,用于定義包含的文檔的字段名和字段類型。
- Shard體現了物理空間的概念:索引中的數據分散在Shard上。
索引的Mapping與Settings
- Mapping定義文檔字段的類型
- Setting定義不同的數據分布
索引創(chuàng)建規(guī)則
- 僅限小寫字母
- 不能包含\、/、*、?、"、<、>、|、#以及空格符等 特殊符號。
- 從7.0版本開始不在包含冒號。
- 不能以-、_或+開頭。
- 不能超過255個字節(jié)(注意是字節(jié),因此多字節(jié)字符將計入255個限制)
當我們要對對應于這個索引中的文檔進行索引、搜索、更新和刪除的時候,都要使用到這個名字。索引類似于關系型數據庫中Database的概念。在一個集群中,如果你想,可以定義任意多的索引。
Type:類型
Type 可以理解成關系數據庫中Table,之前的版本中,索引和文檔中間還有個類型的概念,每個索引下可以建立多個類型,文檔存儲時需要指定index和type,一個type下的document,都有相同的field。從6.0.0開始單個索引中只能有一個類型,7.0.0以后將將不建議使用,8.0.0 以后完全不支持。
- 在7.0之前,一個index可以設置多個Types。
- 6.0開始,Type已經被Deprecated。7.0開始一個索引只能創(chuàng)建一個Type -"_doc"。
Field:字段
就像數據庫中的列(Columns),定義每個document應該有的字段。
集群/節(jié)點/分片/副本

分布式系統(tǒng)的可用性與擴展性
-
高可用
- 服務可用性-允許有節(jié)點停止服務
- 數據可用性-部分節(jié)點丟失,不會丟失數據
-
可擴展性
- 存儲的水平擴容 請求量提升/數據的不斷增長(將數據分布到所用節(jié)點上)
Cluster:集群
一個集群包含一個或多個啟動著es實例的機器群,通常一臺機器起一個es實例,它們共同持有你整個的數據,并一起提供索引和搜索功能。同一網絡下,集群名一樣的多個es實例自動組成集群,自動均衡分片等行為,一個集群由一個唯一的名字標識,默認集群名為"elasticsearch"。這個名字是重要的,因為一個節(jié)點只能通過指定某個集群的名字,來加入這個集群。在產品環(huán)境中顯式地設定這個名字是一個好習慣,但是使用默認值來進行測試/開發(fā)也是不錯的。
集群的健康狀態(tài)
- Green:主分片與副本都正常分配。
- Yellow:主分片全部正常分配,有副本分片未能正常分配。
- Red:有主分片未能分配(例如 當服務器的磁盤容量超過85%時,去創(chuàng)建了一個新的索引)
節(jié)點:node

- 節(jié)點是一個Elasticsearch的實例,本質上就是一個JAVA進程
- 每一個節(jié)點都有名字,通過配置文件配置或自動分配,或者啟動時候指定
- 每一個節(jié)點在啟動之后,會分配一個UID,保存在data目錄下
一個節(jié)點是你集群中的一個服務器,作為集群的一部分,它存儲你的數據,參與集群的索引和搜索功能。和集群類似,一個節(jié)點也是由一個名字來標識的,默認情況下,這個名字是一個隨機的漫威漫畫角色的名字,這個名字會在啟動的時候賦予節(jié)點。這個名字對于管理工作來說挺重要的,因為在這個管理過程中,你會去確定網絡中的哪些服務器對應于Elasticsearch集群中的哪些節(jié)點。
一個節(jié)點可以通過配置集群名稱的方式來加入一個指定的集群。默認情況下,每個節(jié)點都會被安排加入到一個叫做“elasticsearch”的集群中,這意味著,如果你在你的網絡中啟動了若干個節(jié)點,并假定它們能夠相互發(fā)現彼此,它們將會自動地形成并加入到一個叫做“elasticsearch”的集群中。
Master-eligible nodes 和Master Node(主節(jié)點)
- 每個節(jié)點啟動后,默認就是一個Master eligible節(jié)點(可以設置node.master:false禁止)
- Master-eligible節(jié)點可以參加選主流出,成為Master節(jié)點。
- 每個節(jié)點上都保存了集群的狀態(tài),只有Master節(jié)點才能修改集群的狀態(tài)信息。
- 集群狀態(tài)(cluster state)維護了一個集群中必要的信息所有節(jié)點的信息/所有的索引和其相關的Mapping與Setting信息/分片的路由信息。
- 任意節(jié)點都能修改信息會導致數據的不一致性。
DataNode(數據節(jié)點)
- 可以保存數據的節(jié)點。負責保存分片數據。在數據擴展上起到了至關重要的作用。
Coordination Node(協(xié)調節(jié)點)
- 負責接收Client的請求,將請求分發(fā)到合適的節(jié)點,最終把結果匯集到一起。
- 每個節(jié)點默認都起到了Coordination Node的職責。
Hot&Warm Node
- 不同硬件配置的Data Node,用來實現Hot&Warm架構,降低集群部署的成本。
Machine Learning Node
- 負責跑機器學習的Job,用來做異常檢測。
Ingest Node
- Ingest Node 可以看作是數據前置處理轉換的節(jié)點,支持pipeline管道 設置,可以使用ingest對數據進行過濾、轉換等操作,類似于logstash中filter的作用。
Tribe Node
- 5.3開始使用Cross Cluster Search)TribeNode 連接到不同的Elasticsearch集群,并且支持將這些集群當成一個單獨的集群處理。
節(jié)點角色劃分及資源使用情況
| 角色 | 描述 | 存儲 | 內存 | 計算 | 網絡 |
|---|---|---|---|---|---|
| 數據節(jié)點 | 存儲和檢索數據 | 極高 | 高 | 高 | 中 |
| 主節(jié)點 | 管理集群狀態(tài) | 低 | 低 | 低 | 低 |
| Ingest 節(jié)點 | 轉換輸入數據 | 低 | 中 | 高 | 中 |
| 機器學習節(jié)點 | 機器學習 | 低 | 極高 | 極高 | 中 |
| 協(xié)調節(jié)點 | 請求轉發(fā)和合并檢索結果 | 低 | 中 | 中 | 中 |
Shard:分片
index數據過大時,將index里面的數據,分為多個shard,分布式的存儲在各個服務器上面,可以支持海量數據和高并發(fā),提升性能和吞吐量,充分利用多臺機器的CPU。
replica:副本
在分布式環(huán)境下,任何一臺機器都會隨時宕機,如果宕機,index的一個分片沒有導致此index不能搜索。所以為了保證數據安全,我們會將每個index的分片進行備份,存儲在另外的機器上,保證少數機器宕機,ES集群仍然可以提供搜索服務。
能正常提供查詢和插入的分片我們叫做主分片(primary shard),其余的我們就管它們叫做備份的分片(replica shard)。
ES6默認新建索引時,5分片,1副本,也就是一主一備,共10個分片。所以,ES集群最小規(guī)模為2臺。ES7,默認1分片,1副本,一共2分片。
副本有兩個重要作用
- 1、服務高可用:由于數據只有一份,如果一個node掛了,那存在上面的數據就都丟了,有了replicas,只要不是存儲這條數據的node全掛了,數據就不會丟。因此分片副本不會與主分片分配到同一個節(jié)點。
- 2、擴展性能:通過在所有replicas上并行搜索提高搜索性能.由于replicas上的數據是近實時的(near realtime),因此所有replicas都能提供搜索功能,通過設置合理的replicas數量可以極高的提高搜索吞吐量。
分片的設定
對于生產環(huán)境中分片的設定,需要提前做好容量規(guī)劃,因為主分片數是在索引創(chuàng)建時預先設定的,后續(xù)無法修改。
分片數設置過小
- 導致后續(xù)無法增加節(jié)點實現水平擴展。
- 單個分片的數據量太大,導致數據重新分配耗時。
分片數設置過大
- 影響搜索結構的相關性打分,影響統(tǒng)計結果的準確性。
- 單個節(jié)點上過多的分片,會導致資源浪費,同時也會影響性能。
分片為主分片和備份分片
- 副本分片數提高了數據冗余量。
- 主分片掛掉以后能夠自動由副本分片升為主分片。
- 備份分片還能夠降低主分片的查詢壓力(會消耗更多的系統(tǒng)性能)。
shard & replica說明
一個索引可以存儲超出單個結點硬件限制的大量數據。比如,一個具有10億文檔的索引占據1TB的磁盤空間,而任一節(jié)點都沒有這樣大的磁盤空間;或者單個節(jié)點處理搜索請求,響應太慢。
為了解決這個問題,Elasticsearch提供了將索引劃分成多份的能力,這些份就叫做分片。當你創(chuàng)建一個索引的時候,你可以指定你想要的分片的數量。每個分片本身也是一個功能完善并且獨立的“索引”,這個“索引”可以被放置到集群中的任何節(jié)點上。
分片之所以重要,主要有兩方面的原因:
允許你水平分割/擴展你的內容容量,允許你在分片(潛在地,位于多個節(jié)點上)之上進行分布式的、并行的操作,進而提高性能/吞吐量,至于一個分片怎樣分布,它的文檔怎樣聚合回搜索請求,是完全由Elasticsearch管理的,對于作為用戶的你來說,這些都是透明的。
在一個網絡/云的環(huán)境里,失敗隨時都可能發(fā)生,在某個分片/節(jié)點不知怎么的就處于離線狀態(tài),或者由于任何原因消失了。這種情況下,有一個故障轉移機制是非常有用并且是強烈推薦的。為此目的,Elasticsearch允許你創(chuàng)建分片的一份或多份拷貝,這些拷貝叫做復制分片,或者直接叫復制。復制之所以重要,主要有兩方面的原因:
在分片/節(jié)點失敗的情況下,提供了高可用性。因為這個原因,注意到復制分片從不與原/主要(original/primary)分片置于同一節(jié)點上是非常重要的。
擴展你的搜索量/吞吐量,因為搜索可以在所有的復制上并行運行
總之,每個索引可以被分成多個分片。一個索引也可以被復制0次(意思是沒有復制)或多次。一旦復制了,每個索引就有了主分片(作為復制源的原來的分片)和復制分片(主分片的拷貝)之別。分片和復制的數量可以在索引創(chuàng)建的時候指定。在索引創(chuàng)建之后,你可以在任何時候動態(tài)地改變復制數量,但是不能改變分片的數量。
默認情況下,Elasticsearch中的每個索引被分片5個主分片和1個復制,這意味著,如果你的集群中至少有兩個節(jié)點,你的索引將會有5個主分片和另外5個復制分片(1個完全拷貝),這樣的話每個索引總共就有10個分片。一個索引的多個分片可以存放在集群中的一臺主機上,也可以存放在多臺主機上,這取決于你的集群機器數量。主分片和復制分片的具體位置是由ES內在的策略所決定的。
REST API
Elasticsearch提供了一個非常全面和強大的REST API,使用它與集群進行交互。
- 1、檢查群集,節(jié)點和索引運行狀況,狀態(tài)和統(tǒng)計信息。
- 2、管理您的群集,節(jié)點和索引數據和元數據。
- 3、對索引執(zhí)行CRUD(創(chuàng)建,讀取,更新和刪除)和搜索操作。
- 4、執(zhí)行高級搜索操作,例如分頁,排序,過濾,腳本編寫,聚合等。

數據庫核心概念 VS Elasticsearch核心概念
| 關系型數據庫(MySQL) | 非關型數據庫(Elasticsearch) |
|---|---|
| 數據庫Database | 索引Index |
| 表Table | 索引Index(原為Type) |
| 數據行Row | 文檔Document |
| 數據列Column | 字段Field |
| 約束Schema | 映射Mapping |
Windows環(huán)境下Elasticsearch安裝
安裝JDK
Elasticsearch7.3.0需要安裝JDK1.8.0_73以上版本
Elasticsearch下載地址:https://www.elastic.co/cn/downloads/past-releases
下載和解壓Elasticsearch7.3.0
下載和解壓Elasticsearch7.3.0目錄:
bin:腳本目錄,包括啟動、停止等可執(zhí)行腳本。
config:配置文件目錄。
data:索引目錄,存放索引文件的地方。
logs:日志目錄。
modules:模塊目錄,包括了es的功能模塊。
plugins:插件目錄,es支持插件機制。
配置文件
ES的配置文件的地址根據安裝形式的不同而不同:
- 使用zip、tar安裝,配置文件的地址在安裝目錄下的config目錄中。
- 使用RPM安裝,配置文件在/etc/elasticsearch目錄下。
- 使用MSI安裝,配置文件的地址在安裝目錄的config下,并且會自動將config目錄地址寫入環(huán)境變量ES_PATH_CONF。
config/elasticsearch.yml 主配置文件
config/jvm.options jvm參數配置文件
cofnig/log4j2.properties 日志配置文件
elasticsearch.yml
配置格式YAML,可以采用如下兩種方式
path:
data: /var/lib/elasticsearch
logs: /var/log/elasticsearch
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
elasticsearch.yml常用配置如下:
cluster.name:
# 配置elasticsearch的集群名稱,默認是elasticsearch,建議修改成有意義的名字
node.name:
# 節(jié)點名稱,通常一臺物理機器就是一個節(jié)點,es會默認隨機指定一個名字,建議指定一個有意義的名字,方便管理。
# 一個或多個節(jié)點組成一個cluster集群,集群是一個邏輯的概念,節(jié)點是物理概念
path.conf:
# 設置配置文件的存儲路徑,tar或zip包安裝默認在es的根目錄下的config文件夾,rpm安裝在/etc/elasticsearch
path.data:
# 設置索引數據的存儲路徑,默認是es根目錄下的data文件夾,可以設置多個路徑用,隔開
path.logs:
# 設置日志文件的存儲路徑,默認是es目錄下的logs文件夾
path.plugins:
# 設置插件的存放路徑,默認是es目錄下的plugins文件夾
bootstrap.memory_lock: true
# 設置為true可以鎖住es使用的內存,避免內存與swap分區(qū)交換數據
network.host:
# 設置綁定主機的ip地址,設置為0.0.0.0表示綁定任何ip,允許外網訪問,生產環(huán)境建議設置為具體的ip
http.port: 9200
# 設置對外服務的http端口,默認為9200
transport.tcp.port: 9300
# 集群節(jié)點之間通信端口
node.master:
# 指定該節(jié)點是否有資格被選舉成master節(jié)點,默認是true,如果原來的master宕機,會重新選舉新的master
node.data:
# 指定該節(jié)點是否存儲索引數據,默認為true
discovery.zen.ping.unicast.hosts: ["host1:port","host2:port",......]
# 設置集群中master節(jié)點的初始列表
discovery.zen.ping.timeout: 3s
# 設置es自動發(fā)現節(jié)點連接超時時間,默認為3秒,如果網絡延遲高可設置大一些
discovery.zen.minimum_master_nodes:
# 主節(jié)點數量的最小值,此值得公式為:(master_eligible_nodes / 2) + 1
# 比如有3個符合要求的主節(jié)點,那么這里要設置為2
node.max_local_storage_nodes:
# 單機允許的最大存儲節(jié)點數,通常單機啟動一個節(jié)點建議設置為1,開發(fā)環(huán)境如果<u></u>單機啟動多個節(jié)點建議設置大于1
elasticsearch.yml詳細配置如下:
##################### Elasticsearch Configuration Example #####################
#
# 只是挑些重要的配置選項進行注釋,其實自帶的已經有非常細致的英文注釋了!
# https://www.elastic.co/guide/en/elasticsearch/reference/current/modules.html
#
################################### Cluster ###################################
# 代表一個集群,集群中有多個節(jié)點,其中有一個為主節(jié)點,這個主節(jié)點是可以通過選舉產生的,主從節(jié)點是對于集群內部來說的.
# es的一個概念就是去中心化,字面上理解就是無中心節(jié)點,這是對于集群外部來說的,因為從外部來看es集群,在邏輯上是個整體,你與任何一個節(jié)點的通信和與整個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
# 節(jié)點名稱同理,可自動生成也可手動配置.
# node.name: node-1
# 允許一個節(jié)點是否可以成為一個master節(jié)點,es是默認集群中的第一臺機器為master,如果這臺機器停止就會重新選舉master.
# node.master: true
# 允許該節(jié)點存儲數據(默認開啟)
# node.data: true
# 配置文件中給出了三種配置高性能集群拓撲結構的模式,如下:
# 1. 如果你想讓節(jié)點從不選舉為主節(jié)點,只用來存儲數據,可作為負載器
# node.master: false
# node.data: true
# node.ingest: true #默認true
# 2. 如果想讓節(jié)點成為主節(jié)點,且不存儲任何數據,并保有空閑資源,可作為協(xié)調器
# node.master: true
# node.data: false
# node.ingest: true
# 3. 如果想讓節(jié)點既不稱為主節(jié)點,又不成為數據節(jié)點,那么可將他作為搜索器,從節(jié)點中獲取數據,生成搜索結果等
# node.master: false
# node.data: false
# node.ingest: true
#
# 4. 僅作為協(xié)調器
# node.master: false
# node.data: false
# node.ingest: false
# 監(jiān)控集群狀態(tài)有一下插件和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:
# 每個節(jié)點都可以定義一些與之關聯(lián)的通用屬性,用于后期集群進行碎片分配時的過濾
# node.rack: rack314
# 默認情況下,多個節(jié)點可以在同一個安裝路徑啟動,如果你想讓你的es只啟動一個節(jié)點,可以進行如下設置
# node.max_local_storage_nodes: 1
#################################### Index ####################################
# 設置索引的分片數,默認為5
#index.number_of_shards: 5
# 設置索引的副本數,默認為1:
#index.number_of_replicas: 1
# 配置文件中提到的最佳實踐是,如果服務器夠多,可以將分片提高,盡量將數據平均分布到大集群中去
# 同時,如果增加副本數量可以有效的提高搜索性能
# 需要注意的是,"number_of_shards" 是索引創(chuàng)建后一次生成的,后續(xù)不可更改設置
# "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 ###################################
# 設置插件作為啟動條件,如果一下插件沒有安裝,則該節(jié)點服務不會啟動
# 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 環(huán)境變量設置為相同的值,以及機器有足夠的內存分配給Elasticsearch
# 注意:內存也不是越大越好,一般64位機器,最大分配內存別才超過32G
############################## Network And HTTP ###############################
# 設置綁定的ip地址,可以是ipv4或ipv6的,默認為0.0.0.0
# network.bind_host: 192.168.0.1 #只有本機可以訪問http接口
# 設置其它節(jié)點和該節(jié)點交互的ip地址,如果不設置它會自動設置,值必須是個真實的ip地址
# network.publish_host: 192.168.0.1
# 同時設置bind_host和publish_host上面兩個參數
# network.host: 192.168.0.1 #綁定監(jiān)聽IP
# 設置節(jié)點間交互的tcp端口,默認是9300
# transport.tcp.port: 9300
# 設置是否壓縮tcp傳輸時的數據,默認為false,不壓縮
# transport.tcp.compress: true
# 設置對外服務的http端口,默認為9200
# http.port: 9200
# 設置請求內容的最大容量,默認100mb
# http.max_content_length: 100mb
# 使用http協(xié)議對外提供服務,默認為true,開啟
# http.enabled: false
###################### 使用head等插件監(jiān)控集群信息,需要打開以下配置項 ###########
# http.cors.enabled: true
# http.cors.allow-origin: "*"
# http.cors.allow-credentials: true
################################### Gateway ###################################
# gateway的類型,默認為local即為本地文件系統(tǒng),可以設置為本地文件系統(tǒng)
# gateway.type: local
# 下面的配置控制怎樣以及何時啟動一整個集群重啟的初始化恢復過程
# (當使用shard gateway時,是為了盡可能的重用local data(本地數據))
# 一個集群中的N個節(jié)點啟動后,才允許進行恢復處理
# gateway.recover_after_nodes: 1
# 設置初始化恢復過程的超時時間,超時時間從上一個配置中配置的N個節(jié)點啟動后算起
# gateway.recover_after_time: 5m
# 設置這個集群中期望有多少個節(jié)點.一旦這N個節(jié)點啟動(并且recover_after_nodes也符合),
# 立即開始恢復過程(不等待recover_after_time超時)
# gateway.expected_nodes: 2
############################# Recovery Throttling #############################
# 下面這些配置允許在初始化恢復,副本分配,再平衡,或者添加和刪除節(jié)點時控制節(jié)點間的分片分配
# 設置一個節(jié)點的并行恢復數
# 1.初始化數據恢復時,并發(fā)恢復線程的個數,默認為4
# cluster.routing.allocation.node_initial_primaries_recoveries: 4
# 2.添加刪除節(jié)點或負載均衡時并發(fā)恢復線程的個數,默認為2
# cluster.routing.allocation.node_concurrent_recoveries: 2
# 設置恢復時的吞吐量(例如:100mb,默認為0無限制.如果機器還有其他業(yè)務在跑的話還是限制一下的好)
# indices.recovery.max_bytes_per_sec: 20mb
# 設置來限制從其它分片恢復數據時最大同時打開并發(fā)流的個數,默認為5
# indices.recovery.concurrent_streams: 5
# 注意: 合理的設置以上參數能有效的提高集群節(jié)點的數據恢復以及初始化速度
################################## Discovery ##################################
# 設置這個參數來保證集群中的節(jié)點可以知道其它N個有master資格的節(jié)點.默認為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>
# 設置是否打開多播發(fā)現節(jié)點.默認是true.
# 當多播不可用或者集群跨網段的時候集群通信還是用單播吧
# discovery.zen.ping.multicast.enabled: false
# 這是一個集群中的主節(jié)點的初始列表,當節(jié)點(主節(jié)點或者數據節(jié)點)啟動時使用這個列表進行探測
# discovery.zen.ping.unicast.hosts: ["host1", "host2:port"]
# Slow Log部分與GC log部分略,不過可以通過相關日志優(yōu)化搜索查詢速度
################ X-Pack ###########################################
# 官方插件 相關設置請查看此處
# https://www.elastic.co/guide/en/x-pack/current/xpack-settings.html
#
############## Memory(重點需要調優(yōu)的部分) ################
# 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%(節(jié)點 node heap內存量),默認是:unbounded #indices.fielddata.cache.size: unbounded
# field的超時時間.默認是-1,可以設置的值類型: 5m #indices.fielddata.cache.expire: -1
# circuit breaker部分:
# 斷路器是elasticsearch為了防止內存溢出的一種操作,每一種circuit breaker都可以指定一個內存界限觸發(fā)此操作,這種circuit breaker的設定有一個最高級別的設定:indices.breaker.total.limit 默認值是JVM heap的70%.當內存達到這個數量的時候會觸發(fā)內存回收
# 另外還有兩組子設置:
#indices.breaker.fielddata.limit:當系統(tǒng)發(fā)現fielddata的數量達到一定數量時會觸發(fā)內存回收.默認值是JVM heap的70%
#indices.breaker.fielddata.overhead:在系統(tǒng)要加載fielddata時會進行預先估計,當系統(tǒng)發(fā)現要加載進內存的值超過limit * overhead時會進行進行內存回收.默認是1.03
#indices.breaker.request.limit:這種斷路器是elasticsearch為了防止OOM(內存溢出),在每次請求數據時設定了一個固定的內存數量.默認值是40%
#indices.breaker.request.overhead:同上,也是elasticsearch在發(fā)送請求時設定的一個預估系數,用來防止內存溢出.默認值是1
# Translog部分:
# 每一個分片(shard)都有一個transaction log或者是與它有關的預寫日志,(write log),在es進行索引(index)或者刪除(delete)操作時會將沒有提交的數據記錄在translog之中,當進行flush 操作的時候會將tranlog中的數據發(fā)送給Lucene進行相關的操作.一次flush操作的發(fā)生基于如下的幾個配置
#index.translog.flush_threshold_ops:當發(fā)生多少次操作時進行一次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進行動態(tài)的設置
jvm.options
設置最小和最大的JVM堆內存大小
在jvm.options中設置-Xms和-Xmx
- 1、將兩個值設置相等。
- 2、Xmx設置為不超過物理內存的一半
log4j2.properties
日志文件設置,ES使用log4j,注意日志級別的配置。
啟動Elasticsearch
bin/elasticsearch.bat
注意:Elasticsearch7 Windows版本不支持機器學習,所以在elasticsearch.yml文件中添加如下配置:
node.name: node-1
cluster.initial_master_nodes: ["node-1"]
xpack.ml.enabled: true
http.cors.enabled: true
http.cors.allow-origin: /.*/
檢查Elasticsearch是否啟動成功
瀏覽器訪問:http://localhost:9200/
{
"name" : "node-1",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "HethbytURomnsf4j56On1Q",
"version" : {
"number" : "7.3.0",
"build_flavor" : "default",
"build_type" : "zip",
"build_hash" : "de777fa",
"build_date" : "2019-07-24T18:30:11.767338Z",
"build_snapshot" : false,
"lucene_version" : "8.1.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
瀏覽器訪問http://localhost:9200/_cluster/health查詢集群狀態(tài)
{
"cluster_name":"elasticsearch",
"status":"green",
"timed_out":false,
"number_of_nodes":1,
"number_of_data_nodes":1,
"active_primary_shards":0,
"active_shards":0,
"relocating_shards":0,
"initializing_shards":0,
"unassigned_shards":0,
"delayed_unassigned_shards":0,
"number_of_pending_tasks":0,
"number_of_in_flight_fetch":0,
"task_max_waiting_in_queue_millis":0,
"active_shards_percent_as_number":100
}
解釋:status集群狀態(tài),green所有分片可用;yellow所有主分片可用;red主分片不可用,集群不可用。
Windows環(huán)境下安裝Kibana
- 1、Kibana是es數據的前端展現,數據分析時可以可以方便的看到數據,作為開發(fā)人員,可以方便訪問es。
- 2、下載解壓Kibana
- 3、啟動Kibana:bin/Kibana.bat
- 4、瀏覽器訪問:http://localhost:5601/,進入DevTools界面,像plsql一樣支持代碼提示。
- 5、發(fā)送get請求,查看集群狀態(tài)GET _cluster/health,相當于瀏覽器訪問。

堆棧信息查看:

Windows安裝head插件,
head插件是es的一個可視化管理插件,用來監(jiān)視es的狀態(tài),并通過head客戶端和es服務進行交互,比如創(chuàng)建映射,創(chuàng)建索引等,head的項目地址https://github.com/mobz/elasticsearch-head。
從elasticsearch 6.0開始,head插件支持nodejs運行
#### 使用內置服務器運行
* `git clone git://github.com/mobz/elasticsearch-head.git`
* `cd elasticsearch-head`
* `npm install`
* `npm run start`
* `open` [http://localhost:9100/](http://localhost:9100/)
參考:
https://www.cnblogs.com/xiaochina/p/6855591.html