SEO:ES 2.0 2.1 Elastic Elasticsearch Linux Ubuntu root start stop 開機啟動 開機自啟動 安裝 部署 使用 腦裂 無法 不能 發現 集群 節點
(本文適合有一定Linux基礎的讀者閱讀。由於幾乎是按流水賬過程記錄,而不是教程,建議操作之前讀完一遍)
本人在部署ES2.1集群時,遇到了諸多問題,花了很大功夫,才解決,特在此記錄解決過程及方法,希望幫到有需要的人。
據使用者的討論,ES在2.0版本之后發生了很大變化,因此網上的一些資料已經不再適用,在查閱資料時需要根據版本判斷,靈活變通方法。
操作系統:Ubuntu 14.04.1 64位
jdk:1.8.0_20 64位
Elasticsearch 2.1
ES部署步驟:
(1)下載目前(2015年12月18日)最新版的ES 2.1的tar.gz包,解壓,放至wsn用戶目錄,修改config\elasticsearch.yml配置文件,添加(或對已有的但被注釋掉的語句,取消注釋並修改)以下語句:
cluster.name: groupname(設定的集群名稱) node.name: node_10.10.2.145(設定的當前節點名稱) network.host: 10.10.2.145(可以理解為監聽/綁定的IP,本人設置為本機在局域網中的IP,嘗試過如果設置127.0.0.1,之后在本機可以訪問ES但在局域網中不能訪問) index.number_of_shards: 9(分片數量) http.max_content_length: 2000mb(使用中發現,如果使用默認值,使用curl post插入300M以上的txt時會報錯) http.compression: true
【注意】每行語句前不能有空格,冒號后必須有一個空格,否則可能啟動報錯
【注意】可使用 bin/elasticsearch 啟動,此時不是服務形式。root用戶不能以此方式啟動,否則會報錯
其中node.name network.host需要根據每台機器的IP等修改(本人是在一台服務器部署好之后將該服務器復制為3台,復制后需要根據機器修改部分配置)
(2)(也可以不進行此步驟,詳見下)將elasticsearch添加入系統服務service
/etc/init.d/ 下建立軟連接,操作步驟為:
使用cd命令進入/etc/init.d/ ,然后
ln -s /home/wsn/wshare/es/elasticsearch-2.1.0/bin/elasticsearch elasticsearch sudo update-rc.d elasticsearch defaults 95 10 //按照官方說法,這是適用於Ubuntu的方法,猜測為加入服務,參考Running as a Service on Linux https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-service.html#using-systemd
加入服務后,經過測試,仍然無法使用start stop等命令,報錯(如下圖):

需使用service elasticsearch 啟動服務,與直接使用bin/elasticsearch效果相同。
因此,本人決定不使用將其加入服務的方法(加入服務除了啟動時輸命令方便,別的好像沒什么卵用),采用手動配置啟動腳本與開機自啟動方式,因此加入服務部分的操作(2)可不進行。
(3)配置開機自啟動
【2016-5-26更新:發現root用戶也可以啟動ElasticSearch,方法是在啟動時添加Des.insecure.allow.root參數,如下:
bin/elasticsearch -Des.insecure.allow.root=true(參考 How to run Elasticsearch 2.1.1 as root user in Linux machine - Stack Overflow http://stackoverflow.com/questions/34920801/how-to-run-elasticsearch-2-1-1-as-root-user-in-linux-machine)】
本人使用的Ubuntu中,語句放入/etc/init.d/rc.local文件中,即可在開機時運行。
/etc/init.d/rc.local 文件,最后一行后加入:
sh /home/wsn/wshare/auto_start.sh
便能夠開機啟動auto_start.sh
在/home/wsn/wshare/auto_start.sh中寫入:
sh /home/wsn/wshare/es/elasticsearch-2.1.0/start_es.sh
便能夠開機時執行start_es.sh。
start_es.sh是啟動Elasticsearch並后台運行的腳本,內容為:
su -c “/home/wsn/wshare/es/elasticsearch-2.1.0/bin/elasticsearch &” – wsn # ↑ 臨時切換為wsn用戶執行-c后的命令,執行后切換為原用戶
(wsn用戶是Ubuntu系統中建立的另一個用戶)
即臨時切換為wsn用戶並執行”-c”后的命令語句,因此root用戶可使用此腳本啟動ES(注意第一行后可能需要添加空格,否則有報錯)。
通過以上操作,部署ES和開機自啟動便完成了。同時,root用戶也可使用如上的start_es.sh腳本啟動ES,一定程度地避免了root不能直接啟動ES帶來的不便。
停止ES使用查找進程並kill的方法(ps -ef|grep elastic),尚未找到更好的方法。但使用kill進程方法停止時,ES能感知到並寫入ES關閉的日志,因此推測kill進程時ES可以正常退出而非被強制結束。
(4)其它注意事項
①期間遇到的問題:開機啟動無法成功,並且看不到腳本執行過程的輸出,因此將輸出重定向到/tmp/debug3.log(tmp目錄下不易產生權限問題),即/etc/init.d/rc.local中加入的語句改為
sh /home/wsn/wshare/auto_start.sh < /tmp/debug3.log
之后,如果開機時執行上述命令有報錯,便可以在/tmp/debug3.log文件中看到運行過程的輸出。
②另外,jdk配置需要位於/etc/profile文件中,對所有用戶都生效。配置方法為,在/etc/profile文件末尾添加
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_20 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH
(具體的JAVA_HOME路徑需要按實際情況填寫)
如果配置jdk的方法是將上述語句添加到針對某個用戶的~/.bashrc(使用vim ~/.bashrc編輯添加),則ES無法開機啟動,錯誤為啟動時沒有JAVA環境變量。
③ES啟動時有關於log4j的日志文件權限報錯,因此將logs文件夾及其子目錄權限設置為777(chmod -R 777 logs 針對所有人都可讀可寫可執行,是個懶方法),啟動時不再有報錯。
④一定程度地防止腦裂(無法發現部分節點)問題,因此ES配置文件中加入:
discovery.zen.minimum_master_nodes: 2 discovery.zen.ping_timeout: 10s
即最少需要2個節點才會選舉master節點(即產生集群)。在配置文件的注釋中看到官方的建議是,數字設置為【節點個數/2+1】,向上取整,本人的是3個節點,因此設置為2;
發現集群的超時時間為10s。
配置啟用多播discovery.zen.ping.multicast.enabled: true,但無效,無法發現節點,因此使用單播,添加配置
discovery.zen.ping.unicast.hosts: [“10.10.2.143″, “10.10.2.144”, “10.10.2.145”, “10.10.2.10”]
如此配置之后,該節點便會訪問列表中的幾個IP,找到這幾個IP的機器中的節點,組成集群。
(后查證為ES2.0之后版本已刪除了多播功能,如果使用需要安裝multicast插件)
本人使用ES也是新手,只是總結了一些自己的經驗,文中如有錯誤、不准確、遺漏之處,希望各位不吝賜教指出,或者解答本人遇到的一些疑慮,以及共同討論探討,謝謝!
轉載時請注明出處:
Ubuntu下Elasticsearch 2.1集群部署過程與遇到的問題及解決方法(開機自啟動、root用戶啟動) - 張冬 - 博客園
