Elasticsearch6.2叢集搭建

這個名字想了很久發表於2018-04-02

原文地址,轉載請註明出處:https://blog.csdn.net/qq_34021712/article/details/79330028   ©王賽超

環境介紹
伺服器是否可以成為主節點是否為資料節點
192.168.8.101truetrue
192.168.8.103truetrue
192.168.8.104truetrue
搭建過程
前提是安裝java環境,ELK6.2版本需要jdk為1.8,官方推薦安裝OracleJDK 最好不要安裝OpenJDK.安裝jdk參考:linux安裝jdk 只需要將安裝包換成1.8的就行。
Elasticsearch安裝
①解壓檔案
tar -zxvf elasticsearch-6.2.1.tar.gz
②重新命名
mv elasticsearch-6.2.1 /usr/local/elk/elasticsearch
③建立資料存放路徑(應將設定配置為在Elasticsearch主目錄之外定位資料目錄,以便在不刪除資料的情況下刪除主目錄!)
mkdir /usr/local/elk/elasticsearch/data
④建立日誌存放路徑(已存在不用建立)
mkdir /usr/local/elk/elasticsearch/logs
⑤建立使用者並授權(es不能用root執行)
#新增使用者
useradd es
#賦予資料夾許可權
chown -R es:es /usr/local/elk/elasticsearch
⑥修改elasticsearch配置檔案
vim /usr/local/elk/elasticsearch/config/elasticsearch.yml 將配置檔案以下內容進行修改:
#叢集的名稱
cluster.name: es6.2
#節點名稱,其餘兩個節點分別為node-2 和node-3
node.name: node-1
#指定該節點是否有資格被選舉成為master節點,預設是true,es是預設叢集中的第一臺機器為master,如果這臺機掛了就會重新選舉master
node.master: true
#允許該節點儲存資料(預設開啟)
node.data: true
#索引資料的儲存路徑
path.data: /usr/local/elk/elasticsearch/data
#日誌檔案的儲存路徑
path.logs: /usr/local/elk/elasticsearch/logs
#設定為true來鎖住記憶體。因為記憶體交換到磁碟對伺服器效能來說是致命的,當jvm開始swapping時es的效率會降低,所以要保證它不swap
bootstrap.memory_lock: true
#繫結的ip地址
network.host: 0.0.0.0
#設定對外服務的http埠,預設為9200
http.port: 9200
# 設定節點間互動的tcp埠,預設是9300 
transport.tcp.port: 9300
#Elasticsearch將繫結到可用的環回地址,並將掃描埠9300到9305以嘗試連線到執行在同一臺伺服器上的其他節點。
#這提供了自動叢集體驗,而無需進行任何配置。陣列設定或逗號分隔的設定。每個值的形式應該是host:port或host
#(如果沒有設定,port預設設定會transport.profiles.default.port 回落到transport.tcp.port)。
#請注意,IPv6主機必須放在括號內。預設為127.0.0.1, [::1]
discovery.zen.ping.unicast.hosts: ["192.168.8.101:9300", "192.168.8.103:9300", "192.168.8.104:9300"]
#如果沒有這種設定,遭受網路故障的叢集就有可能將叢集分成兩個獨立的叢集 - 分裂的大腦 - 這將導致資料丟失
discovery.zen.minimum_master_nodes: 3
修改完之後使用命令檢視具體修改了哪些值
grep '^[a-z]' /usr/local/elk/elasticsearch/config/elasticsearch.yml
⑦調整jvm記憶體
vim /usr/local/elk/elasticsearch/config/jvm.options 
#預設是1g官方建議對jvm進行一些修改,不然很容易出現OOM,參考官網改引數配置最好不要超過記憶體的50% 
-Xms1g
-Xmx1g
分別啟動三臺Elasticsearch
注意:請使用es使用者啟動 su - es
/usr/local/elk/elasticsearch/bin/elasticsearch -d
使用ps -ef|grep elasticsearc檢視程式是否啟動,發現並沒有啟動,什麼原因呢?檢視一下日誌在我們配置的日誌路徑下:

第一個坑:日誌檔案會以叢集名稱命名,檢視es6.2.log檔案,日誌報以下異常:
[2018-02-14T23:40:16,908][ERROR][o.e.b.Bootstrap          ] [node-1] node validation exception
[3] bootstrap checks failed
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
[2]: memory locking requested for elasticsearch process but memory is not locked
[3]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
[2018-02-14T23:40:16,910][INFO ][o.e.n.Node               ] [node-1] stopping ...
[2018-02-14T23:40:17,016][INFO ][o.e.n.Node               ] [node-1] stopped
[2018-02-14T23:40:17,016][INFO ][o.e.n.Node               ] [node-1] closing ...
[2018-02-14T23:40:17,032][INFO ][o.e.n.Node               ] [node-1] closed
解決方法
切回root使用者su - root,修改配置 
① vim /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
* soft nproc 2048
* hard nproc 4096
#我選擇鎖住swapping因此需要在這個配置檔案下再增加兩行程式碼
es soft memlock unlimited
es hard memlock unlimited
以上引數介紹參考:https://my.oschina.net/987openlab/blog/94634
② vim /etc/sysctl.conf
vm.max_map_count=655360
fs.file-max=655360
注意:之後需要執行一句命令sysctl -p使系統配置生效(使用root使用者)。
再次重啟三臺Elasticsearch
使用ps -ef|grep elasticsearch程式檢視命令已啟動,使用netstat -ntlp檢視9200埠也被佔用了。
但是我們發現,3個節點都正常started了,但是就是無法形成叢集,使用Elasticsearch Head外掛缺發現沒有連線上叢集,
Head外掛安裝參考:Elasticsearch-head外掛安裝
第二個坑:檢視日誌報以下錯誤:
[2018-02-15T21:15:06,352][INFO ][rest.suppressed          ] /_cat/health Params: {h=node.total}  
MasterNotDiscoveredException[waited for [30s]]  
        at org.elasticsearch.action.support.master.TransportMasterNodeAction$4.onTimeout(TransportMasterNodeAction.java:160)  
        at org.elasticsearch.cluster.ClusterStateObserver$ObserverClusterStateListener.onTimeout(ClusterStateObserver.java:239)  
        at org.elasticsearch.cluster.service.InternalClusterService$NotifyTimeout.run(InternalClusterService.java:630)  
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)  
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)  
        at java.lang.Thread.run(Thread.java:745)  
原因:將discovery.zen.minimum_master_nodes的值設定為了3,總共3個節點,都充當主節點是不行的,將discovery.zen.minimum_master_nodes將這個配置改為2。
關於discovery.zen.minimum_master_nodes引數介紹,參考:
再次啟動
第三個坑:使用Head外掛檢視,發現只有192.168.8.101為主節點,其他兩個節點並沒有連線上來,檢視日誌發現報以下異常
[2018-02-15T21:53:58,084][INFO ][o.e.d.z.ZenDiscovery     ] [node-3] failed to send join request to master [{node-1}{SVrW6URqRsi3SShc1PBJkQ}{y2eFQNQ_TRenpAPyv-EnVg}{192.168.8.101}{192.168.8.101:9300}], reason [RemoteTransportException[[node-1][192.168.8.101:9300][internal:discovery/zen/join]]; nested: IllegalArgumentException[can't add node {node-3}{SVrW6URqRsi3SShc1PBJkQ}{uqoktM6XTgOnhh5r27L5Xg}{192.168.8.104}{192.168.8.104:9300}, found existing node {node-1}{SVrW6URqRsi3SShc1PBJkQ}{y2eFQNQ_TRenpAPyv-EnVg}{192.168.8.101}{192.168.8.101:9300} with the same id but is a different node instance]; ]
原因:可能是之前啟動的時候報錯,並沒有啟動成功,但是data檔案中生成了其他節點的資料。將三個節點的data目錄清空
再次重新啟動,成功!


相關文章