袁庭新老師ES系列14節(jié)|搭建Elasticsearch集群
前言
單節(jié)點的Elasticsearch需要在處理大量數(shù)據(jù)的時候需要消耗大量內(nèi)存和CPU資源,數(shù)據(jù)量大到一定程度就會產(chǎn)生處理瓶頸,甚至會出現(xiàn)宕機。為了解決單節(jié)點ES的處理能力的瓶頸及單節(jié)點故障問題,我們考慮使用Elasticsearch集群。接下來袁老師帶領(lǐng)大家學習如何搭建Elasticsearch的集群。
一. 集群的結(jié)構(gòu)
1.單點的問題
單點的Elasticsearch存在哪些可能出現(xiàn)的問題呢?
單臺機器存儲容量有限,無法實現(xiàn)高存儲。
單服務器容易出現(xiàn)單點故障,無法實現(xiàn)高可用。
單服務的并發(fā)處理能力有限,無法實現(xiàn)高并發(fā)。
所以,為了應對這些問題,我們需要對Elasticsearch搭建集群。
2.數(shù)據(jù)分片
首先,我們面臨的第一個問題就是數(shù)據(jù)量太大,單點存儲量有限的問題。大家覺得應該如何解決?
沒錯,我們可以把數(shù)據(jù)拆分成多份,每一份存儲到不同機器節(jié)點(Node),從而實現(xiàn)減少每個節(jié)點數(shù)據(jù)量的目的。這就是數(shù)據(jù)的分布式存儲,也叫做數(shù)據(jù)分片(Shard)。

3.數(shù)據(jù)備份
數(shù)據(jù)分片解決了海量數(shù)據(jù)存儲的問題,但是如果出現(xiàn)單點故障,那么分片數(shù)據(jù)就不再完整,這又該如何解決呢?
沒錯,就像大家為了備份手機數(shù)據(jù),會額外存儲一份到移動硬盤一樣。我們可以給每個分片數(shù)據(jù)進行備份,存儲到其它節(jié)點,防止數(shù)據(jù)丟失,這就是數(shù)據(jù)備份,也叫數(shù)據(jù)副本(replica)。
數(shù)據(jù)備份可以保證高可用,但是每個分片備份一份,所需要的節(jié)點數(shù)量就會翻一倍,成本實在是太高了。為了在高可用和成本間尋求平衡,我們可以這樣做:
首先對數(shù)據(jù)分片,存儲到不同節(jié)點。
然后對每個分片進行備份,放到對方節(jié)點,完成互相備份。
這樣可以大大減少所需要的服務節(jié)點數(shù)量。如下圖我們以3分片,每個分片備份一份為例。

在這個集群中,如果出現(xiàn)單節(jié)點故障,并不會導致數(shù)據(jù)缺失,所以保證了集群的高可用,同時也減少了節(jié)點中數(shù)據(jù)存儲量。并且因為是多個節(jié)點存儲數(shù)據(jù),因此用戶請求也會分發(fā)到不同服務器,并發(fā)能力也得到了一定的提升。
二. 搭建集群
1.搭建集群設(shè)計
集群需要多臺機器,我們這里用一臺機器來模擬,因此我們需要在一臺虛擬機中部署多個Elasticsearch節(jié)點,每個Elasticsearch的端口都必須不一樣。
我們將Elasticsearch的安裝包解壓三份出來,分別修改端口號,修改data和logs存放位置。而實際開發(fā)中,將每個Elasticsearch節(jié)點放在不同的服務器上。
我們將集群名稱設(shè)計為yx-elastic,并部署3個Elasticsearch節(jié)點。集群環(huán)境如下:

HTTP:表示使用HTTP協(xié)議進行訪問時使用的端口(Elasticsearch-head、Kibana、ApiPost),默認端口號是9200。
2.搭建集群實現(xiàn)
1.將elasticsearch-6.2.4.zip壓縮包解壓三份,分別做以下命名。

2.修改每一個節(jié)點con?g目錄下的elasticsearch.yml配置文件。三個節(jié)點的配置文件內(nèi)容幾乎一致,除了node.name、path.data、path.log、http.port、transport.tcp.port屬性的值。
(1) 配置node-01節(jié)點。
(2) 配置node-02節(jié)點。
(3) 配置node-03節(jié)點。
3.將下載的elasticsearch-analysis-ik-6.2.4.zip的壓縮包解壓到集群中每個elasticsearch的plugins目錄下,并將解壓后的目錄重命名成analysis-ik。
4.啟動集群。進入elasticsearch安裝目錄下的bin目錄下通過啟動文件來啟動Elasticsearch。把三個節(jié)點分別啟動,啟動時不要著急,要一個一個地啟動。啟動Elasticsearch服務即可加載IK分詞器。
三. 測試集群中創(chuàng)建索引庫
1.Kibana訪問集群
1.進入Kibana安裝目錄下的con?g目錄,修改kibana.yml文件,添加Elasticsearch服務地址的配置(注釋放開即可)。
2.進入Kibana安裝目錄下的bin目錄,通過運行啟動文件來啟動Kibana。前提是先啟動Elasticsearch服務集群,再啟動Kibana服務。
3.然后訪問Kibana地址http://127.0.0.1:5601,進行集群測試。
2.elasticsearch-head訪問集群
1.通過谷歌瀏覽器打開elasticsearch-head擴展程序。
2.在打開的窗口中輸入http://localhost:9201地址(可以是集群中任一一臺服務器地址)來查看Elasticsearch集群的啟動情況。

3.集群中創(chuàng)建索引庫
搭建集群以后就要創(chuàng)建索引庫了,那么問題來了,當我們創(chuàng)建一個索引庫后,數(shù)據(jù)會保存到哪個服務節(jié)點上呢?如果我們對索引庫分片,那么每個片會在哪個節(jié)點呢?
3.1.通過Kibana創(chuàng)建索引
通過API創(chuàng)建索引庫,設(shè)置集群的分片和備份值。示例:
這里有兩個屬性配置:

3.2.通過elasticsearch-head創(chuàng)建索引
在elasticsearch-head控制臺通過【索引】選項可以新建索引。這個要親自嘗試才知道。

3.3.elasticsearch-head創(chuàng)建索引失敗
在通過elasticsearch-head創(chuàng)建索引時,點擊新建索引窗口的【OK】按鈕,沒有任何響應,無法在頁面新建索引。針對此問題,打開瀏覽器控制臺,提示“Not Acceptable”錯誤。

解決方案見下:
1.打開elasticsearch-head安裝目錄下的vendor.js文件。
2.修改contentType屬性的取值。
(1) 找到第6886行代碼。
(2) 將6886行代碼改成如下內(nèi)容。
contentType: "application/json;charset=UTF-8",
3.修改s.contentType屬性值的比較。
(1) 找到第7573行代碼。
(2) 將7573行代碼改成如下內(nèi)容。
4.重新通過elasticsearch-head工具在控制臺點擊【索引】選項進行新建索引的測試。
3.4.使用elasticsearch-head查看集群
通過Chrome瀏覽器的elasticsearch-head插件查看索引,我們可以查看到分片的存儲結(jié)構(gòu):

可以看到,yx這個索引庫,有三個分片,分別是0、1、2,每個分片有1個副本,共6份。
node-01上保存了0號分片和1號分片的副本
node-02上保存了1號分片和2號分片的副本
node-03上保存了2號分片和0號分片的副本
四.?集群工作原理
1.shard與replica機制
1.一個index包含多個shard,也就是一個index存在多個服務器上。
2.每個shard都是一個最小工作單元,承載部分數(shù)據(jù),比如有三臺服務器,現(xiàn)在有三條數(shù)據(jù),這三條數(shù)據(jù)在三臺服務器上各方一條。
3.增減節(jié)點時,shard會自動在nodes中負載均衡。
4.primary shard(主分片)和replica shard(副本分片),每個document肯定只存在于某一個primary shard以及其對應的replica shard中,不可能存在于多個primary shard。
5.replica shard是primary shard的副本,負責容錯,以及承擔讀請求負載。
6.primary shard的數(shù)量在創(chuàng)建索引的時候就固定了,replica shard的數(shù)量可以隨時修改。
7.primary shard的默認數(shù)量是5,replica默認是1(每個主分片一個副本分片),默認有10個shard,5個primary shard,5個replica shard。
8.primary shard不能和自己的replica shard放在同一個節(jié)點上(否則節(jié)點宕機,primary shard和副本都丟失,起不到容錯的作用),但是可以和其他primary shard的replicashard放在同一個節(jié)點上。
2.集群寫入數(shù)據(jù)
在Elasticsearch集群中寫入數(shù)據(jù)的步驟:
1.客戶端選擇一個node發(fā)送請求過去,這個node就是coordinating node(協(xié)調(diào)節(jié)點)。
2.coordinating node對document進行路由,將請求轉(zhuǎn)發(fā)給對應的node,根據(jù)一定的算法選擇對應的節(jié)點進行存儲。
3.實際上,node上的primary shard處理請求,將數(shù)據(jù)保存在本地,然后將數(shù)據(jù)同步到replica node。
4.coordinating node如果發(fā)現(xiàn)primary node和所有的replica node都搞定之后,就會返回請求到客戶端。
這個路由簡單的說就是取模算法,比如說現(xiàn)在有3臺服務器,這個時候傳過來的id是5,那么5%3=2,就放在第2臺服務器。
3.ES查詢數(shù)據(jù)
3.1.倒排序算法
查詢有個算法叫倒排序。簡單的說就是,通過分詞把詞語出現(xiàn)的id進行記錄下來,在查詢的時候先去查到哪些id包含這個數(shù)據(jù),然后再根據(jù)id把數(shù)據(jù)查出來。
3.2.查詢過程
1.客戶端發(fā)送一個請求給協(xié)調(diào)節(jié)點(coordinate node)。
2.協(xié)調(diào)節(jié)點將搜索的請求轉(zhuǎn)發(fā)給所有的shard對應的primary shard或replica shard。
3.查詢階段(query phase),每一個shard將自己搜索的結(jié)果(其實也就是一些唯一標識),返回給協(xié)調(diào)節(jié)點,由協(xié)調(diào)節(jié)點進行數(shù)據(jù)的合并、排序和分頁等操作,產(chǎn)出最后的結(jié)果。
4.獲取階段(fetch phase),接著由協(xié)調(diào)節(jié)點,根據(jù)唯一標識去各個節(jié)點進行拉取數(shù)據(jù),最終返回給客戶端。
五. 結(jié)語
本節(jié)我們主要學習了Elasticsearch集群的相關(guān)內(nèi)容,Elasticsearch集群解決了三高問題,高存儲、高可用和高并發(fā)。主要從ES的集群架構(gòu)、如何搭建ES集群,帶領(lǐng)大家一步步從零搭建了一個ES集群環(huán)境。然后通過Kibana和elasticsearch-head工具訪問集群環(huán)境進行測試,最后講解了ES的基本操作。關(guān)于Elasticsearch集群相關(guān)的內(nèi)容就給大家介紹到這里。