ElasticSearch第一天

學習目標:

  1. 能夠理解ElasticSearch的作用
  2. 能夠安裝ElasticSearch服務
  3. 能夠理解ElasticSearch的相關概念
  4. 能夠使用Postman發送Restful請求操作ElasticSearch
  5. 能夠理解分詞器的作用
  6. 能夠使用ElasticSearch集成IK分詞器
  7. 能夠完成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查看集群情況

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/44319.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/44319.shtml
英文地址,請注明出處:http://en.pswp.cn/web/44319.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

windows 中的 Nsight Systems 通過ssh 鏈接分析 Linux 中的cuda程序性能

1&#xff0c;Linux 環境 安裝 ssh-server $ sudo apt install openssh-server 安裝較新版本的 cuda sdk 下載cuda-samples github repo 編輯修改 ssh 配置&#xff1a; $ sudo vim /etc/ssh/sshd_config 刪除相關注釋&#xff0c;修改后如下&#xff1a; Port 22 Addres…

只會vue的前端開發工程師是不是不能活了?最近被一個flutter叼了

**Vue與Flutter&#xff1a;前端開發的新篇章** 在前端開發的世界里&#xff0c;Vue.js和Flutter無疑是兩顆璀璨的明星。Vue以其輕量級、易上手的特點吸引了大量前端開發者的青睞&#xff0c;而Flutter則以其跨平臺、高性能的優勢迅速崛起。那么&#xff0c;對于只會Vue的前端…

【深度學習基礎】環境搭建 linux系統下安裝pytorch

目錄 一、anaconda 安裝二、創建pytorch1. 創建pytorch環境&#xff1a;2. 激活環境3. 下載安裝pytorch包4. 檢查是否安裝成功 一、anaconda 安裝 具體的安裝說明可以參考我的另外一篇文章【環境搭建】Linux報錯bash: conda: command not found… 二、創建pytorch 1. 創建py…

OceanBase:引領下一代分布式數據庫技術的前沿

OceanBase的基本概念 定義和特點 OceanBase是一款由螞蟻金服開發的分布式關系數據庫系統&#xff0c;旨在提供高性能、高可用性和強一致性的數據庫服務。它結合了關系數據庫和分布式系統的優勢&#xff0c;適用于大規模數據處理和高并發業務場景。其核心特點包括&#xff1a; …

【考研數學】25張宇強化36講測評及強化階段注意事項

張宇新版36講創新真的很大&#x1f979; 引入了很多張宇老師認為對大家解題幫助很大的技巧和知識點&#xff0c;但是也有人認為是多余的。 張宇老師新版36講第一講就講了整整8個小時&#xff01;&#x1f62d; 大家想想&#xff0c;自己有那個時間去吃透36講嗎&#xff1f;如果…

python調用阿里云匯率接口

整體請求流程 介紹&#xff1a; 本次解析通過阿里云云市場的云服務來實現程序中對貨幣匯率實時監控&#xff0c;首先需要準備選擇一家可以提供匯率查詢的商品。 https://market.aliyun.com/apimarket/detail/cmapi00065831#skuyuncode5983100001 步驟1: 選擇商品 如圖點擊…

debian 12 Install

debian 前言 Debian是一個基于Linux內核的自由和開放源代碼操作系統&#xff0c;由全球志愿者組成的Debian項目維護和開發。該項目始于1993年&#xff0c;由Ian Murdock發起&#xff0c;旨在創建一個完整的、基于Linux的自由軟件操作系統。 debian download debian 百度網盤…

分布式應用系統設計:即時消息系統

即時消息(IM)系統&#xff0c;涉及&#xff1a;站內消息系統 組件如下&#xff1b; 客戶端&#xff1a; WEB頁面&#xff0c;IM桌面客戶端。通過WebSocket 跟ChatService后端服務連接 Chat Service&#xff1a; 提供WebSocket接口&#xff0c;并保持跟“客戶端”狀態的維護。…

會聲會影分割音頻怎么不能用 會聲會影分割音頻方法 會聲會影視頻制作教程 會聲會影下載免費中文版2023

將素材中的音頻分割出來&#xff0c;對聲音部分進行單獨編輯&#xff0c;是剪輯過程中的常用操作。會聲會影視頻剪輯軟件在分割音頻后&#xff0c;還可以對聲音素材進行混音編輯、音頻調節、添加音頻濾鏡等操作。有關會聲會影分割音頻怎么不能用&#xff0c;會聲會影分割音頻方…

如何快速制作您的數據可視化大屏?

數據大屏可視化主要就是借助圖形&#xff0c;利用生動、直觀的形式展示出數據信息的具體數值&#xff0c;使得使用者短時間內更加直觀的接受到大量信息。數據大屏以直觀、高度視覺沖擊力的方式向受眾揭示數據背后隱藏的規律&#xff0c;傳達數據價值。其以圖形化的形式呈現數據…

視頻使用操作說明書-T80005系列視頻編碼器如何對接海康NVR硬盤錄像機,包括T80005系列高清HDMI編碼器、4K超高清HDMI編碼器

視頻使用操作說明書-T80005系列視頻編碼器如何對接海康NVR硬盤錄像機&#xff0c;包括T80005系列高清HDMI編碼器、4K超高清HDMI編碼器。 視頻使用操作說明書-T80005系列視頻編碼器如何對接海康NVR硬盤錄像機&#xff0c;包括T80005系列高清HDMI編碼器、4K超高清HDMI編碼器 同三…

全國產T3+FPGA的SPI與I2C通信方案分享

近年來&#xff0c;隨著中國新基建、中國制造2025規劃的持續推進&#xff0c;單ARM處理器越來越難勝任工業現場的功能要求&#xff0c;特別是如今能源電力、工業控制、智慧醫療等行業&#xff0c;往往更需要ARM FPGA架構的處理器平臺來實現例如多路/高速AD采集、多路網口、多路…

Tomcat多實例

一、Tomcat多實例 Tomcat多實例是指在同一臺服務器上運行多個獨立的tomcat實例&#xff0c;每個tomcat實例都具有獨立的配置文件、日志文件、應用程序和端口&#xff0c;通過配置不同的端口和文件目錄&#xff0c;可以實現同時運行多個獨立的Tomcat服務器&#xff0c;每個服務…

element-plus 按需導入問題 404等問題

場景 新開一個項目&#xff0c;需要用element-plus這個ui庫&#xff0c;使用按需引入。 這是我項目的一些版本號 "element-plus": "^2.7.6","vue": "^3.2.13","vue-router": "^4.0.3",過程&#xff08;看解決方法…

FastGPT+OneAI接入網絡模型

文章目錄 FastGPT連接OneAI接入網絡模型1.準備工作2.開始部署2.1下載 docker-compose.yml2.2修改docker-compose.yml里的參數 3.打開FastGPT添加模型3.1打開OneAPI3.2接入網絡模型3.3重啟服務 FastGPT連接OneAI接入網絡模型 1.準備工作 本文檔參考FastGPT的官方文檔 主機ip接…

JVM是如何管理內存的?圖文詳解GC垃圾回收算法

前言&#xff1a;在C/C中對于變量的內存空間一般都是由程序員手動進行管理的&#xff0c;往往會伴隨著大量的 malloc 和 free 操作&#xff0c;常常會有很多問題困擾開發者&#xff0c;這個代碼會不會發生內存泄漏&#xff1f;會不會重復釋放內存&#xff1f;但是在Java開發中我…

基于企業微信第三方接口開發,移除群成員通知

移除群成員通知 返回示例 {"flag": 0, "receiver": 0, "sender_name": "", "is_room": 1, "server_id": 15318083, "send_time": 1687688952, "sender": 1688855749266556, "referid&…

Spring源碼十九:Bean實例化流程二

上一篇我們在Spring源碼十八&#xff1a;Bean實例化流程一 中&#xff0c;主要討論了Spring在實例化前的兩重要準備工作&#xff0c;1、獲取我們前面注冊好的BeanDefinition&#xff0c;將GenericBeanDefinition封裝為RootBeanDefinition如果Bean Definition只存在父容器中&…

.profile腳本

.profile 是一個用戶級別的 shell 啟動腳本&#xff0c;用于初始化用戶環境設置&#xff0c;通常用于配置環境變量、設置路徑、運行初始化命令等。以下是一個示例 if [ "$BASH" ]; thenif [ -f ~/.bashrc ]; then. ~/.bashrcfi fimesg n || true 這段代碼通常出現在…

計算器原生js

目錄 1.HTML 2.CSS 2.JS 4.資源 5.運行截圖 6.下載連接 7.注意事項 1.HTML <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-s…