目錄javascript
開始以前:html
關於ES單機服務的部署, 可參考博文: ES 02 - 部署Elasticsearch單機服務 + 部署中的常見問題java
關於集羣的服務配置建議, 能夠參考上一篇博文: ES 30 - Elasticsearch生產集羣的服務器配置建議node
配置服務器IP地址與主機名稱的映射, 方便維護與遷移.bootstrap
服務器IP 映射的主機名 172.16.22.131 es-1 172.16.22.132 es-2 172.16.22.133 es-3 依次編輯三臺服務器的
/etc/hosts
文件, 添加映射內容:vim[root@localhost ~]# vim /etc/hosts # 添加下述內容: 172.16.22.131 es-1 172.16.22.132 es-2 172.16.22.133 es-3
Elasticsearch集羣中各個節點之間須要通訊, 配置免密通訊是必須的.bash
參考博文 Linux - 配置SSH免密登陸 - 「ssh-keygen」的基本用法 完成相關免密通訊的配置.服務器
學習使用ES的前提是成功安裝JDK —— 很基礎的一項步驟, 這裏省略.ssh
此處學習演示所用的JDK版本爲:elasticsearch
[root@localhost ~]# java -version java version "1.8.0_151" Java(TM) SE Runtime Environment (build 1.8.0_151-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)
請參照博文 ES 02 - 部署Elasticsearch單機服務 + 部署中的常見問題 進行操做, 若是過程當中遇到不可知的問題, 可在評論區留言, 博主會在看到後的第一時間回覆.
與部署單機服務不一樣的地方 —— 修改配置文件/data/elk-6.6.0/es-node/config/elasticsearch.yml
:
# 大約17行, 修改集羣名稱, 同一個集羣中此名稱必須相同, 才能組成一個邏輯集羣: cluster.name: heal_es # 大約23行, 修改節點名稱, 能夠設置爲與主機名稱相同: node.name: es-1 # 大約55行, 指定可經過外部服務器訪問本地ES服務: network.host: 0.0.0.0 # 並指定訪問的端口號, 默認是9200, 爲了防止衝突, 這裏修改成9301: http.port: 9301 # 大約68行, 指定初始的主機列表, 用來在新節點啓動時執行發現功能: discovery.zen.ping.unicast.hosts: ["es-1", "es-2", "es-3"]
注意: 修改完配置後, 先不要啓動服務, 全部節點中的安裝包都整理完畢, 再依次啓動.
—— 由於ES服務一旦啓動, 就會在${ES_HOME}/data/
下生成集羣數據, 包括節點id、節點鎖(node lock)等, 不一樣節點的這些數據都不一樣, 若是相同則會致使啓動異常.
(1) 將配置好的安裝包分發到節點es-2和es-3上:
# 切換回root用戶 [elastic@localhost data]$ su root Password: # 輸入密碼後, 分發安裝包: [root@localhost data]# scp -r elk-6.6.0/ es-2:/data [root@localhost data]# scp -r elk-6.6.0/ es-3:/data
(2) 向es-2和es-3中添加elastic用戶和組, 並修改文件權限:
[root@localhost data]# useradd elastic -s /bin/bash [root@localhost data]# chown -R elastic:elastic /data/elk-6.6.0/
(3) 修改es-2和es-3節點的配置文件:
一樣的, 修改elasticsearch.yml
文件, 這時只修改node名稱便可:
[root@localhost ~]# vim /data/elk-6.6.0/es-node/config/elasticsearch.yml # 大約23行, 修改節點名稱, 能夠設置爲與主機名稱相同. 分別修改成es-2和es-3 node.name: es-...
(4) 若有必要-刪除從es-1拷貝而來的data目錄下的文件:
若是在從es-1節點分發安裝包時, 已經啓動了es-1上的ES服務, 那麼還要刪除es-2和es-3節點中${ES_HOME}/data/
下的全部文件, 防止後續啓動失敗.
啓動順序沒有要求:
# 切換爲elastic用戶: [root@localhost ~]# su elastic # 進入到啓動命令所在的目錄: [elastic@localhost root]$ cd /data/elk-6.6.0/es-node/bin/ # 後臺啓動服務: [elastic@localhost bin]$ sh elasticsearch -d
(1) 只啓動一個節點時的集羣狀態:
(2) 啓動所有節點後的集羣狀態:
(1) 問題描述:
啓動集羣中的第2、三個節點時可能出現下述異常中的一種:
① 獲取node lock失敗:
[2019-06-24T22:04:06,665][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [es-3] uncaught exception in thread [main] org.elasticsearch.bootstrap.StartupException: java.lang.IllegalStateException: failed to obtain node locks, tried [[/data/elk-6.6.0/es-node/data]] with lock id [0]; maybe these locations are not writable or multiple nodes were started without increasing [node.max_local_storage_nodes] (was [1])? at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:163) ~[elasticsearch-6.6.0.jar:6.6.0] at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150) ~[elasticsearch-6.6.0.jar:6.6.0] at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[elasticsearch-6.6.0.jar:6.6.0] at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124) ~[elasticsearch-cli-6.6.0.jar:6.6.0] at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-cli-6.6.0.jar:6.6.0] at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:116) ~[elasticsearch-6.6.0.jar:6.6.0] at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:93) ~[elasticsearch-6.6.0.jar:6.6.0] ... 6 more
② 加入集羣的請求發送失敗:
# 節點[es-3]向master節點[es-1]發送加入集羣的請求失敗. [es-3] failed to send join request to master [{es-1}{jcmbr9dgRgaAWUE7xq5xAw}{wxvCc19lQvmc3xmcRHdbqA}{172.16.22.131}{172.16.22.131:9300}{ml.machine_memory=134908342272, ml.max_open_jobs=20, xpack.installed=true, ml.enabled=true}], reason [RemoteTransportException[[es-1][172.16.22.131:9300][internal:discovery/zen/join]]; # 內部緣由是: 節點id相同, 但並非同一個節點實例. nested: IllegalArgumentException[can't add node {es-3}{jcmbr9dgRgaAWUE7xq5xAw}{WXjlsD1zTWCm6YaWAAUoOg}{172.16.22.133}{172.16.22.133:9300}{ml.machine_memory=135220408320, ml.max_open_jobs=20, xpack.installed=true, ml.enabled=true}, found existing node {es-1}{jcmbr9dgRgaAWUE7xq5xAw}{wxvCc19lQvmc3xmcRHdbqA}{172.16.22.131}{172.16.22.131:9300}{ml.machine_memory=134908342272, xpack.installed=true, ml.max_open_jobs=20, ml.enabled=true} with the same id but is a different node instance]; ]
(2) 問題分析:
節點2、三的安裝包都是從節點一分發而來的, 因爲分發時節點一已經啓動, 其${ES_HOME}/data/
目錄下已生成node相關的數據, 這些數據應該由當前節點自動生成, 不能共用. 若是這些數據相同就會出現上述異常.
(3) 問題解決:
刪除節點2、三的數據目錄${ES_HOME}/data/
下的全部文件, 而後從新啓動便可.
(1) 問題說明:
節點啓動過程當中拋出以下錯誤:
org.elasticsearch.transport.RemoteTransportException: Failed to deserialize exception response from stream
(2) 問題分析:
各個Elasticsearch節點中的服務所使用的JDK版本不一致, 在 ES 30 - Elasticsearch生產集羣的服務器配置建議 的第5節5 JVM的參數配置
中有相關說明:
ES中用到了不少與JVM版本相關的特性, 好比本地序列化機制 (包括IP地址、異常信息等等), 而JVM在不一樣的minor版本中可能會修改序列化機制, 版本不一樣可能會致使序列化異常.
(3) 問題解決:
更換JDK版本, 並更新環境變量配置, 保證各節點使用的JDK版本一致.
更多問題能夠參考博文: ES 02 - 部署Elasticsearch單機服務 + 常見問題的解決 中第5節內容5 常見問題及解決方法
.
版權聲明
出處: 博客園 馬瘦風的博客(https://www.cnblogs.com/shoufeng)
感謝閱讀, 若是文章有幫助或啓發到你, 點個[好文要頂👆] 或 [推薦👍] 吧😜
本文版權歸博主全部, 歡迎轉載, 但 [必須在文章頁面明顯位置標明原文連接], 不然博主保留追究相關人員法律責任的權利.