手把手帶你搭建 Elasticsearch 集羣

手把手帶你搭建 Elasticsearch 集羣

投稿做者:喜馬拉雅以南
編輯整理:JackTian
微信公衆號:傑哥的IT之旅(ID:Jake_Internet)node

1、爲何要搭建 Elasticsearch 的集羣?
Elasticsearch 是一個開源的高擴展的分佈式全文檢索引擎。linux

經過簡單的RESTful API來隱藏Lucene的複雜性,從而讓全文搜索變得簡單。bootstrap

ES主要解決問題:
檢索相關數據vim

返回統計結果bash

速度要快服務器

1. 高可用性
經過設計減小系統不能提供服務的時間,假設某個時刻服務節點宕機則該節點爲臨時不可用,若是系統能一直提供服務,則它的可用性爲100%,所以爲了減小 Elasticsearch 服務不可用時間,集羣的做用就體現出來了。微信

固然若是要保證在宕機期間,ES 的數據保證不丟失,則須要對其數據進行備份,所以有了分片和副本的概念。架構

分片:將數據切分紅多個部分,在ES中全部數據都存儲於索引(index)之上,但實際索引只是維護了與多個分片之間的聯繫,數據則是被路由到多個分片。例如一個索引有5個分片,則該索引將會有0,1,2,3,4,這五個分片,其指定每一個文檔數據存儲在哪一個分片是根據路由運算公式has(_routing)%number_of_primary_shards指定,使數據均勻分佈在集羣當中。
若是存在某個或某幾個分片存儲數據量特別大,可使用索引分區既index.routring_partition_size, 但使用後限制有沒法建立join_feild 關係映射、_routing 將成爲寫入數據必要傳入參數

副本:副本是主分片的複製分片,能夠靈活調整,提升了整個集羣的容錯性,且須要注意的是副本分片不能與主分片在同一個節點。通常來講,Elasticsearch 會盡可能把一個索引的不一樣分片存儲在不一樣的主機上,分片的副本也儘量存在不一樣的主機上,這樣能夠提升容錯率,從而提升高可用性。
null

**2. 健康狀態**
Elasticsearch集羣存在三種健康狀態,單節點 Elasticsearch 也能夠算是一個集羣。

green(綠色):表明全部索引的主分片和副本均已分配且可用,集羣是 100% 可用;

yellow(黃色):主分片已分配且所有主分片可用,但全部的副本不所有可用,多是缺失,也有多是某個索引的副本未被分配,能夠經過move cancel allocate命令所屬的 API 進行分配或移動分片到指定節點,使用這裏要注意主分片和其副本毫不能在同一節點。此時系統容錯性和集羣高可用被弱化;

red(紅色):全部的主分片不所有可用,這表明頗有可能存在丟失數據的風險,若是隻有一個單節點 Elasticsearch 那麼屬於一種 yellow 狀態,由於沒有副本;

**3. 存儲空間**
多個節點的 ES 集羣,那麼相對單節點來講擁有更多的存儲空間,能夠設置elasticsearch.yml設置data和log的掛載目錄。

**2、ES 集羣及節點類型**
集羣由多個節點構成,每一臺主機則稱爲一臺節點,在僞集羣中每個 ES 實例則爲一個節點。

![](https://s4.51cto.com/images/blog/202101/24/ac10f7ec04a30dea2844e0a76c043582.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

上述圖中則爲一個集羣,其中 Node-1 是主節點,主節點有權限控制整個集羣,有權限控制整個集羣。每一個節點都有三個分片,其中P0 P1 P2表明 Primary 爲主分片,R開頭的則表明爲每一個主分片對應的副本分片,一共是 3 個主分片,每一個主分片有兩個對應的副本分片。

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

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

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

預處理節點:也稱做 Ingest 節點,在索引數據以前能夠先對數據作預處理操做,全部節點其實默認都是支持 Ingest 操做的,也能夠專門將某個節點配置爲 Ingest 節點。以上就是節點幾種類型,一個節點其實能夠對應不一樣的類型,如一個節點能夠同時成爲主節點和數據節點和預處理節點,但若是一個節點既不是主節點也不是數據節點,那麼它就是負載均衡節點。具體的類型能夠經過具體的配置文件來設置;

**Elasticsearch 處理查詢請求時節點工做流程:**
請求被交給主節點;

主節點接收請求,將請求廣播到該索引在數據節點上的每一個分片(shard);

每一個分片執行搜索請求,並將結果返回;

分片的Result在主節點上進行合併,排序後返回給用戶;

**3、搭建 Elasticsearch7.X 僞集羣**
**一、下載 ES**

這裏咱們把 ES 安裝在服務器的opt目錄下
# 使用華爲鏡像超快!! 並重命名 elasticsearch7.4-x86.tar.gz(x86是系統指令架構)
$ wget -O elasticsearch7.4-x86.tar.gz https://mirrors.huaweicloud.com/elasticsearch/7.4.0/elasticsearch-7.4.0-linux-x86_64.tar.gz
# 解壓
$ tar -zxvf elasticsearch7.4-x86.tar.gz
二、修改jvm.options和elasticsearch.yml配置 ES
# 進入es配置目錄
$ cd /opt/elasticsearch7.4-x86/config

# 修改jvm相關參數,調整jvm堆內存大小
$ vim jvm.options

# 對es進行配置
$ vim elasticsearch.yml
jvm.options 配置

## 修改 IMPORTANT: JVM heap size ,內存小我就設置成這樣了
-Xms512m
-Xmx512m

配置 elasticsearch.yml
# 不要在該文件中設置索引相關配置
cluster.name: waybill-center # 設置集羣名比較重要!
# ------------------------------------ Node ------------------------------------
node.name: es-master # 配置節點名
node.master: true # 是否有資格被選舉爲master,ES默認集羣中第一臺機器爲主節點
node.data: false # 是否存儲索引數據,默認 true,大集羣中推薦一個角色一個類節點,不要身兼多職
node.ingest: false #默認狀況下全部節點都可以作ingest節點
# ----------------------------------- Paths ------------------------------------
#path.conf: /opt/elasticsearch7.4-x86/config # 設置配置文件存儲路徑,默認是es根目錄下的config目錄
path.data: /data/es-master/data # 設置索引數據存儲路徑,默認是es根目錄下的data目錄
path.logs: /data/es-master/log # 設置日誌文件存儲路徑,默認是es根目錄下的log目錄
# ----------------------------------- Memory -----------------------------------
#bootstrap.memory_lock: true # 鎖住內存不進行swapping,避免系統內存不夠時壓制JVM虛擬內存
# ---------------------------------- Network -----------------------------------
#network.host: 192.168.0.1 # 同時設置bind_host 和 publish_host
network.bind_host: 0.0.0.0 # 設置節點綁定ip,可用於http訪問
network.publish_host: x.x.x.x # 設置其餘節點與該節點交互ip,可使內網ip單必須是真實ip
# Set a custom port for HTTP:
http.port: 9200 # 設置對外服務http端口
transport.tcp.port: 9300 # 設置節點之間交互的tcp端口
transport.tcp.compress: true # 設置是否壓縮tcp傳輸時的數據,默認爲false
# --------------------------------- Discovery ----------------------------------
#
# Pass an initial list of hosts to perform discovery when this node is started:
# The default list of hosts is ["127.0.0.1", "[::1]"]
#
discovery.seed_hosts: ["x.x.x.x:9300", "x.x.x.x:9301","x.x.x.x:9302"]
# 集羣各節點IP地址,也可使用els、els.shuaiguoxia.com等名稱,須要各節點可以解析
#
# Bootstrap the cluster using an initial set of master-eligible nodes:
#
cluster.initial_master_nodes: ["es-master"]
discovery.zen.minimum_master_nodes: 2  # 爲了不腦裂,集羣節點數最少爲 半數+1
# For more information, consult the discovery and cluster formation module documentation.
# ---------------------------------- Gateway -----------------------------------
gateway.recover_after_nodes: 3 # 設置集羣中N個節點啓動時進行數據恢復,默認爲1
**三、配置 ES 使用本身的所帶的 jdk (推薦)**

修改bin目錄下的Elasticsearch腳本文件
source "`dirname "$0"`"/elasticsearch-env # 這裏能夠看出先加載的 elasticsearch-env 腳本設置環境
# use es internal jdk
export JAVA_HOME=$ES_HOME/jdk/
export PATH=$JAVA_HOME/bin:$PATH
查看elasticsearch-env
#!/bin/bash

set -e -o pipefail

CDPATH=""

SCRIPT="$0"

# SCRIPT might be an arbitrarily deep series of symbolic links; loop until we
# have the concrete path
while [ -h "$SCRIPT" ] ; do
  ls=`ls -ld "$SCRIPT"`
  # Drop everything prior to ->
  link=`expr "$ls" : '.*-> \(.*\)$'`
  if expr "$link" : '/.*' > /dev/null; then
    SCRIPT="$link"
  else
    SCRIPT=`dirname "$SCRIPT"`/"$link"
  fi
done

# determine Elasticsearch home; to do this, we strip from the path until we find
# bin, and then strip bin (there is an assumption here that there is no nested
# directory under bin also named bin)
ES_HOME=`dirname "$SCRIPT"` # 這裏能夠看出已經設置了ES_HOME

# now make ES_HOME absolute
ES_HOME=`cd "$ES_HOME"; pwd`

while [ "`basename "$ES_HOME"`" != "bin" ]; do
  ES_HOME=`dirname "$ES_HOME"`
done
ES_HOME=`dirname "$ES_HOME"`
**四、複製當前 es 構建其餘數據節點**

複製當前 ES 目錄
# 複製兩份數據節點的目錄
cp -r /opt/elasticsearch7.4-x86 /opt/es-data-node1 
cp -r /opt/elasticsearch7.4-x86 /opt/es-data-node2
修改兩個數據節點的配置文件,先修改第一數據節點
# vim /opt/es-data-node1/config/elasticsearch.yml
node.name: es-node1 # 配置節點名
node.ingest: false #默認狀況下全部節點都可以作ingest節點
node.master: false # 是否有資格被選舉爲master,ES默認集羣中第一臺機器爲主節點
node.data: true # 是否存儲索引數據,默認 true
#path.conf: /opt/es-data-node1/config # 設置配置文件存儲路徑,默認是es根目錄下的config目錄
path.data: /data/es-node1/data # 設置索引數據存儲路徑,默認是es根目錄下的data目錄
path.logs: /data/es-node1/log # 設置日誌文件存儲路徑,默認是es根目錄下的log目錄
http.port: 9201 # 設置對外服務http端口
transport.tcp.port: 9301 # 設置節點之間交互的tcp端口
修改兩個數據節點的配置文件,再修改第二個數據節點
# vim /opt/es-data-node2/config/elasticsearch.yml
node.name: es-node2 # 配置節點名
node.master: false # 是否有資格被選舉爲master,ES默認集羣中第一臺機器爲主節點
node.data: true # 是否存儲索引數據,默認 true
#path.conf: /opt/es-data-node2/config # 設置配置文件存儲路徑,默認是es根目錄下的config目錄
path.data: /data/es-node2/data # 設置索引數據存儲路徑,默認是es根目錄下的data目錄
path.logs: /data/es-node2/log # 設置日誌文件存儲路徑,默認是es根目錄下的log目錄
http.port: 9202 # 設置對外服務http端口
transport.tcp.port: 9302 # 設置節點之間交互的tcp端口
**五、建立 ES 存儲數據和 log 目錄**
# 根據以前每一個節點的配置文件內配置path進行建立或修改
mkdir -p /data/es-master/data
mkdir -p /data/es-node1/data
mkdir -p /data/es-node2/data
mkdir -p /data/es-master/log
mkdir -p /data/es-node1/log
mkdir -p /data/es-node2/log
**六、由於 ES 不能用 root 用戶啓動,因此要新建用戶**
groupadd es # 新建用戶組es
useradd es -g es# 新建用戶並添加到es用戶組
passwd es # 也能夠更改用戶密碼(輸入 123123)
**七、受權 ES 用戶對目錄的操做權限**

chown -R es:es /data/es-master/
chown -R es:es /data/es-node1/
chown -R es:es /data/es-node2/app

**八、啓動 ES 集羣**
# 需切換爲es用戶
su es
# 啓動服務
./opt/elasticsearch7.4-x86/bin/elasticsearch -d
./opt/es-data-node1/bin/elasticsearch -d
./opt/es-data-node2/bin/elasticsearch -d
後臺運行 ES 能夠加入 -p 命令,讓 ES 在後臺運行, -p 參數記錄進程 ID 爲一個文件 # 設置後臺啓動
./opt/elasticsearch7.4-x86/bin/elasticsearch  -p /tmp/elasticsearch-pid -d
結束進程
# 查看運行的pid
cat /tmp/elasticsearch-pid && echo
# 結束進程
kill -SIGTERM {pid}
**4、啓動異常(系統資源限制層面)**
**一、超過當前最大文件描述符**

若是出現max file descriptions,修改limits.conf

vim /etc/security/limits.conf # 修改限制文件負載均衡

向文件內添加文件數
  • soft nofile 65536
  • hard nofile 65536
**二、超過當前最大線程數**

若是出現max number of threads,修改limits.d/20-nproc.conf

vim /etc/security/limits.d/20-nproc.conf

修改參數
*  soft    nproc   4096
*  hard   nproc   4096
# 或者不限制也行
# root       soft    nproc     unlimited
三、超過當前最大虛擬內存

若是出現virtual memory areas,修改sysctl.conf

vim /etc/sysctl.conf
修改參數
vm.max_map_count=262144
# 也可以使用下面命令臨時修改內存限制
sysctl -w vm.max_map_count=262144
**5、在主節點機器上進行驗證**
當咱們配置好並啓動集羣后,由於主節點打開了http.port而且主節點主要用於整個集羣的管理,因此建議在配置kibana時只配置主節點就好。

不過在咱們驗證時能夠經過如下命令進行驗證集羣的搭建情況

curl  -X GET http://localhost:9200/_cat/nodes # get請求查看集羣健康狀態
# 將會響應以下,帶星號的就是指向的主節點
127.0.0.1 69 93 1 0.06 0.07 0.06 dilm * es-master
127.0.0.1 69 93 1 0.06 0.07 0.06 dil  - es-node1
127.0.0.1 56 93 1 0.06 0.07 0.06 dil  - es-node2
相關文章
相關標籤/搜索