前言
正所谓工欲善其事必先利其器,因为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
[root@f46221c171a9 elasticsearch]#
[root@f46221c171a9 elasticsearch]# ls
LICENSE.txt NOTICE.txt README.textile bin config data jdk lib logs modules plugins
[root@f46221c171a9 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