ElasticSearch單機部署多實例環境

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

  1. 按照官方文檔所述,直接又執行了一遍命令:./bin/elasticsearch -d -Ecluster.name=my_cluster -Enode.name=node_2, 現狀是直接報錯了,錯誤信息以下:

 錯誤信息提示要麼是沒有目錄的寫權限要麼是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. 分別執行兩個腳本,第一個腳本正常運行,第二個就報錯了,錯誤信息是:

  • max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
  • max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

       對應修改以下:

[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'

符合預期。。。

相關文章
相關標籤/搜索