天天看點

如何在本地電腦搭建ES僞叢集環境

文章目錄

    • 前言
    • 方案一、多端口本地模拟叢集
    • 方案二、使用docker本地搭建叢集

前言

正所謂工欲善其事必先利其器,因為ES認證考試都是實操題目,想要考出一個好成績必須具備一個叢集環境可以實操練習。

我猜想應該很多人沒有條件操作真實的叢集環境,是以準備一個本地的僞叢集環境是必不可少的。

我準備考試的時候,ES官方指引上寫明了考試的版本是ES7.2,是以我下面也是用這個版本為例說明如何在本地搭建叢集環境。

之是以叫僞叢集,是因為它不是真實的多節點叢集。而是本地電腦通過一些手段模拟出的叢集架構。我打算介紹兩種本地搭建叢集的方案,一種是通過多個端口模拟多節點叢集,一種是通過docker模拟多節點叢集。

環境:

  • Elasticsearch 7.4
  • kibana 7.4
  • MAC OS

方案一、多端口本地模拟叢集

首先,我們去官網下載下傳ES7.2的壓縮包,然後解壓成三份不同的目錄,我本地命名是

es7.2-node1 es7.2-node2 es7.2-node3
           

首先打開node1目錄,config目錄下的

elasticsearch.yml

檔案,我的配置如下:

#叢集名稱
cluster.name: elastic-certified

#節點名稱
node.name: node-1

#資料目錄位址
path.data: /usr/local/elk/es7.2/datas/data1

#日志目錄位址
path.logs: /usr/local/elk/es7.2/logs/log1

#服務啟動後綁定的位址,這裡設定為可以任意位址
network.host: 0.0.0.0

#http端口,用于浏覽器通路
http.port: 9200

#tcp端口,内部通信
transport.tcp.port: 9300

#以便叢集中的節點都互相發現對方進行選主
discovery.seed_hosts: ["127.0.0.1:9300", "127.0.0.1:9301", "127.0.0.1:9302"]

#第一次啟動全新的ES叢集時,這個配置起作用,告訴叢集符合選主條件的節點
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]
           

剩下兩個叢集的配置,我這裡隻貼出不一樣的地方

node-2配置,

node.name: node-2

path.data: /usr/local/elk/es7.2/datas/data2

path.logs: /usr/local/elk/es7.2/logs/log2

http.port: 9201

transport.tcp.port: 9301
           

node-3配置,

node.name: node-3

path.data: /usr/local/elk/es7.2/datas/data3

path.logs: /usr/local/elk/es7.2/logs/log3

http.port: 9202

transport.tcp.port: 9302
           

依次啟動三個節點,

./es7.2-node1/bin/elasticsearch
           

然後通路下叢集

http://localhost:9200/_cat/nodes
           

傳回,

192.168.31.235 14 94 13 2.84   mdi - node-3
192.168.31.235 28 94 16 2.84   mdi - node-1
192.168.31.235 18 94 16 2.84   mdi * node-2
           

方案二、使用docker本地搭建叢集

首先需要本地電腦安裝docker環境,這一步本文省略了。網上文章比較多。

我個人還是比較推薦這種方式,一是環境配置好之後後面可以一鍵啟動整個環境,二是更接近真實的生産環境。

先準備docker的yml檔案,的檔案如下:

version: '2.2'
services:
  kibana:
    image: docker.elastic.co/kibana/kibana:7.4.0
    container_name: kibana7
    environment:
      - I18N_LOCALE=zh-CN
      - XPACK_GRAPH_ENABLED=true
      - TIMELION_ENABLED=true
      - XPACK_MONITORING_COLLECTION_ENABLED="true"
    ports:
      - "5601:5601"
    networks:
      - es7net
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.4.0
    container_name: es7_01
    environment:
      - cluster.name=cluster-test
      - node.name=es7_01
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - discovery.seed_hosts=es7_01,es7_02
      - cluster.initial_master_nodes=es7_01,es7_02
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - es7data1:/usr/share/elasticsearch/data
      #- es7plugins1:/usr/share/elasticsearch/plugins
      #- ./plugins1:/usr/share/elasticsearch/plugins
    ports:
      - 9200:9200
    networks:
      - es7net
  elasticsearch2:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.4.0
    container_name: es7_02
    environment:
      - cluster.name=cluster-test
      - node.name=es7_02
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - discovery.seed_hosts=es7_01,es7_02
      - cluster.initial_master_nodes=es7_01,es7_02
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - es7data2:/usr/share/elasticsearch/data
      #- es7plugins2:/usr/share/elasticsearch/plugins
      #- ./plugins2:/usr/share/elasticsearch/plugins
    networks:
      - es7net


volumes:
  es7data1:
    driver: local
  es7plugins1:
    driver: local
  es7data2:
    driver: local
  es7plugins2:
    driver: local

networks:
  es7net:
    driver: bridge

           

簡單解釋下,首先我配置了一個kibana的服務,版本是7.4.0,使用端口5601。然後是兩個es節點,版本也是7.4.0,叢集名稱是cluster-test。

啟動指令,

docker-compose up
           

第一次的時候,會拉取需要的鏡像。時間稍慢。啟動完畢後,驗證下是否啟動成功。打開浏覽器輸入:

http://localhost:9200
           

傳回:

{
  "name" : "es7_01",
  "cluster_name" : "cluster-test",
  "cluster_uuid" : "QgWluu5BTj6WwR13n6Khuw",
  "version" : {
    "number" : "7.4.0",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "22e1767283e61a198cb4db791ea66e3f11ab9910",
    "build_date" : "2019-09-27T08:36:48.569419Z",
    "build_snapshot" : false,
    "lucene_version" : "8.2.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}
           

再輸入:

http://localhost:9200/_cat/nodes
           

傳回:

172.20.0.4 39 98 22 1.41 0.69 0.31 dilm * es7_01
172.20.0.2 30 98 22 1.41 0.69 0.31 dilm - es7_02
           

浏覽器本地方位5601kibana也是可以正常啟動的。

是不是發現簡直不能太友善,而且可以很容易的切換不同版本的ES。

報錯:

{
  "error": {
    "root_cause": [
      {
        "type": "security_exception",
        "reason": "current license is non-compliant for [security]",
        "license.expired.feature": "security"
      }
    ],
    "type": "security_exception",
    "reason": "current license is non-compliant for [security]",
    "license.expired.feature": "security"
  },
  "status": 403
}

           

可能有人會有疑問,早docker環境下如何修改ES的配置檔案呢?這個比本地環境稍微麻煩一些,我們需要進入容器内部修改。首先我們先看下已經啟動的容器程序,

$ docker ps
CONTAINER ID   IMAGE                                                 COMMAND                  CREATED       STATUS       PORTS                              NAMES
da6413cdcc8d   docker.elastic.co/elasticsearch/elasticsearch:7.4.0   "/usr/local/bin/dock…"   2 hours ago   Up 2 hours   9200/tcp, 9300/tcp                 es7_02
f46221c171a9   docker.elastic.co/elasticsearch/elasticsearch:7.4.0   "/usr/local/bin/dock…"   2 hours ago   Up 2 hours   0.0.0.0:9200->9200/tcp, 9300/tcp   es7_01
7bbdd98281a4   docker.elastic.co/kibana/kibana:7.4.0                 "/usr/local/bin/dumb…"   2 hours ago   Up 2 hours   0.0.0.0:5601->5601/tcp             kibana7
           

然後進入容器修改配置檔案,或者其它一些操作。

$ docker exec -it es7_01 /bin/bash
[[email protected] elasticsearch]#
[[email protected] elasticsearch]# ls
LICENSE.txt  NOTICE.txt  README.textile  bin  config  data  jdk  lib  logs  modules  plugins
[[email protected] elasticsearch]# ls config/
elasticsearch.keystore  elasticsearch.yml  jvm.options  log4j2.properties  role_mapping.yml  roles.yml  users  users_roles
           

退出容器,輸入

exit

即可。然後重新開機容器。

如果要停止容器,使用下面的指令。

#停止容器
docker-compose down
           
#停止容器并且移除資料
docker-compose down -v
           

參考:

  • https://github.com/deviantony/docker-elk

繼續閱讀