【ELK實(shí)踐&開(kāi)發(fā)★壹】基于Docker純手工構(gòu)建Elasticsearch高可用集群環(huán)境

【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的整合慧邮。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末调限,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子误澳,更是在濱河造成了極大的恐慌耻矮,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忆谓,死亡現(xiàn)場(chǎng)離奇詭異裆装,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)倡缠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門哨免,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人昙沦,你說(shuō)我怎么就攤上這事琢唾。” “怎么了盾饮?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵采桃,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我丘损,道長(zhǎng)普办,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任徘钥,我火速辦了婚禮衔蹲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吏饿。我一直安慰自己踪危,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布猪落。 她就那樣靜靜地躺著贞远,像睡著了一般。 火紅的嫁衣襯著肌膚如雪笨忌。 梳的紋絲不亂的頭發(fā)上蓝仲,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼袱结。 笑死亮隙,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的垢夹。 我是一名探鬼主播溢吻,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼果元!你這毒婦竟也來(lái)了促王?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤而晒,失蹤者是張志新(化名)和其女友劉穎蝇狼,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體倡怎,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡迅耘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了监署。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颤专。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖焦匈,靈堂內(nèi)的尸體忽然破棺而出血公,到底是詐尸還是另有隱情,我是刑警寧澤缓熟,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布累魔,位于F島的核電站,受9級(jí)特大地震影響够滑,放射性物質(zhì)發(fā)生泄漏垦写。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一彰触、第九天 我趴在偏房一處隱蔽的房頂上張望梯投。 院中可真熱鬧,春花似錦况毅、人聲如沸分蓖。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)么鹤。三九已至,卻和暖如春味廊,著一層夾襖步出監(jiān)牢的瞬間蒸甜,已是汗流浹背棠耕。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留柠新,地道東北人窍荧。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像恨憎,于是被迫代替她去往敵國(guó)和親蕊退。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容