PS:本文針對ElasticSearch版本6.0.0,各位看官看以前麻煩看一下本身使用的版本,版本不同,使用也不同。java
一般咱們認爲一個集羣是一組擁有相同cluster_name的節點組成的,所以也能夠變相的認爲單節點就構成了一個集羣。node
以前有提到如何在服務器上部署es的單個實例,在安裝完以後咱們來查看這個由單節點構成的集羣的cluster health,執行命令curl 'http://127.0.0.1:9200/_cluster/health?pretty', bootstrap
能夠發現這個單節點集羣的健康狀態顯示爲yellow,而不是徹底健康的狀態,這表明着全部的主分片都正常運行,集羣能夠正常工做,可是副本分片沒有所有正常運行。bash
具體到這個案例中,集羣健康顯示爲yellow的緣由是由於全部的副本分片都沒有分配到節點中,看上方截圖的unassigned shards 。這是由於副本分片本就是用來作冗餘備份的,若是隻有一個節點,副本分片和主分片都存在同一個節點中,一旦失去惟一節點,則全部數據都會丟失,因此備份沒有意義,es沒有給副本分片分配到節點中。服務器
既然這個緣由是隻有單個節點致使的,則能夠經過在單機上部署多個節點來解決該問題。對於部署多個節點,官方文檔的建議是:能夠徹底依照啓動第一個節點的方式啓動一個新的節點。。。。親測並不能行。。。。session
下面是具體操做步驟,遇到的問題和解決方案:curl
錯誤信息提示要麼是沒有目錄的寫權限要麼是node.max_local_storage_nodes 這個配置參數沒有配置或者配置的是1;官方文檔搜一下會發現es默認不容許單機開啓多個node的,該參數限制了單機能夠開啓的es實例個數。jvm
2. 修改$ES_HOME/config下的文件elasticsearch.yml,增長配置項node.max_local_storage_nodes: 2 elasticsearch
3. kill以前運行的節點,而後依次執行以下命令:tcp
1 ./bin/elasticsearch -d -Ecluster.name=my_cluster -Enode.name=node_1 2 curl 'http://127.0.0.1:9200/_cluster/health?pretty'; 3 ./bin/elasticsearch -d -Ecluster.name=my_cluster -Enode.name=node_2 4 curl 'http://127.0.0.1:9200/_cluster/health?pretty';
能夠看到建立node_1以後,集羣健康狀態是yellow,可是建立node_2以後,健康狀態就是green了,此時unassigned_shards也是0,以下圖:
4. 上面其實已經算是實現了本文的功能,可是能夠看到上文全部的操做步驟都是經過命令行實現的,若是須要開啓不少個實例而且每一個實例都有些不同的話,顯然命令行不是一個明智的選擇。能夠考慮在$ES_HOME/config下建立單獨文件夾來存放節點單獨的配置文件,一個節點對應一個文件夾, 操做以下:
[java@plugin01v /usr/java/elasticsearch-6.0.0/config]$ mkdir my_cluster [java@plugin01v /usr/java/elasticsearch-6.0.0/config]$ cp elasticsearch.yml jvm.options log4j2.properties my_cluster/ [java@plugin01v /usr/java/elasticsearch-6.0.0/config]$ cd my_cluster/ [java@plugin01v /usr/java/elasticsearch-6.0.0/config/my_cluster]$ ll total 16 -rw-rw---- 1 java java 3521 Dec 7 21:37 elasticsearch.yml -rw-rw---- 1 java java 2672 Dec 7 18:20 jvm.options -rw-rw---- 1 java java 5091 Dec 7 18:20 log4j2.properties
再修改elasticsearch.yml的配置內容(此處提一下遇到的坑,網上不少博客裏面的配置都是很是老的版本的es了,直接用的話會致使不少報錯,讀者必定要看下對應的版本):
#集羣名稱,用以區分節點屬於哪一個集羣 cluster.name: my_cluster node.name: node_2 #是否讓這個節點做爲默認的master node.master: false node.data: true network.host: 0.0.0.0 #對外http訪問端口 http.port: 9201 #集羣內部通訊端口 transport.tcp.port: 9301 #存放節點數據的目錄 path.data: /usr/java/elasticsearch-6.0.0/data1 #存放日誌的目錄 path.logs: /usr/java/elasticsearch-6.0.0/logs1 #發現其餘節點的主機列表 discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300"] #默認狀況下單機不容許開啓多個node,該配置限制了單節點上能夠開啓的es實例個數 node.max_local_storage_nodes: 2 thread_pool.index.queue_size: 400 thread_pool.bulk.queue_size: 5000 bootstrap.memory_lock: fals
5. 修改完以後執行命令:./bin/elasticsearch -Epath.conf=/usr/java/elasticsearch-6.0.0/config/my_cluster -Ecluster.name=my_cluster -Enode.name=node_2 會發現有報錯,看一下錯誤信息:
查看了文檔和官方論壇,對於爲何不能使用-Epath.conf也沒有一個明確的解釋,只看到說能夠用腳原本啓動節點。遂寫了兩個啓動腳本:
#!/bin/bash #es實例啓動腳本 CURRENT_PROJECT=$(pwd)/.. //節點的配置信息 export ES_PATH_CONF=$CURRENT_PROJECT/config/default DATA=$CURRENT_PROJECT/data LOGS=$CURRENT_PROJECT/logs REPO=$CURRENT_PROJECT/backups NODE_NAME=node_1 CLUSTER_NAME=my_cluster BASH_ES_OPTS="-Epath.data=$DATA -Epath.logs=$LOGS -Epath.repo=$REPO -Enode.name=$NODE_NAME -Ecluster.name=$CLUSTER_NAME" $CURRENT_PROJECT/bin/elasticsearch -d $BASH_ES_OPTS
6. 分別執行兩個腳本,第一個腳本正常運行,第二個就報錯了,錯誤信息是:
對應修改以下:
[pengzecheng@plugin01v /usr/java/elasticsearch-6.0.0/logs1] sudo su [root@plugin01v /usr/java/elasticsearch-6.0.0/scripts] ulimit -n //查看最大文件描述符個數 1024 [root@plugin01v /usr/java/elasticsearch-6.0.0/scripts] ulimit -n 65536 //設置 [root@plugin01v /usr/java/elasticsearch-6.0.0/scripts] sysctl -w vm.max_map_count=262144 [root@plugin01v /usr/java/elasticsearch-6.0.0/scripts] su java //切換到elasticsearch的執行帳號,注意此時不能夠退出root,由於文件描述符的設置只在當前session生效 [java@plugin01v /usr/java/elasticsearch-6.0.0/scripts] sh my_cluster_node_2.sh //執行第二個腳本成功
最後,查看一下各個節點對應的最大文件描述符,執行命令:curl -XGET 'localhost:9200/_nodes/stats/process?filter_path=**.max_file_descriptors&pretty'
符合預期。。。