詳盡的 Elasticsearch7.X 安裝及集羣搭建教程

Search

爲了更好的閱讀體驗,歡迎訪問 原文閱讀連接html

簡介

首先引用 Elasticsearch (下文簡稱 ES)官網的一段描述:java

Elasticsearch 是一個分佈式、RESTful 風格的搜索和數據分析引擎,可以解決不斷涌現出的各類用例。 做爲 Elastic Stack 的核心,它集中存儲您的數據,幫助您發現意料之中以及意料以外的狀況。node

本文主要介紹 Elasticsearch 集羣的搭建。經過在一臺服務器上建立 3 個 ES 實例來建立一個建議的 ES 集羣。linux

Elasticsearch/ES

官方的Elasticsearch Reference 提供了不一樣版本的文檔鏈接,真是贊!git

若是英文的不想看,還提供了中文版的 Elasticsearch 2.x: 權威指南,版本不是最新的,可是瞭解基本概念也是有幫助的。github

Elasticsearch 7.x 包裏自包含了 OpenJDK 的包。若是你想要使用你本身配置好的 Java 版本,須要設置 JAVA_HOME 環境變量 —— 參考shell

官方文檔 Set up Elasticsearch 有各個 OS 的安裝指導,頁面 Installing Elasticsearch 中提供了多種安裝包對應的指導連接!bootstrap

本文選擇綠色安裝包的的方式(tar.gz)安裝。vim

因爲實驗機器有限,能夠在同一臺機器上模擬出 3 個節點,安裝 ES 集羣。瀏覽器

安裝 ES

準備工做

{% note warning %}

不能使用 root 用戶啓動 es,不然會報錯:

Caused by: java.lang.RuntimeException: can not run elasticsearch as root

{% endnote %}

若是須要新建用戶的話能夠運行 sudo adduser es,修改 es 用戶的密碼:sudo passwd es

下載 ES 安裝包

安裝包下載地址:

下面的步驟參考 Set up Elasticsearch » Installing Elasticsearch » Install Elasticsearch from archive on Linux or MacOS,選擇的安裝包是 elasticsearch-7.3.0 版本。

# 下載安裝包
wget https://mirrors.huaweicloud.com/elasticsearch/7.3.0/elasticsearch-7.3.0-linux-x86_64.tar.gz
wget https://mirrors.huaweicloud.com/elasticsearch/7.3.0/elasticsearch-7.3.0-linux-x86_64.tar.gz.sha512
# 驗證安裝包的完整性,若是沒問題,會輸出 OK
shasum -a 512 -c elasticsearch-7.3.0-linux-x86_64.tar.gz.sha512
tar -xzf elasticsearch-7.3.0-linux-x86_64.tar.gz
# 將目錄複製三份,做爲三個節點,後面配置 ES 集羣時,對應了三個 ES 實例
cp -R elasticsearch-7.3.0 es-7.3.0-node-1
cp -R elasticsearch-7.3.0 es-7.3.0-node-2
mv elasticsearch-7.3.0 es-7.3.0-node-3
# 由於以 root 用戶啓動不了 ES
chown -R es es-7.3.0*

{% note info %}
若是是 Mac 平臺,則下載包 elasticsearch-{version}-darwin-x86_64.tar.gz

MacOS Catalina 在你第一次運行 ES 時,會彈出對話框阻止運行,你須要到設置-》安全隱私中容許才行。爲了阻止這種告警,能夠運行以下的命令:xattr -d -r com.apple.quarantine <$ES_HOME or archive-or-directory>

{% endnote %}

$ES_HOME 是指 ES 的安裝包 tar 包解壓後的文件夾目錄。

解壓後的目錄組成

.
├── bin # 二進制腳本存放目錄,包括 elasticsearch 來指定運行一個 node,包括 elasticsearch-plugin 來安裝 plugins
├── config # 包含了 elasticsearch.yml 配置文件
├── data # 節點上分配的每一個 index/分片 的數據文件
├── lib
├── LICENSE.txt
├── logs
├── modules
├── NOTICE.txt
├── plugins # 插鍵文件存放的位置
└── README.textile

運行 Elasticsearch

咱們先運行一個節點,建立 ES 單機版實例:

./bin/elasticsearch

若是要將 ES 做爲守護程序運行,請在命令行中指定 -d,指定 -p 參數,將進程 ID 記錄到 pid 文件:

./bin/elasticsearch -d -p pid

日誌在 $ES_HOME/logs 目錄中。

若是要中止 ES,運行以下的命令:

pkill -F pid

檢查一下運行狀態

curl -X GET "localhost:9200/?pretty"

或者在瀏覽器中訪問 localhost:9200 均可以,會返回:

{
    "name": "node-1",
    "cluster_name": "appsearch-7.3.2",
    "cluster_uuid": "GlzI_v__QJ2s9ewAgomOqg",
    "version": {
        "number": "7.3.0",
        "build_flavor": "default",
        "build_type": "tar",
        "build_hash": "de777fa",
        "build_date": "2019-07-24T18:30:11.767338Z",
        "build_snapshot": false,
        "lucene_version": "8.1.0",
        "minimum_wire_compatibility_version": "6.8.0",
        "minimum_index_compatibility_version": "6.0.0-beta1"
    },
    "tagline": "You Know, for Search"
}

若是你是在遠端服務器上部署的 ES,那麼,此時在你本地的工做機上還沒法調通 <IP>:9200,須要對 ES 進行相關配置才能訪問,下文會介紹。

ES 配置相關

官網關於配置的內容主要有兩處:

Elasticsearch 主要有三個配置文件:

  • elasticsearch.yml ES 的配置,more
  • jvm.options ES JVM 配置,more
  • log4j2.properties ES 日誌配置,more

配置文件主要位於 $ES_HOME/config 目錄下,也能夠經過 ES_PATH_CONF 環境變量來修改

YAML 的配置形式參考:

path:
    data: /var/lib/elasticsearch
    logs: /var/log/elasticsearch

設置也能夠按以下方式展平:

path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch

JVM 配置

JVM 參數設置能夠經過 jvm.options 文件(推薦方式)或者 ES_JAVA_OPTS 環境變量來修改。

jvm.options 位於

  • $ES_HOME/config/jvm.options 當經過 tar or zip 包安裝
  • /etc/elasticsearch/jvm.options 當經過 Debian or RPM packages

官網也介紹瞭如何設置堆大小

默認狀況,ES 告訴 JVM 使用一個最小和最大都爲 1GB 的堆。可是到了生產環境,這個配置就比較重要了,確保 ES 有足夠堆空間可用。

ES 使用 Xms(minimum heap size)Xmx(maxmimum heap size) 設置堆大小。你應該將這兩個值設爲一樣的大小。

XmsXmx 不能大於你物理機內存的 50%。

設置的示例:

-Xms2g 
-Xmx2g

elasticsearch.yml 配置

ES 默認會加載位於 $ES_HOME/config/elasticsearch.yml 的配置文件。

備註:任何可以經過配置文件設置的內容,均可以經過命令行使用 -E 的語法進行指定,例如:

./bin/elasticsearch -d -Ecluster.name=my_cluster -Enode.name=node_1

cluster.name

cluster.name 設置集羣名稱。一個節點只能加入一個集羣中,默認的集羣名稱是 elasticsearch

cluster.name: search-7.3.2

{% note info %}
確保節點的集羣名稱要設置正確,這樣才能加入到同一個集羣中。上面示例就自定義了集羣名稱爲 appsearch-7.3.2。
{% endnote %}


node.name

node.name:能夠配置每一個節點的名稱。用來提供可讀性高的 ES 實例名稱,它默認名稱是機器的 hostname,能夠自定義:

node.name: node-1

同一集羣中的節點名稱不能相同


network.host

network.host:設置訪問的地址。默認僅綁定在迴環地址 127.0.0.1[::1]。若是須要從其餘服務器上訪問以及多態機器搭建集羣,咱們須要設定 ES 運行綁定的 Host,節點須要綁定非迴環的地址。建議設置爲主機的公網 IP 或 0.0.0.0

network.host: 0.0.0.0

更多的網絡設置能夠閱讀 Network Settings


http.port

http.port 默認端口是 9200 :

http.port: 9200

{% note warning %}
注意:這是指 http 端口,若是採用 REST API 對接 ES,那麼就是採用的 http 協議
{% endnote%}


transport.port

REST 客戶端經過 HTTP 將請求發送到您的 Elasticsearch 集羣,可是接收到客戶端請求的節點不能老是單獨處理它,一般必須將其傳遞給其餘節點以進行進一步處理。它使用傳輸網絡層(transport networking layer)執行此操做。傳輸層用於集羣中節點之間的全部內部通訊,與遠程集羣節點的全部通訊,以及 Elasticsearch Java API 中的 TransportClient。

transport.port 綁定端口範圍。默認爲 9300-9400

transport.port: 9300

由於要在一臺機器上建立是三個 ES 實例,這裏明確指定每一個實例的端口。


discovery.seed_hosts

discovery.seed_hosts:發現設置。有兩種重要的發現和集羣造成配置,以便集羣中的節點可以彼此發現而且選擇一個主節點。官網/Important discovery and cluster formation settings

discovery.seed_hosts 是組件集羣時比較重要的配置,用於啓動當前節點時,發現其餘節點的初始列表。

開箱即用,無需任何網絡配置, ES 將綁定到可用的環回地址,並將掃描本地端口 9300 - 9305,以嘗試鏈接到同一服務器上運行的其餘節點。 這無需任何配置便可提供自動羣集的體驗。

若是要與其餘主機上的節點組成集羣,則必須設置 discovery.seed_hosts,用來提供集羣中的其餘主機列表(它們是符合主機資格要求的master-eligible而且可能處於活動狀態的且可達的,以便尋址發現過程)。此設置應該是羣集中全部符合主機資格的節點的地址的列表。 每一個地址能夠是 IP 地址,也能夠是經過 DNS 解析爲一個或多個 IP 地址的主機名(hostname)。

當一個已經加入過集羣的節點重啓時,若是他沒法與以前集羣中的節點通訊,極可能就會報這個錯誤 master not discovered or elected yet, an election requires at least 2 nodes with ids from。所以,我在一臺服務器上模擬三個 ES 實例時,這個配置我明確指定了端口號。

配置集羣的主機地址,配置以後集羣的主機之間能夠自動發現(能夠帶上端口,例如 127.0.0.1:9300):

discovery.seed_hosts: ["127.0.0.1:9300","127.0.0.1:9301"]

the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured

必須至少配置 [discovery.seed_hosts,discovery.seed_providers,cluster.initial_master_nodes] 中的一個。


cluster.initial_master_nodes

cluster.initial_master_nodes: 初始的候選 master 節點列表。初始主節點應經過其 node.name 標識,默認爲其主機名。確保 cluster.initial_master_nodes 中的值與 node.name 徹底匹配。

首次啓動全新的 ES 集羣時,會出現一個集羣引導/集羣選舉/cluster bootstrapping步驟,該步驟肯定了在第一次選舉中的符合主節點資格的節點集合。在開發模式下,若是沒有進行發現設置,此步驟由節點自己自動執行。因爲這種自動引導從本質上講是不安全的,所以當您在生產模式下第一次啓動全新的羣集時,你必須顯式列出符合資格的主節點。也就是說,須要使用 cluster.initial_master_nodes 設置來設置該主節點列表。從新啓動集羣或將新節點添加到現有集羣時,你不該使用此設置

在新版 7.x 的 ES 中,對 ES 的集羣發現系統作了調整,再也不有 discovery.zen.minimum_master_nodes 這個控制集羣腦裂的配置,轉而由集羣自主控制,而且新版在啓動一個新的集羣的時候須要有 cluster.initial_master_nodes 初始化集羣主節點列表。若是一個集羣一旦造成,你不應再設置該配置項,應該移除它。該配置項僅僅是集羣第一次建立時設置的!集羣造成以後,這個配置也會被忽略的!

{% note warning %}
cluster.initial_master_nodes 該配置項並非須要每一個節點設置保持一致,設置需謹慎,若是其中的主節點關閉了,可能會致使其餘主節點也會關閉。由於一旦節點初始啓動時設置了這個參數,它下次啓動時仍是會嘗試和當初指定的主節點連接,當連接失敗時,本身也會關閉!

所以,爲了保證可用性,預備作主節點的節點不用每一個上面都配置該配置項!保證有的主節點上就不設置該配置項,這樣當有主節點故障時,還有可用的主節點不會必定要去尋找初始節點中的主節點!
{% endnote%}

關於 cluster.initial_master_nodes 能夠查看以下資料:

其餘

集羣的主要配置項上面已經介紹的差很少了,同時也給出了一些文檔拓展閱讀。實際的生產環境中,配置稍微會複雜點,下面補充一些配置項的介紹。須要說明的是,下面的一些配置即便不配置,ES 的集羣也能夠成功啓動的。

建立集羣

實驗機器有限,咱們在同一臺機器上建立三個 ES 實例來建立集羣,分別明確指定了這些實例的 http.porttransport.portdiscovery.seed_hosts明確指定實例的端口對測試集羣的高可用性很關鍵。

若是後期有新節點加入,新節點的 discovery.seed_hosts 不必包含全部的節點,只要它裏面包含集羣中已有的節點信息,新節點就能發現整個集羣了。

集羣配置預覽

分別進入es-7.3.0-node-1es-7.3.0-node-2es-7.3.0-node-3 的文件夾,config/elasticsearch.yml 設置以下:

# es-7.3.0-node-1
cluster.name: search-7.3.2
node.name: node-1
node.master: true
node.data: false
node.ingest: false
network.host: 0.0.0.0
http.port: 9200
transport.port: 9300
discovery.seed_hosts: ["127.0.0.1:9300","127.0.0.1:9301","127.0.0.1:9302"]
cluster.initial_master_nodes: ["node-1"]

# es-7.3.0-node-2
cluster.name: search-7.3.2
node.name: node-2
node.master: true
node.data: true
node.ingest: false
network.host: 0.0.0.0
http.port: 9201
transport.port: 9301
discovery.seed_hosts: ["127.0.0.1:9300","127.0.0.1:9301","127.0.0.1:9302"]

# es-7.3.0-node-3
cluster.name: search-7.3.2
node.name: node-3
node.master: true
node.data: true
node.ingest: false
network.host: 0.0.0.0
http.port: 9202
transport.port: 9302
discovery.seed_hosts: ["127.0.0.1:9300","127.0.0.1:9301","127.0.0.1:9302"]

node-1 節點僅僅是一個 master 節點,它不是一個數據節點。

通過上面的配置,能夠經過命令 egrep -v "^#|^$" config/elasticsearch.yml 檢查配置項。

先啓動 node-1 節點,由於它設置了初始主節點的列表。這時候就可使用 http://<host IP>:9200/ 看到結果了。而後逐一啓動 node-2 和 node-3。經過訪問 http://127.0.0.1:9200/_cat/nodes 查看集羣是否 OK:

192.168.3.112 25 87 13 4.29   dm - node-3
192.168.3.112 26 87 16 4.29   dm - node-2
192.168.3.112 35 87 16 4.29   m  * node-1

http://127.0.0.1:9200/_nodes 將會顯示節點更多的詳情信息

插鍵顯示結果:

集羣

五角星表示該節點是主節點,圓圈表示該節點是數據節點

有沒有發現,我並無給 node-2node-3 明確指定端口,爲何在一臺機器上也成功啓動了這兩個節點?

由於 Elasticsearch 會取用 9200~9299 這個範圍內的端口,若是 9200 被佔用,就選擇 9201,依次類推。

補充:其實,還有一個簡單的方法模擬建立集羣(該方法我未測試,僅供參考)。

咱們首先將上面運行的三個節點中止掉,而後進入 es-7.3.0-node-1 文件夾下:

mkdir -p data/data{1,2,3}
./bin/elasticsearch -E node.name=node-1 -E cluster.name=appsearch-7.3.2 -E path.data=data/data1 -E path.logs=logs/logs1 -d -p pid1
./bin/elasticsearch -E node.name=node-2 -E cluster.name=appsearch-7.3.2 -E path.data=data/data2 -E path.logs=logs/logs2 -E http.port=9201 -d -p pid2
./bin/elasticsearch -E node.name=node-3 -E cluster.name=appsearch-7.3.2 -E path.data=data/data3 -E path.logs=logs/logs3 -E http.port=9202 -d -p pid3

安裝插鍵

./bin/elasticsearch-plugin install analysis-icu

若是插鍵安裝慢,能夠先下載下來,再安裝:

wget https://artifacts.elastic.co/downloads/elasticsearch-plugins/analysis-icu/analysis-icu-7.3.0.zip
./bin/elasticsearch-plugin install file://file path Of analysis-icu-7.1.0.zip

ES-FAQ

Q1:[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

echo "vm.max_map_count=262144" > /etc/sysctl.conf
sysctl -p

Q2:max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]

sudo vim /etc/security/limits.conf
# 加入如下內容
* soft nofile 300000
* hard nofile 300000
* soft nproc 102400
* soft memlock unlimited
* hard memlock unlimited

Q3:master_not_discovered_exception

主節點指定的名字要保證存在,別指定了不存在的節點名。

總結

本文是經過 tar 包方式安裝的,安裝目錄相對集中、配置方便。用 RPM 包安裝的話,能夠直接用 systemctl 的命令查看 ES 狀態、對其重啓等。

參考

最後

歡迎關注

相關文章
相關標籤/搜索