手把手教你搭建一個Elasticsearch集羣

1、爲什麼要搭建 Elasticsearch 集羣

凡事都要講究個爲何。在搭建集羣以前,咱們首先先問一句,爲何咱們須要搭建集羣?它有什麼優點呢?前端

(1)高可用性

Elasticsearch 做爲一個搜索引擎,咱們對它的基本要求就是存儲海量數據而且能夠在很是短的時間內查詢到咱們想要的信息。因此第一步咱們須要保證的就是 Elasticsearch 的高可用性,什麼是高可用性呢?它一般是指,經過設計減小系統不能提供服務的時間。假設系統一直可以提供服務,咱們說系統的可用性是 100%。若是系統在某個時刻宕掉了,好比某個網站在某個時間掛掉了,那麼就能夠它臨時是不可用的。因此,爲了保證 Elasticsearch 的高可用性,咱們就應該儘可能減小 Elasticsearch 的不可用時間。java

那麼怎樣提升 Elasticsearch 的高可用性呢?這時集羣的做用就體現出來了。假如 Elasticsearch 只放在一臺服務器上,即單機運行,假如這臺主機忽然斷網了或者被攻擊了,那麼整個 Elasticsearch 的服務就不可用了。但若是改爲 Elasticsearch 集羣的話,有一臺主機宕機了,還有其餘的主機能夠支撐,這樣就仍然能夠保證服務是可用的。node

那可能有的小夥伴就會說了,那假如一臺主機宕機了,那麼不就沒法訪問這臺主機的數據了嗎?那假如我要訪問的數據正好存在這臺主機上,那不就獲取不到了嗎?難道其餘的主機裏面也存了一份如出一轍的數據?那這豈不是很浪費嗎?linux

爲了解答這個問題,這裏就引出了 Elasticsearch 的信息存儲機制了。首先解答上面的問題,一臺主機宕機了,這臺主機裏面存的數據依然是能夠被訪問到的,由於在其餘的主機上也有備份,但備份的時候也不是整臺主機備份,是分片備份的,那這裏就又引出了一個概念——分片。git

分片,英文叫作 Shard,顧名思義,分片就是對數據切分紅了多個部分。咱們知道 Elasticsearch 中一個索引(Index)至關因而一個數據庫,如存某網站的用戶信息,咱們就建一個名爲 user 的索引。但索引存儲的時候並非整個存一塊兒的,它是被分片存儲的,Elasticsearch 默認會把一個索引分紅五個分片,固然這個數字是能夠自定義的。分片是數據的容器,數據保存在分片內,分片又被分配到集羣內的各個節點裏。當你的集羣規模擴大或者縮小時, Elasticsearch 會自動的在各節點中遷移分片,使得數據仍然均勻分佈在集羣裏,因此至關於一份數據被分紅了多份並保存在不一樣的主機上。github

那這仍是沒解決問題啊,若是一臺主機掛掉了,那麼這個分片裏面的數據不就沒法訪問了?別的主機都是存儲的其餘的分片。實際上是能夠訪問的,由於其餘主機存儲了這個分片的備份,叫作副本,這裏就引出了另一個概念——副本。web

副本,英文叫作 Replica,一樣顧名思義,副本就是對原分片的複製,和原分片的內容是同樣的,Elasticsearch 默認會生成一份副本,因此至關因而五個原分片和五個分片副本,至關於一份數據存了兩份,並分了十個分片,固然副本的數量也是能夠自定義的。這時咱們只須要將某個分片的副本存在另一臺主機上,這樣當某臺主機宕機了,咱們依然還能夠從另一臺主機的副本中找到對應的數據。因此從外部來看,數據結果是沒有任何區別的。數據庫

通常來講,Elasticsearch 會盡可能把一個索引的不一樣分片存儲在不一樣的主機上,分片的副本也儘量存在不一樣的主機上,這樣能夠提升容錯率,從而提升高可用性。npm

但這時假如你只有一臺主機,那不就沒辦法了嗎?分片和副本實際上是沒意義的,一臺主機掛掉了,就全掛掉了。vim

(2)健康狀態

針對一個索引,Elasticsearch 中其實有專門的衡量索引健康情況的標誌,分爲三個等級:

  • green,綠色。這表明全部的主分片和副本分片都已分配。你的集羣是 100% 可用的。

  • yellow,黃色。全部的主分片已經分片了,但至少還有一個副本是缺失的。不會有數據丟失,因此搜索結果依然是完整的。不過,你的高可用性在某種程度上被弱化。若是更多的分片消失,你就會丟數據了。因此可把 yellow 想象成一個須要及時調查的警告。

  • red,紅色。至少一個主分片以及它的所有副本都在缺失中。這意味着你在缺乏數據:搜索只能返回部分數據,而分配到這個分片上的寫入請求會返回一個異常。

若是你只有一臺主機的話,其實索引的健康情況也是 yellow,由於一臺主機,集羣沒有其餘的主機能夠防止副本,因此說,這就是一個不健康的狀態,所以集羣也是十分有必要的。

(3)存儲空間

另外,既然是羣集,那麼存儲空間確定也是聯合起來的,假如一臺主機的存儲空間是固定的,那麼集羣它相對於單個主機也有更多的存儲空間,可存儲的數據量也更大。

因此綜上所述,咱們須要一個集羣!

2、詳細瞭解 Elasticsearch 集羣

接下來咱們再來了解下集羣的結構是怎樣的。

首先咱們應該清楚多臺主機構成了一個集羣,每臺主機稱做一個節點(Node)。

如圖就是一個三節點的集羣:

在圖中,每一個 Node 都有三個分片,其中 P 開頭的表明 Primary 分片,即主分片,R 開頭的表明 Replica 分片,即副本分片。因此圖中主分片 一、2,副本分片 0 儲存在 1 號節點,副本分片 0、一、2 儲存在 2 號節點,主分片 0 和副本分片 一、2 儲存在 3 號節點,一共是 3 個主分片和 6 個副本分片。同時咱們還注意到 1 號節點還有個 MASTER 的標識,這表明它是一個主節點,它相比其餘的節點更加特殊,它有權限控制整個集羣,好比資源的分配、節點的修改等等。

這裏就引出了一個概念就是節點的類型,咱們能夠將節點分爲這麼四個類型:

  • 主節點:即 Master 節點。主節點的主要職責是和集羣操做相關的內容,如建立或刪除索引,跟蹤哪些節點是羣集的一部分,並決定哪些分片分配給相關的節點。穩定的主節點對集羣的健康是很是重要的。默認狀況下任何一個集羣中的節點都有可能被選爲主節點。索引數據和搜索查詢等操做會佔用大量的cpu,內存,io資源,爲了確保一個集羣的穩定,分離主節點和數據節點是一個比較好的選擇。雖然主節點也能夠協調節點,路由搜索和從客戶端新增數據到數據節點,但最好不要使用這些專用的主節點。一個重要的原則是,儘量作儘可能少的工做。

  • 數據節點:即 Data 節點。數據節點主要是存儲索引數據的節點,主要對文檔進行增刪改查操做,聚合操做等。數據節點對 CPU、內存、IO 要求較高,在優化的時候須要監控數據節點的狀態,當資源不夠的時候,須要在集羣中添加新的節點。

  • 負載均衡節點:也稱做 Client 節點,也稱做客戶端節點。當一個節點既不配置爲主節點,也不配置爲數據節點時,該節點只能處理路由請求,處理搜索,分發索引操做等,從本質上來講該客戶節點表現爲智能負載平衡器。獨立的客戶端節點在一個比較大的集羣中是很是有用的,他協調主節點和數據節點,客戶端節點加入集羣能夠獲得集羣的狀態,根據集羣的狀態能夠直接路由請求。

  • 預處理節點:也稱做 Ingest 節點,在索引數據以前能夠先對數據作預處理操做,全部節點其實默認都是支持 Ingest 操做的,也能夠專門將某個節點配置爲 Ingest 節點。

以上就是節點幾種類型,一個節點其實能夠對應不一樣的類型,如一個節點能夠同時成爲主節點和數據節點和預處理節點,但若是一個節點既不是主節點也不是數據節點,那麼它就是負載均衡節點。具體的類型能夠經過具體的配置文件來設置。

 

3、怎樣搭建 Elasticsearch 6.5.4集羣

1-一、準備環境

採用三臺CentOS6.5部署Elasticsearch集羣,部署Elasticsearch集羣就不得不提索引分片,如下是索引分片的簡單介紹。

系統  節點名稱 IP地址
      centos 6.5        els-node1       192.168.60.201     
      centos 6.5     els-node2      192.168.60.202
      centos 6.5     els-node3      192.168.60.203

 

 

 

 

ES集羣中索引可能由多個分片構成,而且每一個分片能夠擁有多個副本。經過將一個單獨的索引分爲多個分片,咱們能夠處理不能在一個單一的服務器上面運行的大型索引,簡單的說就是索引的大小過大,致使效率問題。不能運行的緣由多是內存也多是存儲。因爲每一個分片能夠有多個副本,經過將副本分配到多個服務器,能夠提升查詢的負載能力。

因爲 Elasticsearch 6.5.4要求linux 內核版本要高於3.5+,因此咱們先要將系統內核升級至3.5+,詳細請移步

CentOS6.5升級內核至4.4

1-二、Elasticsearch集羣搭建

1.安裝JDK

Elasticsearch是基於Java開發是一個Java程序,運行在Jvm中,因此第一步要安裝JDK

yum install -y java-1.8.0-openjdk-devel  # 安裝1.8或1.8以上版本

2.下載elasticsearch

https://www.elastic.co/cn/downloads/elasticsearch,是ELasticsearch的官方站點,若是須要下載最新的版本,進入官網下載便可。能夠下載到本地電腦而後再導入CentOS中,也能夠直接在CentOS中下載。

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.4.rpm

3.安裝elasticsearch

rpm -ivh elasticsearch-6.5.4.rpm

4.配置目錄

安裝完畢後會生成不少文件,包括配置文件日誌文件等等,下面幾個是最主要的配置文件路徑

/etc/elasticsearch/elasticsearch.yml                            # els的配置文件
/etc/elasticsearch/jvm.options                                  # JVM相關的配置,內存大小等等
/etc/elasticsearch/log4j2.properties                            # 日誌系統定義

/usr/share/elasticsearch                                        # elasticsearch 默認安裝目錄
/var/lib/elasticsearch                                          # 數據的默認存放位置

5.建立用於存放數據與日誌的目錄

數據文件會隨着系統的運行飛速增加,因此默認的日誌文件與數據文件的路徑不能知足咱們的需求,那麼手動建立日誌與數據文件路徑,可使用NFS、可使用Raid等等方便之後的管理與擴展

mkdir -p /opt/elasticsearch/data
mkdir -p /opt/elasticsearch/log
chown -R elasticsearch.elasticsearch /opt/elasticsearch/*

6.集羣配置

集羣配置中最重要的兩項是node.namenetwork.host,每一個節點都必須不一樣。其中node.name是節點名稱主要是在Elasticsearch本身的日誌加以區分每個節點信息。
discovery.zen.ping.unicast.hosts是集羣中的節點信息,可使用IP地址、可使用主機名(必須能夠解析)。

vim /etc/elasticsearch/elasticsearch.yml

cluster.name: my-els                               # 集羣名稱
node.name: els-node1                               # 節點名稱,僅僅是描述名稱,用於在日誌中區分

path.data: /opt/elasticsearch/data                 # 數據的默認存放路徑
path.logs: /opt/elasticsearch/log                  # 日誌的默認存放路徑

network.host: 192.168.60.201                        # 當前節點的IP地址
http.port: 9200                                    # 對外提供服務的端口,9300爲集羣服務的端口
#添加以下內容
#culster transport port
transport.tcp.port: 9300
transport.tcp.compress: true

discovery.zen.ping.unicast.hosts: ["192.168.60.201", "192.168.60.202","192.168.60.203"]       
# 集羣個節點IP地址,也可使用els、els.shuaiguoxia.com等名稱,須要各節點可以解析

discovery.zen.minimum_master_nodes: 2              # 爲了不腦裂,集羣節點數最少爲 半數+1

注意:不要在elasticsearch.yml中添加index開頭的配置項。如

#index.number_of_shards: 5
#index.number_of_replicas: 1

7.JVM配置 

因爲Elasticsearch是Java開發的,因此能夠經過/etc/elasticsearch/jvm.options配置文件來設定JVM的相關設定。若是沒有特殊需求按默認便可。
不過其中仍是有兩項最重要的-Xmx1g-Xms1gJVM的最大最小內存。若是過小會致使Elasticsearch剛剛啓動就馬上中止。太大會拖慢系統自己。

vim /etc/elasticsearch/jvm.options

-Xms1g                                                  # JVM最大、最小使用內存
-Xmx1g

8.使用ROOT帳戶執行如下命令

elasticsearch的相關配置已經完成,下面須要啓動elasticsearch集羣。可是因爲安全的考慮,elasticsearch不容許使用root用戶來啓動,因此須要建立一個新的用戶,併爲這個帳戶賦予相應的權限來啓動elasticsearch集羣。

建立ES運行用戶

# 建立用戶組
groupadd es
# 建立用戶並添加至用戶組
useradd es -g es 
# 更改用戶密碼(輸入 123123)
passwd es

修改ES目錄權限

chown -R es:es  /etc/share/elasticsearch/
chown -R es:es  /usr/share/elasticsearch/
chown -R es:es  /var/log/elasticsearch/      # 以上操做都是爲了賦予es用戶操做權限

啓動服務

# 需切換爲es用戶
su es
# 啓動服務(當前的路徑爲:/usr/share/elasticsearch/)
./bin/elasticsearch

後臺運行ES

能夠加入-p 命令 讓es在後臺運行, -p 參數 記錄進程ID爲一個文件

# 設置後臺啓動
./bin/elasticsearch -p /tmp/elasticsearch-pid -d

結束進程

# 查看運行的pid
cat /tmp/elasticsearch-pid && echo
# 結束進程
kill -SIGTERM {pid}

驗證一下服務是否正常

curl -i "http://192.168.60.200:9200"

 

2、安裝head插件

Elasticsearch Head Plugin:head插件是一個ES集羣的web前端工具,它提供可視化的頁面方便用戶查看節點信息,對ES進行各類操做,如查詢、刪除、瀏覽索引等。

一、安裝相關依賴包

(1)安裝head

因爲head插件本質上仍是一個nodejs的工程,所以須要安裝node,使用npm來安裝依賴的包。(npm能夠理解爲maven)

wget https://nodejs.org/dist/v9.3.0/node-v9.3.0-linux-x64.tar.xz  # 下載nodejs最新的bin包
xz -d node-v9.3.0-linux-x64.tar.xz  # 解壓包
tar -xf node-v9.3.0-linux-x64.tar  # 解壓包
ln -s ~/node-v9.3.0-linux-x64/bin/node /usr/bin/node # 部署bin文件,先肯定nodejs的bin路徑
ln -s ~/node-v9.3.0-linux-x64/bin/npm /usr/bin/npm

測試:

node -v npm

npm加速 全局安裝cnpm 指定來源淘寶鏡像

npm install -g cnpm --registry=https://registry.npm.taobao.org

(2)安裝grunt(安裝完elasticsearch-head後安裝)

grunt是一個很方便的構建工具,能夠進行打包壓縮、測試、執行等等的工做,5.0裏的head插件就是經過grunt啓動的。所以須要安裝一下grunt:

cd  /usr/local/elasticsearch-head
npm install -g grunt-cli  //執行後會生成node_modules文件夾
npm install

注:

(1)5.0以上,elasticsearch-head 不能放在elasticsearch的 pluginsmodules 目錄下,不然elasticsearch啓動會報錯。

(2)這裏若是grunt沒有安裝成功也無所謂,能夠經過其餘方式啓動elasticsearch-head插件(npm run start)。

 

二、安裝elasticsearch-head

另外:5.0之前的版本能夠經過elasticseach自帶的plugin命令 安裝elasticsearch-head,5.0之後不支持了。只能夠去下載elasticsearch-head對應的源碼包去安裝。

cd /usr/local/
git clone git://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
npm install

配置:

vi _site/app.js

# 修改 this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://localhost:9200";   # 在文件的4354行附近
# 這裏的 localhost 是指進入elasticsearch-head頁面時默認訪問的ES集羣地址,把她修改成其中一臺ES節點的地址便可
this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://192.168.60.200:9200";

還要修改Head主目錄下的Gruntfile.js,因爲默認文件中是沒有hostname屬性的,咱們須要手動添加:

 

爲何須要修改配置文件: head插件鏈接elasticsearch須要注意的點: 由於head插件是一個獨立進程,啓動後是一個獨立的服務器外加端口,好比個人虛擬機ip地址:http://192.168.0.111:9100/ 而elasticsearch啓動後也是一個獨立的進程,ip地址:http://192.168.0.111:9200/ 這樣兩個獨立進程,雖然服務器ip地址相同,可是端口不一樣,此時會發生跨域的狀況。。 因而官方給出這樣一段話,咱們在對elasticsearch啓動的時候追加兩個配置文件屬性便可防止跨域。

即:在elasticsearch.yml文件的最後,添加以下內容:

http.cors.enabled: true http.cors.allow-origin: "*"

配置完畢。

三、啓動elasticsearch集羣

在三臺機器上,分別啓動elasticsearch便可。

./bin/elasticsearch

四、啓動elasticsearch-head

cd /usr/local/elasticsearch-head //先跳轉到head目錄下 grunt server //若想在後臺運行,結尾追加「&」,也可使用 npm run start啓動

五、訪問elasticsearch-head界面

http://192.168.60.200:9100

能夠看到,三臺機器組成了es集羣。集羣的狀態爲綠色,健康狀態。帶星標的節點els-node1爲主節點(選舉)。還能夠作一些增長/刪除索引,查詢等操做。

下面還有ik分詞器的安裝,未完待續。。。

 

參考文檔:

https://mp.weixin.qq.com/s/eyfApIiDeg3qv-BD9hBNvw

https://my.oschina.net/u/2403594/blog/2992908

https://my.oschina.net/linch/blog/1816712

相關文章
相關標籤/搜索