詳盡的 Elasticsearch7.X 安裝及集群搭建教程
為了更好的閱讀體驗,歡迎訪問 原文閱讀鏈接
簡介
首先引用 Elasticsearch (下文簡稱 ES)官網的一段描述:
Elasticsearch 是一個分散式、RESTful 風格的搜索和數據分析引擎,能夠解決不斷湧現出的各種用例。 作為 Elastic Stack 的核心,它集中存儲您的數據,幫助您發現意料之中以及意料之外的情況。
本文主要介紹 Elasticsearch 集群的搭建。通過在一台伺服器上創建 3 個 ES 實例來創建一個建議的 ES 集群。
Elasticsearch/ES
官方的Elasticsearch Reference 提供了不同版本的文檔連接,真是贊!
如果英文的不想看,還提供了中文版的 Elasticsearch 2.x: 權威指南,版本不是最新的,但是了解基本概念也是有幫助的。
Elasticsearch 7.x 包里自包含了 OpenJDK 的包。如果你想要使用你自己配置好的 Java 版本,需要設置 JAVA_HOME
環境變數 —— 參考
官方文檔 Set up Elasticsearch
有各個 OS 的安裝指導,頁面 Installing Elasticsearch 中提供了多種安裝包對應的指導鏈接!
本文選擇綠色安裝包的的方式(tar.gz
)安裝。
由於實驗機器有限,可以在同一台機器上模擬出 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 安裝包
安裝包下載地址:
- 官方-Past Releases 官網的下載速度龜速
- 華為鏡像站 下載速度不錯,推薦
下面的步驟參考 Set up Elasticsearch » Installing Elasticsearch » Install Elasticsearch from archive on Linux or MacOS,選擇的安裝包是 elasticsearch-7.3.0 版本。
# 下載安裝包
wget //mirrors.huaweicloud.com/elasticsearch/7.3.0/elasticsearch-7.3.0-linux-x86_64.tar.gz
wget //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 主要有三個配置文件:
配置文件主要位於
$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
orzip
包安裝/etc/elasticsearch/jvm.options
當通過 Debian or RPM packages
官網也介紹了如何設置堆大小。
默認情況,ES 告訴 JVM 使用一個最小和最大都為 1GB 的堆。但是到了生產環境,這個配置就比較重要了,確保 ES 有足夠堆空間可用。
ES 使用 Xms(minimum heap size)
和 Xmx(maxmimum heap size)
設置堆大小。你應該將這兩個值設為同樣的大小。
Xms
和 Xmx
不能大於你物理機記憶體的 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 的集群也可以成功啟動的。
- Elasticsearch 集群中節點角色的介紹 對上文中的
node.master
等配置做了介紹。如果本地僅是簡單測試使用,上文中的node.master/node.data/node.ingest
不用配置也沒影響。
創建集群
實驗機器有限,我們在同一台機器上創建三個 ES 實例來創建集群,分別明確指定了這些實例的 http.port
和 transport.port
。discovery.seed_hosts
明確指定實例的埠對測試集群的高可用性很關鍵。
如果後期有新節點加入,新節點的
discovery.seed_hosts
沒必要包含所有的節點,只要它裡面包含集群中已有的節點資訊,新節點就能發現整個集群了。
集群配置預覽
分別進入es-7.3.0-node-1
、es-7.3.0-node-2
和 es-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 節點,因為它設置了初始主節點的列表。這時候就可以使用 //<host IP>:9200/
看到結果了。然後逐一啟動 node-2 和 node-3。通過訪問 //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
//127.0.0.1:9200/_nodes
將會顯示節點更多的詳情資訊
插鍵顯示結果:
五角星表示該節點是主節點,圓圈表示該節點是數據節點
有沒有發現,我並沒有給 node-2
和 node-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 //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 狀態、對其重啟等。
參考
- learnku/Elasticsearch中文文檔-7.3版本 推薦
- ES-CN 官網/Elasticsearch 集群協調迎來新時代 對於 ES7 的集群發現機制介紹較為詳細,推薦
- 程式羊-CentOS7上ElasticSearch安裝填坑記 FAQ 有幫助
- 搭建ELFK日誌採集系統
- 靜覓—Ubuntu 搭建 Elasticsearch 6 集群流程
- ELK 架構之 Elasticsearch 和 Kibana 安裝配置
- 使用 ELK(Elasticsearch + Logstash + Kibana) 搭建日誌集中分析平台實踐
- 手把手教你,在CentOS上安裝ELK,進行伺服器日誌收集
最後
- 本文作者: Michael翔
- 本文鏈接: //michael728.github.io/2020/04/12/elk-es-install/