學習目標:
- 能夠理解ElasticSearch的作用
- 能夠安裝ElasticSearch服務
- 能夠理解ElasticSearch的相關概念
- 能夠使用Postman發送Restful請求操作ElasticSearch
- 能夠理解分詞器的作用
- 能夠使用ElasticSearch集成IK分詞器
- 能夠完成es集群搭建
第一章 ElasticSearch簡介
1.1 什么是ElasticSearch
Elasticsearch,簡稱為es, es是一個開源的高擴展的分布式全文檢索引擎,它可以近乎實時的存儲、檢索數據;本身擴展性很好,可以擴展到上百臺服務器,處理PB級別的數據。es也使用Java開發并使用Lucene作為其核心來實現所有索引和搜索的功能,但是它的目的是通過簡單的RESTful API來隱藏Lucene的復雜性,從而讓全文搜索變得簡單。
1.2 ElasticSearch的使用案例
- 2013年初,GitHub拋棄了Solr,采取ElasticSearch 來做PB級的搜索。 “GitHub使用ElasticSearch搜索20TB的數據,包括13億文件和1300億行代碼”
- 維基百科:啟動以elasticsearch為基礎的核心搜索架構
- SoundCloud:“SoundCloud使用ElasticSearch為1.8億用戶提供即時而精準的音樂搜索服務”
- 百度:百度目前廣泛使用ElasticSearch作為文本數據分析,采集百度所有服務器上的各類指標數據及用戶自定義數據,通過對各種數據進行多維分析展示,輔助定位分析實例異常或業務層面異常。目前覆蓋百度內部20多個業務線(包括casio、云分析、網盟、預測、文庫、直達號、錢包、風控等),單集群最大100臺機器,200個ES節點,每天導入30TB+數據
- 新浪使用ES 分析處理32億條實時日志
- 阿里使用ES 構建自己的日志采集和分析體系
1.3 ElasticSearch對比Solr
- Solr 利用 Zookeeper 進行分布式管理,而 Elasticsearch 自身帶有分布式協調管理功能;
- Solr 支持更多格式的數據,而 Elasticsearch 僅支持json文件格式;
- Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,高級功能多有第三方插件提供;
- Solr 在傳統的搜索應用中表現好于 Elasticsearch,但在處理實時搜索應用時效率明顯低于 Elasticsearch
第二章 ElasticSearch安裝與啟動
2.1 下載ES壓縮包
ElasticSearch分為Linux和Window版本,基于我們主要學習的是ElasticSearch的Java客戶端的使用,所以我們課程中使用的是安裝較為簡便的Window版本,項目上線后,公司的運維人員會安裝Linux版的ES供我們連接使用。
ElasticSearch的官方地址: ?https://www.elastic.co/products/elasticsearch
2.2 安裝ES服務
Window版的ElasticSearch的安裝很簡單,類似Window版的Tomcat,解壓開即安裝完畢,解壓后的ElasticSearch的目錄結構如下:
修改elasticsearch配置文件:config/elasticsearch.yml,增加以下兩句命令:
http.cors.enabled: true
http.cors.allow-origin: "*"
此步為允許elasticsearch跨越訪問,如果不安裝后面的elasticsearch-head是可以不修改,直接啟動。
2.3 啟動ES服務
點擊ElasticSearch下的bin目錄下的elasticsearch.bat啟動,控制臺顯示的日志信息如下:
注意:9300是tcp通訊端口,集群間和TCPClient都執行該端口,9200是http協議的RESTful接口 。
通過瀏覽器訪問ElasticSearch服務器,看到如下返回的json信息,代表服務啟動成功:
注意:ElasticSearch是使用java開發的,且本版本的es需要的jdk版本要是1.8以上,所以安裝ElasticSearch之前保證JDK1.8+安裝完畢,并正確的配置好JDK環境變量,否則啟動ElasticSearch失敗。
2.4 安裝ES的圖形化界面插件
ElasticSearch不同于Solr自帶圖形化界面,我們可以通過安裝ElasticSearch的head插件,完成圖形化界面的效果,完成索引數據的查看。安裝插件的方式有兩種,在線安裝和本地安裝。本文檔采用本地安裝方式進行head插件的安裝。elasticsearch-5-*以上版本安裝head需要安裝node和grunt
1)下載head插件:?https://github.com/mobz/elasticsearch-head
在資料中已經提供了elasticsearch-head-master插件壓縮包:
2)將elasticsearch-head-master壓縮包解壓到任意目錄,但是要和elasticsearch的安裝目錄區別開
3)下載nodejs:?https://nodejs.org/en/download/
在資料中已經提供了nodejs安裝程序:
雙擊安裝程序。
安裝完畢,可以通過cmd控制臺輸入:node -v 查看版本號
5)將grunt安裝為全局命令 ,Grunt是基于Node.js的項目構建工具
在cmd控制臺中輸入如下執行命令:
npm install -g grunt-cli
執行結果如下圖:
6)進入elasticsearch-head-master目錄啟動head,在命令提示符下輸入命令:
>npm install
>grunt server
7)打開瀏覽器,輸入 ?http://localhost:9100,看到如下頁面:
如果不能成功連接到es服務,需要修改ElasticSearch的config目錄下的配置文件:config/elasticsearch.yml,增加以下兩句命令:
http.cors.enabled: true
http.cors.allow-origin: "*"
然后重新啟動ElasticSearch服務。
第三章 ElasticSearch相關概念(術語)
3.1 概述
Elasticsearch是面向文檔(document oriented)的,這意味著它可以存儲整個對象或文檔(document)。然而它不僅僅是存儲,還會索引(index)每個文檔的內容使之可以被搜索。在Elasticsearch中,你可以對文檔(而非成行成列的數據)進行索引、搜索、排序、過濾。Elasticsearch比傳統關系型數據庫如下:
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields
3.2 Elasticsearch核心概念
3.2.1 索引 index
一個索引就是一個擁有幾分相似特征的文檔的集合。比如說,你可以有一個客戶數據的索引,另一個產品目錄的索引,還有一個訂單數據的索引。一個索引由一個名字來標識(必須全部是小寫字母的),并且當我們要對對應于這個索引中的文檔進行索引、搜索、更新和刪除的時候,都要使用到這個名字。在一個集群中,可以定義任意多的索引。
3.2.2 類型 type
在一個索引中,你可以定義一種或多種類型。一個類型是你的索引的一個邏輯上的分類/分區,其語義完全由你來定。通常,會為具有一組共同字段的文檔定義一個類型。比如說,我們假設你運營一個博客平臺并且將你所有的數據存儲到一個索引中。在這個索引中,你可以為用戶數據定義一個類型,為博客數據定義另一個類型,當然,也可以為評論數據定義另一個類型。
3.2.3 字段Field
相當于是數據表的字段,對文檔數據根據不同屬性進行的分類標識
3.2.4 映射 mapping
mapping是處理數據的方式和規則方面做一些限制,如某個字段的數據類型、默認值、分析器、是否被索引等等,這些都是映射里面可以設置的,其它就是處理es里面數據的一些使用規則設置也叫做映射,按著最優規則處理數據對性能提高很大,因此才需要建立映射,并且需要思考如何建立映射才能對性能更好。
3.2.5 文檔 document
一個文檔是一個可被索引的基礎信息單元。比如,你可以擁有某一個客戶的文檔,某一個產品的一個文檔,當然,也可以擁有某個訂單的一個文檔。文檔以JSON(Javascript Object Notation)格式來表示,而JSON是一個到處存在的互聯網數據交互格式。
在一個index/type里面,你可以存儲任意多的文檔。注意,盡管一個文檔,物理上存在于一個索引之中,文檔必須被索引/賦予一個索引的type。
3.2.6 接近實時 NRT
Elasticsearch是一個接近實時的搜索平臺。這意味著,從索引一個文檔直到這個文檔能夠被搜索到有一個輕微的延遲(通常是1秒以內)
3.2.7 集群 cluster
一個集群就是由一個或多個節點組織在一起,它們共同持有整個的數據,并一起提供索引和搜索功能。一個集群由一個唯一的名字標識,這個名字默認就是“elasticsearch”。這個名字是重要的,因為一個節點只能通過指定某個集群的名字,來加入這個集群
3.2.8 節點 node
一個節點是集群中的一個服務器,作為集群的一部分,它存儲數據,參與集群的索引和搜索功能。和集群類似,一個節點也是由一個名字來標識的,默認情況下,這個名字是一個隨機的漫威漫畫角色的名字,這個名字會在啟動的時候賦予節點。這個名字對于管理工作來說挺重要的,因為在這個管理過程中,你會去確定網絡中的哪些服務器對應于Elasticsearch集群中的哪些節點。
一個節點可以通過配置集群名稱的方式來加入一個指定的集群。默認情況下,每個節點都會被安排加入到一個叫做“elasticsearch”的集群中,這意味著,如果你在你的網絡中啟動了若干個節點,并假定它們能夠相互發現彼此,它們將會自動地形成并加入到一個叫做“elasticsearch”的集群中。
在一個集群里,只要你想,可以擁有任意多個節點。而且,如果當前你的網絡中沒有運行任何Elasticsearch節點,這時啟動一個節點,會默認創建并加入一個叫做“elasticsearch”的集群。
3.2.9 分片和副本 shards&replicas
一個索引可以存儲超出單個結點硬件限制的大量數據。比如,一個具有10億文檔的索引占據1TB的磁盤空間,而任一節點都沒有這樣大的磁盤空間;或者單個節點處理搜索請求,響應太慢。為了解決這個問題,Elasticsearch提供了將索引劃分成多份的能力,這些份就叫做分片。當你創建一個索引的時候,你可以指定你想要的分片的數量。每個分片本身也是一個功能完善并且獨立的“索引”,這個“索引”可以被放置到集群中的任何節點上。分片很重要,主要有兩方面的原因:
1)允許你水平分割/擴展你的內容容量。
2)允許你在分片(潛在地,位于多個節點上)之上進行分布式的、并行的操作,進而提高性能/吞吐量。
至于一個分片怎樣分布,它的文檔怎樣聚合回搜索請求,是完全由Elasticsearch管理的,對于作為用戶的你來說,這些都是透明的。
在一個網絡/云的環境里,失敗隨時都可能發生,在某個分片/節點不知怎么的就處于離線狀態,或者由于任何原因消失了,這種情況下,有一個故障轉移機制是非常有用并且是強烈推薦的。為此目的,Elasticsearch允許你創建分片的一份或多份拷貝,這些拷貝叫做復制分片,或者直接叫復制。
復制之所以重要,有兩個主要原因: 在分片/節點失敗的情況下,提供了高可用性。因為這個原因,注意到復制分片從不與原/主要(original/primary)分片置于同一節點上是非常重要的。擴展你的搜索量/吞吐量,因為搜索可以在所有的復制上并行運行。總之,每個索引可以被分成多個分片。一個索引也可以被復制0次(意思是沒有復制)或多次。一旦復制了,每個索引就有了主分片(作為復制源的原來的分片)和復制分片(主分片的拷貝)之別。分片和復制的數量可以在索引創建的時候指定。在索引創建之后,你可以在任何時候動態地改變復制的數量,但是你事后不能改變分片的數量。
默認情況下,Elasticsearch中的每個索引被分片5個主分片和1個復制,這意味著,如果你的集群中至少有兩個節點,你的索引將會有5個主分片和另外5個復制分片(1個完全拷貝),這樣的話每個索引總共就有10個分片。
第四章 ElasticSearch的客戶端操作
實際開發中,主要有三種方式可以作為elasticsearch服務的客戶端:
第一種,elasticsearch-head插件
第二種,使用elasticsearch提供的Restful接口直接訪問
第三種,使用elasticsearch提供的API進行訪問
4.1 安裝Postman工具
Postman中文版是postman這款強大網頁調試工具的windows客戶端,提供功能強大的Web API & HTTP 請求調試。軟件功能非常強大,界面簡潔明晰、操作方便快捷,設計得很人性化。Postman中文版能夠發送任何類型的HTTP 請求 (GET, HEAD, POST, PUT…),且可以附帶任何數量的參數。
4.1 下載Postman工具
Postman官網:?https://www.getpostman.com
課程資料中已經提供了安裝包
4.2 注冊Postman工具
4.2 使用Postman工具進行Restful接口訪問
4.2.1 ElasticSearch的接口語法
?
curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
4.2.2 創建索引index和映射mapping
請求url:
PUT localhost:9200/blog1
{"mappings": {"article": {"properties": {"id": {"type": "long","store": true,"index":"not_analyzed"},"title": {"type": "text","store": true,"index":"analyzed","analyzer":"standard"},"content": {"type": "text","store": true,"index":"analyzed","analyzer":"standard"}}}}
}
postman截圖:
elasticsearch-head查看:
4.2.3 創建索引后設置Mapping
我們可以在創建索引時設置mapping信息,當然也可以先創建索引然后再設置mapping。
在上一個步驟中不設置maping信息,直接使用put方法創建一個索引,然后設置mapping信息。
PUT http://localhost:9200/blog2
請求的url:
POST http://127.0.0.1:9200/blog2/hello/_mapping
請求體:
{"hello": {"properties": {"id":{"type": "long","index":"not_analyzed"},"title":{"type":"text","store":true,"index":true,"analyzer":"standard"},"content":{"type":"text","store":true,"index":true,"analyzer":"standard"}}}}
PostMan截圖
4.2.4 刪除索引index
請求url:
DELETE localhost:9200/blog2
postman截圖:
elasticsearch-head查看:
4.2.5 創建文檔document
請求url:
POST localhost:9200/blog1/article/1
請求體:上面article代表著type,后面的1代表著id,所以下面的請求體中可以不用設置id
{"id":1,"title":"ElasticSearch是一個基于Lucene的搜索服務器","content":"它提供了一個分布式多用戶能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java開發的,并作為Apache許可條款下的開放源碼發布,是當前流行的企業級搜索引擎。設計用于云計算中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便。"}
postman截圖:
elasticsearch-head查看:
4.2.6 修改文檔document
請求url:
POST localhost:9200/blog1/article/1
{"id":1,"title":"【修改】ElasticSearch是一個基于Lucene的搜索服務器","content":"【修改】它提供了一個分布式多用戶能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java開發的,并作為Apache許可條款下的開放源碼發布,是當前流行的企業級搜索引擎。設計用于云計算中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便。"
}
postman截圖:
elasticsearch-head查看:
4.2.7 刪除文檔document
請求url:
DELETE localhost:9200/blog1/article/1
postman截圖:
elasticsearch-head查看:
4.2.8 查詢文檔-根據id查詢
注意:根據的是es的_id進行查詢的,并不是字段id!
請求url:
GET localhost:9200/blog1/article/1
postman截圖:
4.2.9 查詢文檔-querystring查詢
請求url:
POST localhost:9200/blog1/article/_search
請求體:
{"query": {"query_string": {"default_field": "title","query": "搜索服務器"}}
}
postman截圖:
注意:
將搜索內容"搜索服務器"修改為"鋼索",同樣也能搜索到文檔,該原因會在下面講解中得到答案
{"query": {"query_string": {"default_field": "title","query": "鋼索"}}
}
4.2.10 查詢文檔-term查詢
?
請求url:
POST localhost:9200/blog1/article/_search
請求體:
{"query": {"term": {"title": "搜索"}}
}
postman截圖:
第五章 IK 分詞器和ElasticSearch集成使用
5.1 上述查詢存在問題分析
在進行字符串查詢時,我們發現去搜索"搜索服務器"和"鋼索"都可以搜索到數據;
而在進行詞條查詢時,我們搜索"搜索"卻沒有搜索到數據;
究其原因是ElasticSearch的標準分詞器導致的,當我們創建索引時,字段使用的是標準分詞器:
{"mappings": {"article": {"properties": {"id": {"type": "long","store": true,"index":"not_analyzed"},"title": {"type": "text","store": true,"index":"analyzed","analyzer":"standard" //標準分詞器},"content": {"type": "text","store": true,"index":"analyzed","analyzer":"standard" //標準分詞器}}}}
}
例如對 “我是程序員” 進行分詞
標準分詞器分詞效果測試:
http://127.0.0.1:9200/_analyze?analyzer=standard&pretty=true&text=我是程序員
分詞結果:
{"tokens" : [{"token" : "我","start_offset" : 0,"end_offset" : 1,"type" : "<IDEOGRAPHIC>","position" : 0},{"token" : "是","start_offset" : 1,"end_offset" : 2,"type" : "<IDEOGRAPHIC>","position" : 1},{"token" : "程","start_offset" : 2,"end_offset" : 3,"type" : "<IDEOGRAPHIC>","position" : 2},{"token" : "序","start_offset" : 3,"end_offset" : 4,"type" : "<IDEOGRAPHIC>","position" : 3},{"token" : "員","start_offset" : 4,"end_offset" : 5,"type" : "<IDEOGRAPHIC>","position" : 4}]
}
而我們需要的分詞效果是:我、是、程序、程序員
這樣的話就需要對中文支持良好的分析器的支持,支持中文分詞的分詞器有很多,word分詞器、庖丁解牛、盤古分詞、Ansj分詞等,但我們常用的還是下面要介紹的IK分詞器。
5.2 IK分詞器簡介
IKAnalyzer是一個開源的,基于java語言開發的輕量級的中文分詞工具包。從2006年12月推出1.0版開始,IKAnalyzer已經推出 了3個大版本。最初,它是以開源項目Lucene為應用主體的,結合詞典分詞和文法分析算法的中文分詞組件。新版本的IKAnalyzer3.0則發展為 面向Java的公用分詞組件,獨立于Lucene項目,同時提供了對Lucene的默認優化實現。
IK分詞器3.0的特性如下:
1)采用了特有的“正向迭代最細粒度切分算法“,具有60萬字/秒的高速處理能力。
2)采用了多子處理器分析模式,支持:英文字母(IP地址、Email、URL)、數字(日期,常用中文數量詞,羅馬數字,科學計數法),中文詞匯(姓名、地名處理)等分詞處理。
3)對中英聯合支持不是很好,在這方面的處理比較麻煩.需再做一次查詢,同時是支持個人詞條的優化的詞典存儲,更小的內存占用。
4)支持用戶詞典擴展定義。
5)針對Lucene全文檢索優化的查詢分析器IKQueryParser;采用歧義分析算法優化查詢關鍵字的搜索排列組合,能極大的提高Lucene檢索的命中率。
5.3 ElasticSearch集成IK分詞器
5.3.1 IK分詞器的安裝
1)下載地址:?https://github.com/medcl/elasticsearch-analysis-ik/releases
課程資料也提供了IK分詞器的壓縮包:
2)解壓,將解壓后的elasticsearch文件夾拷貝到elasticsearch-5.6.8\plugins下,并重命名文件夾為ik
3)重新啟動ElasticSearch,即可加載IK分詞器
5.3.2 IK分詞器測試
IK提供了兩個分詞算法ik_smart 和 ik_max_word
其中 ik_smart 為最少切分,ik_max_word為最細粒度劃分
我們分別來試一下
1)最小切分:在瀏覽器地址欄輸入地址
http://127.0.0.1:9200/_analyze?analyzer=ik_smart&pretty=true&text=我是程序員
輸出的結果為:
{"tokens" : [{"token" : "我","start_offset" : 0,"end_offset" : 1,"type" : "CN_CHAR","position" : 0},{"token" : "是","start_offset" : 1,"end_offset" : 2,"type" : "CN_CHAR","position" : 1},{"token" : "程序員","start_offset" : 2,"end_offset" : 5,"type" : "CN_WORD","position" : 2}]
}
2)最細切分:在瀏覽器地址欄輸入地址
http://127.0.0.1:9200/_analyze?analyzer=ik_max_word&pretty=true&text=我是程序員
輸出的結果為:
{"tokens" : [{"token" : "我","start_offset" : 0,"end_offset" : 1,"type" : "CN_CHAR","position" : 0},{"token" : "是","start_offset" : 1,"end_offset" : 2,"type" : "CN_CHAR","position" : 1},{"token" : "程序員","start_offset" : 2,"end_offset" : 5,"type" : "CN_WORD","position" : 2},{"token" : "程序","start_offset" : 2,"end_offset" : 4,"type" : "CN_WORD","position" : 3},{"token" : "員","start_offset" : 4,"end_offset" : 5,"type" : "CN_CHAR","position" : 4}]
}
5.4 修改索引映射mapping
5.4.1 重建索引
刪除原有blog1索引
DELETE localhost:9200/blog1
創建blog1索引,此時分詞器使用ik_max_word
PUT localhost:9200/blog1
{"mappings": {"article": {"properties": {"id": {"type": "long","store": true,"index":"not_analyzed"},"title": {"type": "text","store": true,"index":"analyzed","analyzer":"ik_max_word"},"content": {"type": "text","store": true,"index":"analyzed","analyzer":"ik_max_word"}}}}
}
創建文檔
POST localhost:9200/blog1/article/1
{"id":1,"title":"ElasticSearch是一個基于Lucene的搜索服務器","content":"它提供了一個分布式多用戶能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java開發的,并作為Apache許可條款下的開放源碼發布,是當前流行的企業級搜索引擎。設計用于云計算中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便。"
}
5.4.2 再次測試queryString查詢
請求url:
POST localhost:9200/blog1/article/_search
請求體:
{"query": {"query_string": {"default_field": "title","query": "搜索服務器"}}
}
postman截圖:
將請求體搜索字符串修改為"鋼索",再次查詢:
{"query": {"query_string": {"default_field": "title","query": "鋼索"}}
}
postman截圖:
5.4.3 再次測試term測試
term會根據分詞進行查詢,使用中文分詞器后,有’搜索’這個分詞,所以查詢出來了
請求url:
{"query": {"query_string": {"default_field": "title","query": "鋼索"}}
}
postman截圖:
5.4.3 再次測試term測試
term會根據分詞進行查詢,使用中文分詞器后,有’搜索’這個分詞,所以查詢出來了
請求url:
{"query": {"term": {"title": "搜索"}}
}
postman截圖:
第六章 ElasticSearch集群
ES集群是一個 P2P類型(使用 gossip 協議)的分布式系統,除了集群狀態管理以外,其他所有的請求都可以發送到集群內任意一臺節點上,這個節點可以自己找到需要轉發給哪些節點,并且直接跟這些節點通信。所以,從網絡架構及服務配置上來說,構建集群所需要的配置極其簡單。在 Elasticsearch 2.0 之前,無阻礙的網絡下,所有配置了相同 cluster.name 的節點都自動歸屬到一個集群中。2.0 版本之后,基于安全的考慮避免開發環境過于隨便造成的麻煩,從 2.0 版本開始,默認的自動發現方式改為了單播(unicast)方式。配置里提供幾臺節點的地址,ES 將其視作 gossip router 角色,借以完成集群的發現。由于這只是 ES 內一個很小的功能,所以 gossip router 角色并不需要單獨配置,每個 ES 節點都可以擔任。所以,采用單播方式的集群,各節點都配置相同的幾個節點列表作為 router 即可。
? 集群中節點數量沒有限制,一般大于等于2個節點就可以看做是集群了。一般處于高性能及高可用方面來考慮一般集群中的節點數量都是3個及3個以上。
6.1 集群的相關概念
6.1.1 集群 cluster
一個集群就是由一個或多個節點組織在一起,它們共同持有整個的數據,并一起提供索引和搜索功能。一個集群由一個唯一的名字標識,這個名字默認就是“elasticsearch”。這個名字是重要的,因為一個節點只能通過指定某個集群的名字,來加入這個集群
6.1.2 節點 node
一個節點是集群中的一個服務器,作為集群的一部分,它存儲數據,參與集群的索引和搜索功能。和集群類似,一個節點也是由一個名字來標識的,默認情況下,這個名字是一個隨機的漫威漫畫角色的名字,這個名字會在啟動的時候賦予節點。這個名字對于管理工作來說挺重要的,因為在這個管理過程中,你會去確定網絡中的哪些服務器對應于Elasticsearch集群中的哪些節點。
一個節點可以通過配置集群名稱的方式來加入一個指定的集群。默認情況下,每個節點都會被安排加入到一個叫做“elasticsearch”的集群中,這意味著,如果你在你的網絡中啟動了若干個節點,并假定它們能夠相互發現彼此,它們將會自動地形成并加入到一個叫做“elasticsearch”的集群中。
在一個集群里,只要你想,可以擁有任意多個節點。而且,如果當前你的網絡中沒有運行任何Elasticsearch節點,這時啟動一個節點,會默認創建并加入一個叫做“elasticsearch”的集群。
6.1.3 分片和復制 shards&replicas
一個索引可以存儲超出單個結點硬件限制的大量數據。比如,一個具有10億文檔的索引占據1TB的磁盤空間,而任一節點都沒有這樣大的磁盤空間;或者單個節點處理搜索請求,響應太慢。為了解決這個問題,Elasticsearch提供了將索引劃分成多份的能力,這些份就叫做分片。當你創建一個索引的時候,你可以指定你想要的分片的數量。每個分片本身也是一個功能完善并且獨立的“索引”,這個“索引”可以被放置到集群中的任何節點上。分片很重要,主要有兩方面的原因:
1)允許你水平分割/擴展你的內容容量。
2)允許你在分片(潛在地,位于多個節點上)之上進行分布式的、并行的操作,進而提高性能/吞吐量。
至于一個分片怎樣分布,它的文檔怎樣聚合回搜索請求,是完全由Elasticsearch管理的,對于作為用戶的你來說,這些都是透明的。
在一個網絡/云的環境里,失敗隨時都可能發生,在某個分片/節點不知怎么的就處于離線狀態,或者由于任何原因消失了,這種情況下,有一個故障轉移機制是非常有用并且是強烈推薦的。為此目的,Elasticsearch允許你創建分片的一份或多份拷貝,這些拷貝叫做復制分片,或者直接叫復制。
復制之所以重要,有兩個主要原因: 在分片/節點失敗的情況下,提供了高可用性。因為這個原因,注意到復制分片從不與原/主要(original/primary)分片置于同一節點上是非常重要的。擴展你的搜索量/吞吐量,因為搜索可以在所有的復制上并行運行。總之,每個索引可以被分成多個分片。一個索引也可以被復制0次(意思是沒有復制)或多次。一旦復制了,每個索引就有了主分片(作為復制源的原來的分片)和復制分片(主分片的拷貝)之別。分片和復制的數量可以在索引創建的時候指定。在索引創建之后,你可以在任何時候動態地改變復制的數量,但是你事后不能改變分片的數量。
默認情況下,Elasticsearch中的每個索引被分片5個主分片和1個復制,這意味著,如果你的集群中至少有兩個節點,你的索引將會有5個主分片和另外5個復制分片(1個完全拷貝),這樣的話每個索引總共就有10個分片。
6.2 集群的搭建
6.2.1 準備三臺elasticsearch服務器
創建elasticsearch-cluster文件夾,在內部復制三個新解壓的elasticsearch服務
6.2.2 修改每臺服務器配置
修改elasticsearch-cluster\node*\config\elasticsearch.yml配置文件
node1節點:
http.cors.enabled: true
http.cors.allow-origin: "*"
#節點1的配置信息:
#集群名稱,保證唯一
cluster.name: my-elasticsearch
#節點名稱,必須不一樣
node.name: node-1
#必須為本機的ip地址
network.host: 127.0.0.1
#服務端口號,在同一集群下必須不一樣
http.port: 9200
#集群間通信端口號,在同一集群下必須不一樣
transport.tcp.port: 9300
#設置集群自動發現機器ip集合
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300","127.0.0.1:9301","127.0.0.1:9302"]
node2節點:
http.cors.enabled: true
http.cors.allow-origin: "*"
#節點2的配置信息:
#集群名稱,保證唯一
cluster.name: my-elasticsearch
#節點名稱,必須不一樣
node.name: node-2
#必須為本機的ip地址
network.host: 127.0.0.1
#服務端口號,在同一集群下必須不一樣
http.port: 9201
#集群間通信端口號,在同一集群下必須不一樣
transport.tcp.port: 9301
#設置集群自動發現機器ip集合
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300","127.0.0.1:9301","127.0.0.1:9302"]
node3節點:
http.cors.enabled: true
http.cors.allow-origin: "*"
#節點3的配置信息:
#集群名稱,保證唯一
cluster.name: my-elasticsearch
#節點名稱,必須不一樣
node.name: node-3
#必須為本機的ip地址
network.host: 127.0.0.1
#服務端口號,在同一集群下必須不一樣
http.port: 9202
#集群間通信端口號,在同一集群下必須不一樣
transport.tcp.port: 9302
#設置集群自動發現機器ip集合
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300","127.0.0.1:9301","127.0.0.1:9302"]
6.2.3 啟動各個節點服務器
雙擊elasticsearch-cluster\node*\bin\elasticsearch.bat
啟動節點1:
啟動節點2:
啟動節點3:
6.2.4 集群測試
添加索引和映射
PUT localhost:9200/blog1
{"mappings": {"article": {"properties": {"id": {"type": "long","store": true,"index":"not_analyzed"},"title": {"type": "text","store": true,"index":"analyzed","analyzer":"standard"},"content": {"type": "text","store": true,"index":"analyzed","analyzer":"standard"}}}}
}
添加文檔
POST localhost:9200/blog1/article/1
{"id":1,"title":"ElasticSearch是一個基于Lucene的搜索服務器","content":"它提供了一個分布式多用戶能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java開發的,并作為Apache許可條款下的開放源碼發布,是當前流行的企業級搜索引擎。設計用于云計算中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便。"
}
使用elasticsearch-header查看集群情況