1. 程式人生 > >詳盡的 Elasticsearch7.X 安裝及叢集搭建教程

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

![Search](https://gitee.com/michael_xiang/images/raw/master/uPic/pexels-andrea-piacquadio-3769697.jpg) > 為了更好的閱讀體驗,歡迎訪問 [原文閱讀連結](https://michael728.github.io/2020/04/12/elk-es-install/) ## 簡介 首先引用 Elasticsearch (下文簡稱 ES)[官網](https://www.elastic.co/cn/elasticsearch/)的一段描述: > Elasticsearch 是一個分散式、RESTful 風格的搜尋和資料分析引擎,能夠解決不斷湧現出的各種用例。 作為 Elastic Stack 的核心,它集中儲存您的資料,幫助您發現意料之中以及意料之外的情況。 本文主要介紹 Elasticsearch 叢集的搭建。通過在一臺伺服器上建立 3 個 ES 例項來建立一個建議的 ES 叢集。 ## Elasticsearch/ES 官方的[Elasticsearch Reference](https://www.elastic.co/guide/en/elasticsearch/reference/index.html) 提供了不同版本的文件連線,真是贊! > 如果英文的不想看,還提供了中文版的 [Elasticsearch 2.x: 權威指南](https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html),版本不是最新的,但是瞭解基本概念也是有幫助的。 Elasticsearch 7.x 包裡自包含了 OpenJDK 的包。如果你想要使用你自己配置好的 Java 版本,需要設定 `JAVA_HOME` 環境變數 —— [參考](https://www.elastic.co/guide/en/elasticsearch/reference/current/setup.html) 官方文件 `Set up Elasticsearch` 有各個 OS 的安裝指導,頁面 [Installing Elasticsearch](https://www.elastic.co/guide/en/elasticsearch/reference/7.3/install-elasticsearch.html) 中提供了多種安裝包對應的指導連結! 本文選擇綠色安裝包的的方式(`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](https://www.elastic.co/cn/downloads/past-releases#elasticsearch) 官網的下載速度龜速 - [華為映象站](https://mirrors.huaweicloud.com/elasticsearch/) 下載速度不錯,推薦 下面的步驟參考 [Set up Elasticsearch » Installing Elasticsearch » Install Elasticsearch from archive on Linux or MacOS](https://www.elastic.co/guide/en/elasticsearch/reference/current/targz.html),選擇的安裝包是 elasticsearch-7.3.0 版本。 ```shell # 下載安裝包 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 包解壓後的資料夾目錄。 解壓後的[目錄組成](https://www.elastic.co/guide/en/elasticsearch/reference/current/targz.html#targz-layout): ```shell . ├── bin # 二進位制指令碼存放目錄,包括 elasticsearch 來指定執行一個 node,包括 elasticsearch-plugin 來安裝 plugins ├── config # 包含了 elasticsearch.yml 配置檔案 ├── data # 節點上分配的每個 index/分片 的資料檔案 ├── lib ├── LICENSE.txt ├── logs ├── modules ├── NOTICE.txt ├── plugins # 插鍵檔案存放的位置 └── README.textile ``` ### 執行 Elasticsearch 我們先執行一個節點,建立 ES 單機版例項: ```shell ./bin/elasticsearch ``` 如果要將 ES 作為守護程式執行,請在命令列中指定 `-d`,指定 `-p` 引數,將程序 ID 記錄到 `pid` 檔案: ```shell ./bin/elasticsearch -d -p pid ``` 日誌在 `$ES_HOME/logs` 目錄中。 如果要停止 ES,執行如下的命令: ```shell pkill -F pid ``` ### 檢查一下執行狀態 ```shell curl -X GET "localhost:9200/?pretty" ``` 或者在瀏覽器中訪問 `localhost:9200` 都可以,會返回: ```shell { "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,那麼,此時在你本地的工作機上還無法調通 `:9200`,需要對 ES 進行相關配置才能訪問,下文會介紹。 ## ES 配置相關 官網關於配置的內容主要有兩處: - [Configuraing Elasticsearch](https://www.elastic.co/guide/en/elasticsearch/reference/current/settings.html) - [Important Elasticsearch configuration](https://www.elastic.co/guide/en/elasticsearch/reference/current/important-settings.html) Elasticsearch 主要有三個配置檔案: - `elasticsearch.yml` ES 的配置,[more](https://www.elastic.co/guide/en/elasticsearch/reference/current/important-settings.html) - `jvm.options` ES JVM 配置,[more](https://www.elastic.co/guide/en/elasticsearch/reference/current/jvm-options.html#jvm-options) - `log4j2.properties` ES 日誌配置,[more](https://www.elastic.co/guide/en/elasticsearch/reference/current/logging.html#logging) > 配置檔案主要位於 `$ES_HOME/config` 目錄下,也可以通過 `ES_PATH_CONF` 環境變數來修改 YAML 的配置形式參考: ```yaml path: data: /var/lib/elasticsearch logs: /var/log/elasticsearch ``` 設定也可以按如下方式展平: ```yaml path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch ``` ### JVM 配置 [JVM 引數設定](https://www.elastic.co/guide/en/elasticsearch/reference/current/jvm-options.html#jvm-options)可以通過 `jvm.options` 檔案(推薦方式)或者 `ES_JAVA_OPTS` 環境變數來修改。 `jvm.options` 位於 - `$ES_HOME/config/jvm.options` 當通過 `tar` or `zip` 包安裝 - `/etc/elasticsearch/jvm.options` 當通過 Debian or RPM packages 官網也介紹瞭如何[設定堆大小](https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html)。 預設情況,ES 告訴 JVM 使用一個最小和最大都為 1GB 的堆。但是到了生產環境,這個配置就比較重要了,確保 ES 有足夠堆空間可用。 ES 使用 `Xms(minimum heap size)` 和 `Xmx(maxmimum heap size)` 設定堆大小。你應該將這兩個值設為同樣的大小。 **`Xms` 和 `Xmx` 不能大於你物理機記憶體的 50%。** 設定的示例: ```shell -Xms2g -Xmx2g ``` ### elasticsearch.yml 配置 ES 預設會載入位於 `$ES_HOME/config/elasticsearch.yml` 的配置檔案。 備註:任何能夠通過配置檔案設定的內容,都可以通過命令列使用 `-E` 的語法進行指定,例如: ```shell ./bin/elasticsearch -d -Ecluster.name=my_cluster -Enode.name=node_1 ``` --- #### `cluster.name` `cluster.name` 設定[叢集名稱](https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster.name.html)。一個節點只能加入一個叢集中,預設的叢集名稱是 `elasticsearch`。 ```shell cluster.name: search-7.3.2 ``` {% note info %} 確保節點的叢集名稱要設定正確,這樣才能加入到同一個叢集中。上面示例就自定義了叢集名稱為 appsearch-7.3.2。 {% endnote %} ---- #### `node.name` `node.name`:可以配置每個[節點的名稱](https://www.elastic.co/guide/en/elasticsearch/reference/current/node.name.html)。用來提供可讀性高的 ES 例項名稱,它預設名稱是機器的 `hostname`,可以自定義: ```shell node.name: node-1 ``` > 同一叢集中的節點名稱不能相同 --- #### `network.host` `network.host`:設定訪問的[地址](https://www.elastic.co/guide/en/elasticsearch/reference/current/network.host.html)。預設僅繫結在迴環地址 `127.0.0.1` 和 `[::1]`。如果需要從其他伺服器上訪問以及多型機器搭建叢集,我們需要設定 ES 執行繫結的 Host,節點需要繫結非迴環的地址。建議設定為主機的公網 IP 或 `0.0.0.0`: ```shell network.host: 0.0.0.0 ``` > 更多的網路設定可以閱讀 [Network Settings](https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-network.html) --- #### `http.port` `http.port` 預設埠是 9200 : ```shell 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 ```shell transport.port: 9300 ``` > 因為要在一臺機器上建立是三個 ES 例項,這裡明確指定每個例項的埠。 ---- #### `discovery.seed_hosts` `discovery.seed_hosts`:發現設定。有兩種重要的發現和叢集形成配置,以便叢集中的節點能夠彼此發現並且選擇一個主節點。[官網/Important discovery and cluster formation settings](https://www.elastic.co/guide/en/elasticsearch/reference/current/discovery-settings.html) `discovery.seed_hosts` 是元件叢集時比較重要的配置,用於啟動當前節點時,發現其他節點的初始列表。 開箱即用,無需任何網路配置, ES 將繫結到可用的環回地址,並將掃描本地埠 `9300 - 9305`,以嘗試連線到同一伺服器上執行的其他節點。 這無需任何配置即可提供自動群集的體驗。 如果要與其他主機上的節點組成叢集,則必須設定 `discovery.seed_hosts`,用來提供叢集中的其他主機列表(它們是符合主機資格要求的`master-eligible`並且可能處於活動狀態的且可達的,以便定址[發現過程](https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discovery-hosts-providers.html))。此設定應該是群集中所有符合主機資格的節點的地址的列表。 每個地址可以是 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`): ```shell 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](https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discovery-bootstrap-cluster.html)步驟,該步驟確定了在第一次選舉中的符合主節點資格的節點集合。在[開發模式](https://www.elastic.co/guide/en/elasticsearch/reference/7.3/bootstrap-checks.html#dev-vs-prod-mode)下,如果沒有進行發現設定,此步驟由節點本身自動執行。由於這種自動引導從本質上講是[不安全的](https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discovery-quorums.html),因此當您在[生產模式](https://www.elastic.co/guide/en/elasticsearch/reference/current/bootstrap-checks.html#dev-vs-prod-mode)下第一次啟動全新的群集時,你必須顯式列出符合資格的主節點。也就是說,需要使用 `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` 可以檢視如下資料: - [Bootstrapping a cluster](https://www.elastic.co/guide/en/elasticsearch/reference/master/modules-discovery-bootstrap-cluster.html) - [Discovery and cluster formation settings](https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discovery-settings.html) #### 其他 叢集的主要配置項上面已經介紹的差不多了,同時也給出了一些文件拓展閱讀。實際的生產環境中,配置稍微會複雜點,下面補充一些配置項的介紹。需要說明的是,下面的一些配置即使不配置,ES 的叢集也可以成功啟動的。 - [Elasticsearch 叢集中節點角色的介紹](https://michael728.github.io/2020/09/20/elk-es-node-cluster/) 對上文中的 `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` 設定如下: ```shell # 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://:9200/` 看到結果了。然後逐一啟動 node-2 和 node-3。通過訪問 `http://127.0.0.1:9200/_cat/nodes` 檢視叢集是否 OK: ```shell 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` 將會顯示節點更多的詳情資訊 插鍵顯示結果: ![叢集](https://gitee.com/michael_xiang/images/raw/master/uPic/aPk5ub.png) > 五角星表示該節點是主節點,圓圈表示該節點是資料節點 有沒有發現,我並沒有給 `node-2` 和 `node-3` 明確指定埠,為什麼在一臺機器上也成功啟動了這兩個節點? 因為 Elasticsearch 會取用 9200~9299 這個範圍內的埠,如果 9200 被佔用,就選擇 9201,依次類推。 補充:其實,還有一個簡單的方法模擬建立叢集(該方法我未測試,僅供參考)。 我們首先將上面執行的三個節點停止掉,然後進入 `es-7.3.0-node-1` 資料夾下: ```shell 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 ``` ## 安裝插鍵 ```shell ./bin/elasticsearch-plugin install analysis-icu ``` 如果插鍵安裝慢,可以先下載下來,再安裝: ```shell 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]` ```shell 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]` ```shell 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版本](https://learnku.com/docs/elasticsearch73/7.3) 推薦 - [ES-CN 官網/Elasticsearch 叢集協調迎來新時代](https://www.elastic.co/cn/blog/a-new-era-for-cluster-coordination-in-elasticsearch) 對於 ES7 的叢集發現機制介紹較為詳細,推薦 - [程式羊-CentOS7上ElasticSearch安裝填坑記](https://www.jianshu.com/p/04f4d7b4a1d3) FAQ 有幫助 - [搭建ELFK日誌採集系統](https://jeremy-xu.oschina.io/2018/10/%E6%90%AD%E5%BB%BAelfk%E6%97%A5%E5%BF%97%E9%87%87%E9%9B%86%E7%B3%BB%E7%BB%9F/) - [靜覓—Ubuntu 搭建 Elasticsearch 6 叢集流程](https://cuiqingcai.com/6255.html) - [ELK 架構之 Elasticsearch 和 Kibana 安裝配置](https://www.cnblogs.com/xishuai/p/elk-elasticsearch-kibana.html) - [使用 ELK(Elasticsearch + Logstash + Kibana) 搭建日誌集中分析平臺實踐](https://wsgzao.github.io/post/elk/) - [手把手教你,在CentOS上安裝ELK,進行伺服器日誌收集](http://www.justdojava.com/2019/08/11/elk-install/) ## 最後 - 本文作者: Michael翔 - 本文連結: https://michael728.github.io/2020/04/12/elk-es-install/ ![歡迎關注](https://gitee.com/michael_xiang/images/raw/master/uPic/XiI