你現在的日誌依然指向兩個核心問題:els02主機名無法解析(UnknownHostException: els02) 和集羣僅發現els節點,無法找到els02完成主節點選舉。這是最典型的節點發現失敗場景,我會給出更直接、可落地的解決方案,包括繞過主機名解析的應急方案和規範的持久化方案。
一、日誌核心錯誤再強調(明確問題根源)
java.net.UnknownHostException: els02:服務器沒有任何機制(/etc/hosts或DNS)能將els02轉換成IP地址,ES根本找不到這個節點。master not discovered yet, must discover master-eligible nodes [els, els02]:集羣配置要求選舉主節點需要els和els02兩個節點,但只找到了els,集羣無法初始化。local node found:ES識別到了自身的IP(10.0.0.70、172.16.3.70),但沒有其他節點,屬於附帶警告,解決了主機名問題後這個警告會自動消失。
二、解決方案(分兩種場景,優先選應急方案快速解決)
場景1:應急方案——直接使用IP地址(繞過主機名解析,最快生效)
這種方式不需要配置/etc/hosts,直接用節點的IP地址替換配置中的主機名,避免解析問題。
步驟1:確認els02的真實IP地址
- 登錄
els02節點,執行ip a查看內網IP(比如是10.0.0.71,請替換為你實際的IP)。
步驟2:修改所有節點的ES配置文件
編輯/etc/elasticsearch/elasticsearch.yml,將discovery.seed_hosts和cluster.initial_master_nodes中的els02替換為IP:
# 集羣名稱(保持不變)
cluster.name: elk-cluster
# 節點名稱:els節點填els,els02節點填els02(保持唯一)
node.name: els
# 綁定IP(填0.0.0.0或節點內網IP)
network.host: 0.0.0.0
http.port: 9200
# 關鍵修改:用IP替換els02,避免主機名解析
discovery.seed_hosts: ["10.0.0.70", "10.0.0.71"] # els=10.0.0.70,els02=10.0.0.71
# 初始化主節點:只保留節點名稱(els、els02),名稱與node.name一致即可
cluster.initial_master_nodes: ["els", "els02"]
# 數據和日誌路徑(保持不變)
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
注意:
els02節點的配置文件也要做同樣的修改,discovery.seed_hosts同樣填["10.0.0.70", "10.0.0.71"]。
步驟3:重啓ES服務
# 停止所有節點的ES服務
systemctl stop elasticsearch
# 先啓動els節點,等待10秒再啓動els02節點
systemctl start elasticsearch
sleep 10
# 登錄els02節點執行:systemctl start elasticsearch
步驟4:驗證集羣狀態
# 在els節點執行,查看集羣健康狀態
curl -X GET "http://10.0.0.70:9200/_cluster/health?pretty"
# 查看節點列表
curl -X GET "http://10.0.0.70:9200/_cat/nodes?v"
# 查看集羣UUID
curl -X GET "http://10.0.0.70:9200/_cluster/state?pretty" | grep "cluster_uuid"
場景2:規範方案——配置/etc/hosts實現主機名解析(持久化推薦)
如果需要使用主機名(比如集羣節點較多,便於管理),需要在所有集羣節點上配置/etc/hosts。
步驟1:在所有節點編輯/etc/hosts
vim /etc/hosts
# 添加以下內容(替換為你的實際IP和主機名)
10.0.0.70 els
10.0.0.71 els02
步驟2:驗證解析是否生效
# 執行後能ping通説明解析成功
ping els02 -c 2
# 查看解析結果
nslookup els02
步驟3:恢復ES配置中的主機名(可選)
將discovery.seed_hosts改回["els", "els02"],重啓ES服務即可。
三、必做的輔助檢查(確保節點間通信)
即使解決了解析問題,若9300端口不通,節點依然無法通信,因此需要檢查端口:
# 1. 在els節點測試els02的9300端口
nc -zv 10.0.0.71 9300
# 正常返回:Connection to 10.0.0.71 9300 port [tcp/*] succeeded!
# 2. 若不通,開放9300端口(所有節點執行)
firewall-cmd --add-port=9300/tcp --permanent
firewall-cmd --reload
# 3. 臨時關閉SELinux(若端口通但仍無法發現節點)
setenforce 0
四、常見問題兜底方案(若上述步驟仍無效)
如果執行後還是無法發現節點,嘗試以下操作:
- **清空數據目錄(僅測試環境,會丟失數據)**:
systemctl stop elasticsearch rm -rf /var/lib/elasticsearch/* systemctl start elasticsearch - 檢查節點名稱是否重複:確保
els和els02的node.name沒有重複。 - 檢查ES用户權限:
chown -R elasticsearch:elasticsearch /var/lib/elasticsearch /var/log/elasticsearch
總結
- 核心問題:
els02主機名無法解析,導致ES節點發現失敗,主節點選舉無法完成。 - 解決關鍵:
- 應急方案:直接用IP地址替換配置中的主機名,最快生效;
- 規範方案:在所有節點配置
/etc/hosts,實現主機名解析。
- 驗證手段:通過
_cluster/health查看集羣狀態,_cat/nodes查看節點列表,確認cluster_uuid正常生成。
如果執行後仍有問題,可補充els02節點的IP地址和ES配置文件內容,我會進一步幫你定位!