近日因為大數據寫入與分析應用需求的關系
需要大量的使用到ElasticSearch
然而,每次在不同的環境要佈署ELK並配置不同的node來達到Sharding的效果的工作覺得繁瑣
因此手刻了一些半自動化部署Elasticsearch的Cluster的機制(同一台主機,不同的Docker),不同台需要參考使用Docker Swarn
以下是相關Shell Script操作,相關步驟如下:
0.設定相關的環境變數,例如java memory, elasticsearch version
1.詢問要建立的容器名稱
2.詢問export的port名稱(有2組,通常為9200、9300)
3.動態建立容器網路(若容器放在同一個網路下無綁定方向問題問題)
4.動態建立cluster的目錄(容器名稱會建立在此目錄下再建立對應容器的目錄)與相關config/esdatadir、log、data目錄,並設立權限
5.動態從版控取得對應的ElasticSearch的config,也可以自行改成放在某個統一位置取得 (網址:http://xxx.xxx.xxx.xxx:yyyy是git的位置)
6. sudo sysctl -w vm.max_map_count=262144(這句不知為什麼一定要執行..java環境才起的來)
7.啟動Docker(並結合相關參數)
#!/bin/bash
sudo docker ps -a
read -p "Enter your elasticsearch container_name(eg. es1, es2): " p_container_name
container_name=$p_container_name
java_memory="2g"
es_version="5.6.6"
read -p "Enter your elasticsearch container_name default export port1(eg. 9200, 9201, 9202): " port1
export_port1=$port1
read -p "Enter your elasticsearch container_name default export port1(eg. 9300, 9301, 9302): " port2
export_port2=$port2
network_name="es_net"
if [ ! "$(sudo docker network ls |grep $network_name)" ]; then
sudo docker network create "$network_name"
echo "network created!"
else
sudo docker network ls | grep "$network_name"
echo "network $network_name already exist!"
fi
echo "continue..."
DIRECTORY="es_cluster"
sudo cd /mnt
if [ ! -d "$DIRECTORY" ]; then
sudo mkdir "$DIRECTORY"
fi
cd es_cluster
sudo mkdir "$container_name"
cd "$container_name"
echo "$container_name folder created!"
sudo git init
sudo git remote add origin "http://xxx.xxx.xxx.xxx:yyyy/scm/mes/elasticsearch.git"
sudo git pull origin master
sudo mkdir config/scripts
sudo mkdir esdatadir
cd esdatadir
sudo mkdir log
sudo mkdir data
sudo chmod 777 /mnt/es_cluster/$container_name/esdatadir/*
sudo chmod 777 /mnt/es_cluster/$container_name/config/scripts
echo "$container_name configuration setting done!"
cd /mnt/es_cluster/$container_name
sudo sysctl -w vm.max_map_count=262144
sudo docker run -d -v "/mnt/es_cluster/$container_name/esdatadir/data":/var/lib/elasticsearch \
-v "/mnt/es_cluster/$container_name/esdatadir/log":/var/log/elasticsearch \
-v "/mnt/es_cluster/$container_name/config":/usr/share/elasticsearch/config \
-p "$export_port1:9200" -p "$export_port2:9300" --name $container_name -e "bootstrap.memory_lock=true" \
-e ES_JAVA_OPTS="-Xms$java_memory -Xmx$java_memory" --ulimit memlock=-1:-1 \
--restart always \
--net "$network_name" \
elasticsearch:$es_version
echo "$container_name docker container up done!"