投稿做者:喜馬拉雅以南
編輯整理: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 # 修改限制文件負載均衡
向文件內添加文件數
**二、超過當前最大線程數** 若是出現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