【ELK實(shí)踐&開(kāi)發(fā)★壹】基于Docker純手工構(gòu)建Elasticsearch高可用集群環(huán)境
jasonruan 2018.12.03
[TOC]
0 前言
Elasticsearch——You Know弦疮,F(xiàn)or Search:)诵竭,既然如此,筆者也不過(guò)多介紹谤草,直接進(jìn)入正題——基于Docker純手工構(gòu)建Elasticsearch高可用集群衙傀。
1 Elasticsearch環(huán)境搭建
1.1 構(gòu)建開(kāi)發(fā)環(huán)境基礎(chǔ)鏡像
關(guān)于開(kāi)發(fā)基礎(chǔ)鏡像構(gòu)建抬吟,請(qǐng)參看筆者另外一篇文章:《基于以太坊為女兒發(fā)一枚數(shù)字貨幣》(http://www.reibang.com/p/455f17f4143b)
1.2 構(gòu)建Elasticsearch基礎(chǔ)鏡像
基于
開(kāi)發(fā)環(huán)境基礎(chǔ)鏡像
安裝Elasticsearch當(dāng)前較
新版本6.5.1(November 20, 2018)
PS:之所以用
較
新版本,因筆者準(zhǔn)備發(fā)文前一看统抬,才發(fā)現(xiàn)ES已經(jīng)更新到6.5.2(December 05, 2018)
火本,ES的版本發(fā)布速度也是太快了:(
1.2.1 編寫(xiě)Dockerfile
# js.es.Dockerfile
FROM js/ubuntu:18.04
ENV ES_VERSION "6.5.1"
ENV JAVA_HOME /opt/java/jdk1.8.0_181
ENV PATH $PATH:$JAVA_HOME/bin
RUN mkdir -p /rzexin/soft && \
wget https://artifacts.elastic.co/downloads/Elasticsearch/Elasticsearch-$ES_VERSION.tar.gz -P /rzexin/soft && \
tar -zxvf /rzexin/soft/Elasticsearch-$ES_VERSION.tar.gz -C /rzexin/soft
WORKDIR /rzexin/soft/
RUN ln -s Elasticsearch-$ES_VERSION es
WORKDIR /rzexin/soft/es
RUN groupadd jses && useradd jses -g jses && chown -R jses:jses /rzexin/soft
USER jses
RUN sed -i 's%#network.host.*$%network.host: 0.0.0.0%g' config/Elasticsearch.yml
RUN mkdir /rzexin/soft/es/data
ENTRYPOINT ["./bin/Elasticsearch"]
1.2.2 構(gòu)建鏡像
$ sudo docker build -t rzexin/es:6.5.1 -f js.es.Dockerfile .
1.3 單節(jié)點(diǎn)環(huán)境搭建
1.3.1 啟動(dòng)鏡像
$ sudo docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9200:9200 -p 9300:9300 --name JS01 rzexin/es:6.5.1
a4941ef67aae56e394a7d6ada511d026fad4cba29879c3fe86f37e8120c7fe5a
1.3.2 測(cè)試驗(yàn)證
在宿主機(jī)執(zhí)行命令,如輸出如下信息聪建,表明單節(jié)點(diǎn)的Elasticsearch已經(jīng)啟動(dòng)成功:)
$ http http://localhost:9200
HTTP/1.1 200 OK
content-encoding: gzip
content-length: 297
content-type: application/json; charset=UTF-8
{
"cluster_name": "Elasticsearch",
"cluster_uuid": "V5-76-zfQmKv-JgQkjlK4Q",
"name": "RDwpJOV",
"tagline": "You Know, for Search",
"version": {
"build_date": "2018-11-16T02:22:42.182257Z",
"build_flavor": "default",
"build_hash": "8c58350",
"build_snapshot": false,
"build_type": "tar",
"lucene_version": "7.5.0",
"minimum_index_compatibility_version": "5.0.0",
"minimum_wire_compatibility_version": "5.6.0",
"number": "6.5.1"
}
}
1.4 高可用集群環(huán)境搭建
以下以搭建3個(gè)Elasticsearch節(jié)點(diǎn)的集群環(huán)境為例介紹
1.4.1 構(gòu)建Elasticsearch集群鏡像
1.4.1.1 編寫(xiě)Dockerfile
在Elasticsearch基礎(chǔ)鏡像之上構(gòu)建集群鏡像
主要是設(shè)置集群名稱钙畔、節(jié)點(diǎn)名稱、集群節(jié)點(diǎn)列表等
FROM rzexin/es:6.5.1
RUN sed -i 's%#cluster.name.*$%cluster.name: jses%g' config/elasticsearch.yml && \
sed -i 's%#discovery.zen.minimum_master_nodes:.*$%discovery.zen.minimum_master_nodes: 1%g' config/elasticsearch.yml
RUN echo "[ ! -z $""NODE_NAME"" ] && sed -i 's%#node.name.*$%node.name: '$""NODE_NAME""'%g' config/elasticsearch.yml" > /rzexin/soft/es/start.sh && \
echo "[ ! -z $""DISCOVERY_HOSTS"" ] && sed -i 's%#discovery.zen.ping.unicast.hosts:.*$%discovery.zen.ping.unicast.hosts: ['$""DISCOVERY_HOSTS""']%g' config/elasticsearch.yml" >> /rzexin/soft/es/start.sh && \
echo "./bin/elasticsearch" >> /rzexin/soft/es/start.sh && \
chmod a+x /rzexin/soft/es/start.sh
ENTRYPOINT ["sh", "/rzexin/soft/es/start.sh"]
1.4.1.2 構(gòu)建鏡像
$ sudo docker build -t rzexin/escluster:6.5.1 -f js.es.cluster.Dockerfile .
1.4.2 創(chuàng)建數(shù)據(jù)文件掛載目錄
分別為3個(gè)節(jié)點(diǎn)創(chuàng)建數(shù)據(jù)文件掛載目錄
$ sudo docker volume create --name=data-js-es-1
data-js-es-1
$ sudo docker volume create --name=data-js-es-2
data-js-es-2
$ sudo docker volume create --name=data-js-es-3
data-js-es-3
1.4.3 編寫(xiě)docker-compose編排文件
# cat js.es.docker-compose.yml
version: "3"
services:
js01:
build:
context: .
dockerfile: js.es.cluster.Dockerfile
image: rzexin/escluster:6.5.1
container_name: js01
hostname: js01
privileged: true
ports:
- "9200:9200"
- "9300:9300"
expose:
- 9200
- 9300
environment:
NODE_NAME: "js-es-1"
DISCOVERY_HOSTS: "\"js01\",\"js02\",\"js03\""
ES_JAVA_OPTS: "-Xms256m -Xmx256m"
volumes:
- data-js-es-1:/rzexin/soft/es/data
js02:
build:
context: .
dockerfile: js.es.cluster.Dockerfile
image: rzexin/escluster:6.5.1
container_name: js02
hostname: js02
ports:
- "29200:9200"
- "29300:9300"
expose:
- 29200
- 29300
environment:
NODE_NAME: "js-es-2"
DISCOVERY_HOSTS: "\"js01\",\"js02\",\"js03\""
ES_JAVA_OPTS: "-Xms256m -Xmx256m"
volumes:
- data-js-es-2:/rzexin/soft/es/data
js03:
build:
context: .
dockerfile: js.es.cluster.Dockerfile
image: rzexin/escluster:6.5.1
container_name: js03
hostname: js03
ports:
- "39200:9200"
- "39300:9300"
expose:
- 39200
- 39300
environment:
NODE_NAME: "js-es-3"
DISCOVERY_HOSTS: "\"js01\",\"js02\",\"js03\""
ES_JAVA_OPTS: "-Xms256m -Xmx256m"
volumes:
- data-js-es-3:/rzexin/soft/es/data
volumes:
data-js-es-1:
external: true
data-js-es-2:
external: true
data-js-es-3:
external: true
1.4.4 啟動(dòng)集群節(jié)點(diǎn)
$ sudo docker-compose -f js.es.docker-compose.yml up -d
Creating network "dockerescluster_default" with the default driver
Creating js01 ... done
Creating js03 ... done
Creating js02 ... done
1.4.5 查看集群節(jié)點(diǎn)狀態(tài)
$ sudo docker-compose -f js.es.docker-compose.yml ps
Name Command State Ports
-------------------------------------------------------------------------------------------------------------------
js01 sh /rzexin/soft/es/start.sh Up 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp
js02 sh /rzexin/soft/es/start.sh Up 29200/tcp, 29300/tcp, 0.0.0.0:29200->9200/tcp, 0.0.0.0:29300->9300/tcp
js03 sh /rzexin/soft/es/start.sh Up 39200/tcp, 39300/tcp, 0.0.0.0:39200->9200/tcp, 0.0.0.0:39300->9300/tcp
1.4.6 測(cè)試驗(yàn)證
在宿主機(jī)執(zhí)行命令金麸,查看集群節(jié)點(diǎn)情況擎析,打星號(hào)
*
的是自動(dòng)選舉出的主節(jié)點(diǎn)
$ curl http://localhost:9200/_cat/nodes?pretty
172.19.0.4 58 98 32 2.31 3.63 2.19 mdi - js-es-1
172.19.0.3 60 98 33 2.31 3.63 2.19 mdi * js-es-2
172.19.0.2 57 98 33 2.31 3.63 2.19 mdi - js-es-3
1.5 官方docker鏡像搭建
要是不愿意折騰手工編譯安裝搭建,也可考慮直接使用Elasticsearch官方的docker鏡像挥下,具體步驟如下:
1.5.1 獲取官方鏡像
- 搜索鏡像
$ sudo docker search Elasticsearch:6.5.1
NAME DESCRIPTION STARS OFFICIAL
Elasticsearch Elasticsearch is a powerful open source sear… 3270 [OK]
kibana Kibana gives shape to any kind of data — str… 1332 [OK]
- 下載鏡像
$ sudo docker pull Elasticsearch:6.5.1
6.5.1: Pulling from library/Elasticsearch
Digest: sha256:0db7521b9cd9f3906aae70fd146b78ce204b1c7c13fc32e4a2ed449e6576af53
Status: Image is up to date for Elasticsearch:6.5.1
- 查看鏡像
$ sudo docker images elasticsearch
REPOSITORY TAG IMAGE ID CREATED SIZE
elasticsearch 6.5.1 32f93c89076d 2 weeks ago 773MB
1.5.2 運(yùn)行官方鏡像
- 運(yùn)行鏡像
運(yùn)行該鏡像默認(rèn)會(huì)占用2G內(nèi)存揍魂,受限于機(jī)器性能,故通過(guò)
ES_JAVA_OPTS
參數(shù)限制內(nèi)存使用
$ sudo docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9200:9200 -p 9300:9300 --name ES01 32f93c89076d
29ff9574492ce0f3c008664fc1044851402e3594fbada62d91b4da725615fbbf
- 檢查鏡像
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
29ff9574492c 32f93c89076d "/usr/local/bin/dock…" 23 seconds ago Up 22 seconds 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp ES01
1.5.3 測(cè)試驗(yàn)證
看到如下輸出棚瘟,表示Elasticsearch啟動(dòng)成功
$ http 'http://localhost:9200'
HTTP/1.1 200 OK
content-encoding: gzip
content-length: 298
content-type: application/json; charset=UTF-8
{
"cluster_name": "docker-cluster",
"cluster_uuid": "djDC-rsqQ9KD2hOXRP3Rew",
"name": "jzqf9Oy",
"tagline": "You Know, for Search",
"version": {
"build_date": "2018-11-16T02:22:42.182257Z",
"build_flavor": "default",
"build_hash": "8c58350",
"build_snapshot": false,
"build_type": "tar",
"lucene_version": "7.5.0",
"minimum_index_compatibility_version": "5.0.0",
"minimum_wire_compatibility_version": "5.6.0",
"number": "6.5.1"
}
}
2 容災(zāi)驗(yàn)證
-
查看當(dāng)前集群節(jié)點(diǎn)情況
打星號(hào)
*
的是自動(dòng)選舉出的主節(jié)點(diǎn)
$ curl http://localhost:9200/_cat/nodes?pretty
172.19.0.4 58 98 32 2.31 3.63 2.19 mdi - js-es-1
172.19.0.3 60 98 33 2.31 3.63 2.19 mdi * js-es-2
172.19.0.2 57 98 33 2.31 3.63 2.19 mdi - js-es-3
-
停掉2號(hào)主節(jié)點(diǎn)(
js-es-2
)$ sudo docker-compose -f js.es.docker-compose.yml stop js02 Stopping js02 ... done
-
查看集群節(jié)點(diǎn)情況
可見(jiàn)2號(hào)主節(jié)點(diǎn)(
js-es-2
)已被剔掉现斋,并重新選舉出了新的主節(jié)點(diǎn)$ curl http://localhost:9200/_cat/nodes?pretty 172.23.0.4 48 90 22 1.01 2.86 2.64 mdi * js-es-3 172.23.0.3 56 90 22 1.01 2.86 2.64 mdi - js-es-1
-
啟動(dòng)2號(hào)節(jié)點(diǎn)(
js-es-2
)$ sudo docker-compose -f js.es.docker-compose.yml start js02 Starting js02 ... done
-
再次查看集群節(jié)點(diǎn)情況
可見(jiàn)2號(hào)節(jié)點(diǎn)又重新加入集群,但這時(shí)已經(jīng)不是主節(jié)點(diǎn)了
$ curl http://localhost:9200/_cat/nodes?pretty 172.23.0.2 43 98 31 1.58 2.25 2.43 mdi - js-es-2 172.23.0.4 51 98 31 1.58 2.25 2.43 mdi * js-es-3 172.23.0.3 58 98 31 1.58 2.25 2.43 mdi - js-es-1
3 常見(jiàn)錯(cuò)誤
3.1 錯(cuò)誤:can not run elasticsearch as root
-
錯(cuò)誤描述
執(zhí)行Elasticsearch啟動(dòng)命令報(bào)錯(cuò)
org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root
-
錯(cuò)誤原因
出于系統(tǒng)安全考慮偎蘸,不可使用root用戶啟動(dòng)庄蹋,因Elasticsearch可以接收用戶輸入的腳本并且執(zhí)行瞬内,為了系統(tǒng)安全考慮,建議創(chuàng)建一個(gè)單獨(dú)的用戶用來(lái)運(yùn)行Elasticsearch蔓肯。
-
解決方案
創(chuàng)建用戶和分組遂鹊,并使用該用戶啟動(dòng)es
groupadd jses
useradd jses -g jses
chown -R jses:jses /rzexin/soft/es
su jses
./bin/elasticsearch
3.2 錯(cuò)誤:vm.max_map_count is too low
[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
(1)臨時(shí)修改
- 在宿主機(jī)上執(zhí)行命令
# 查看當(dāng)前值
$ sudo sysctl -a | grep "vm.max_map_count"
vm.max_map_count = 65530
# 修改成最低要求
$ sudo sysctl -w vm.max_map_count=262144
vm.max_map_count = 262144
# 查看修改后的值
$ sudo sysctl -a | grep "vm.max_map_count"
vm.max_map_count = 262144
- 重啟docker鏡像
# 先刪除容器振乏,否則報(bào)錯(cuò)
$ sudo docker run -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -d -p 9200:9200 -p 9300:9300 --name ES01 32f93c89076d
docker: Error response from daemon: Conflict. The container name "/ES01" is already in use by container "a9e2daa0227bb60a7ce3fffd0881eb7d4caa2b032c3933f52fb6a5bcd55def12". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.
$ sudo docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a9e2daa0227b 32f93c89076d "/usr/local/bin/dock…" 6 minutes ago Exited (78) 6 minutes ago ES01
$ sudo docker rm a9e2daa0227b
a9e2daa0227b
# 重啟鏡像
$ sudo docker run -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -d -p 9200:9200 -p 9300:9300 --name ES01 32f93c89076d
6749988a01723a1ba9079066274676fbdd302866011e8158a70729b0b98de11b
(2)永久修改
修改配置文件:sudo vi /etc/sysctl.conf
加入:
vm.max_map_count=262144
保存即可蔗包。
4 后記
完成了Elasticsearch集群環(huán)境搭建,下一篇將介紹Elasticsearch與SpringBoot和Golang的整合慧邮。