文章目錄
-
- 前言
- 方案一、多端口本地模拟叢集
- 方案二、使用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