前言
本篇文章根据官方文档扩展采用docker compose安装es集群以及kibana和ik分词器。
进行安装的版本如下:
- Elasticsearch:7.15.2
- Kibana:7.14.2
- ik:7.15.2
博主是在mac m1环境下进行安装,同样适用Linux,windows安装思路也差不多,完全可以参考。
先附上官方文档docker安装集群:
准备镜像
直接使用docker搜索es镜像或者在dockerhub查找:
docker search elasticsearch
搜索结果如下:
拉取镜像
docker pull elasticsearch:7.15.2
💡拉取镜像的时候附带版本号会快一点,博主不带版本号拉取未成功。
把kibana的镜像也准备一下,注意,kibana的镜像版本和elasticsearch的镜像版本必须对应,起码大版本号也要对应上,版本对应可以参考官网版本支撑,博主采用的kibana镜像版本是7.14.2。
搜索kibana镜像:
docker search kibana
拉取镜像:
docker pull kibana:latest
或者
docker pull kibana:7.14.2
镜像准备完毕。
ES弹性集群
搭建高可用ES集群,就必须保证即使少量节点down掉了,集群仍然可以正常工作,这就要求必须对集群中每个必须的组件进行冗余。
要对ES集群中的每个必须组件进行冗余,集群就必须符合以下几点要求:
- 集群中最少要有三个主节点,这样如果集群中其中一个主节点down掉,其余两个主节点仍然占多数,仍然可以进行主节点选举。
- 每种角色的节点至少要有两个,这就保证了如果特定角色的一个节点down掉,另一个同样角色的节点仍然可以担任其职责。
- 集群必须至少具有每个分片的两个副本,如果一个副本失败,那么可以有好的副本继续来接管。
docker compose编排容器
我们搭建三个节点的集群,根据上面所说要求对集群中必要组件进行冗余,我们将三个节点都设置为数据节点,并且每个节点都设置为master。
第一步,创建Es目录,在Es目录分别创建es01,es02,es03三个目录作为三个节点的挂载目录,然后在三个目录下分别创建conf、data、plugins三个目录分别挂载容器内的es配置文件、es数据、es插件。
在Es目录下创建kibana目录并在该目录下创建kibana.yml,用于挂载kibana配置文件。
第二步,编写docker-compose目录:
docker-compose.yml
version: '3'
services:
es01:
image: ${image}
container_name: es01
environment:
- discovery.seed_hosts=es02,es03
- cluster.initial_master_nodes=es01,es02,es03
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- /Users/fupingstar/Develop/Docker/Es/es01/data:/usr/share/elasticsearch/data
- /Users/wangge/fupingstar/Docker/Es/es01/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- /Users/fupingstar/Develop/Docker/Es/es01/plugins:/usr/share/elasticsearch/plugins
ports:
- 9200:9200
networks:
- elastic
es02:
image: ${image}
container_name: es02
environment:
- discovery.seed_hosts=es01,es03
- cluster.initial_master_nodes=es01,es02,es03
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- /Users/fupingstar/Develop/Docker/Es/es02/data:/usr/share/elasticsearch/data
- /Users/fupingstar/Develop/Docker/Es/es02/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- /Users/fupingstar/Develop/Docker/Es/es02/plugins:/usr/share/elasticsearch/plugins
ports:
- 9201:9201
networks:
- elastic
es03:
image: ${image}
container_name: es03
environment:
- discovery.seed_hosts=es01,es02
- cluster.initial_master_nodes=es01,es02,es03
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- /Users/fupingstar/Develop/Docker/Es/es03/data:/usr/share/elasticsearch/data
- /Users/fupingstar/Develop/Docker/Es/es03/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- /Users/fupingstar/Develop/Docker/Es/es03/plugins:/usr/share/elasticsearch/plugins
ports:
- 9202:9202
networks:
- elastic
kibana:
image: ${image_kibana}
container_name: kibana
depends_on:
- es01
environment:
ELASTICSEARCH_URL: http://es01:9200
ELASTICSEARCH_HOSTS: http://es01:9200
volumes:
- /Users/fupingstar/Develop/Docker/Es/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml
networks:
- elastic
ports:
- 5601:5601
networks:
elastic:
driver: bridge
💡在docker-compose文件中,容器使用镜像我们都使用占位符代替,那么docker会加载哪个地方?
在docker-compose文件所在目录下创建 .env文件,docker会读取这个文件的变量来替换compose文件的占位符。
.env
image=docker.elastic.co/elasticsearch/elasticsearch:7.15.2
image_kibana=kibana:7.14.2
我们再对每个节点的配置做分析:
image:${image} elasticsearch镜像
container_name 节点名称
discovery.seed_hosts cluster.initial_master_nodes
这两个设置是为了集群中的节点可以相互发现并进行主节点选举。
discovery.seed_hosts :发现配置。
如果你的es节点都部署在本地,那么可以不用配置,es在启动时将绑定到可用的回环地址,并扫描9300-9305端口,以连接同一服务器上的es节点。
如果要与其他服务器上的节点组成集群,则必须配置该节点。该配置是用于在集群中启动当前节点时,发现其他节点的初始列表,这些节点必须都是master,并且是处于活动状态的可达节点,每个地址可以是ip地址,也可以是通过DNS解析为一个或多个ip地址的主机名。
cluster.initial_master_nodes:初始候选master节点列表。
集群第一次启动的时候,集群需要进行一次主节点选举,集群引导步骤将确定在第一次选举中进行投票的一组主节点。在开发模式下,如果未配置发现设置,此步骤将由节点本身自动执行,由于自动引导本质上是不安全的,所以在生产环境中,必须使用cluster.initial_master_nodes来配置这组主节点列表。
💡当集群第一次成功形成后,应该在每个节点的配置中删除该配置,重新启动集群或者将新节点添加到集群中不要使用此配置。
关于discovery.seed_hosts 和 cluster.initial_master_nodes两个配置可以参考官方文档以下两处:
ES_JAVA_OPTS 设置堆内存大小
默认情况下,ES根据节点的角色和总内存自动设置堆大小。
如果要根据实际机器内存情况覆盖默认堆内存大小,设置Xms和Xms必须设置大小同样的值。由于ES需要堆以外的内存来进行其他工作,因此这两个值不应该大于总内存的50%。
关于堆大小设置,可以参考官方文档:
volumes 挂载目录
compose文件中节点的配置就介绍到这里,关于compose文件的其他配置具体参考docker官方文档。
第三步,在每个es节点挂载主目录下的conf目录编写每个节点的elasticsearch.yml配置文件。
es01/conf/elasticsearch.yml
cluster.name: fupingstar_es_cluster # 集群名称,集群名称相同的节点自动组成一个集群
node.name: es01 # 节点名称
network.host: 0.0.0.0 # 同时设置bind_host和publish_host
http.port: 9200 # rest客户端连接端口
transport.tcp.port: 9300 # 集群中节点互相通信端口
node.master: true # 设置master角色
node.data: true # 设置data角色
node.ingest: true # 设置ingest角色 在索引之前,对文档进行预处理,支持pipeline管道,相当于过滤器
bootstrap.memory_lock: false
node.max_local_storage_nodes: 1
http.cors.enabled: true # 跨域配置
http.cors.allow-origin: /.*/ # 跨域配置
es02/conf/elasticsearch.yml
cluster.name: fupingstar_es_cluster
node.name: es02
network.host: 0.0.0.0
http.port: 9201
transport.tcp.port: 9300
node.master: true
node.data: true
node.ingest: true
bootstrap.memory_lock: false
node.max_local_storage_nodes: 1
http.cors.enabled: true
http.cors.allow-origin: /.*/
es03/conf/elasticsearch.yml
cluster.name: fupingstar_es_cluster
node.name: es03
network.host: 0.0.0.0
http.port: 9202
transport.tcp.port: 9300
node.master: true
node.data: true
node.ingest: true
bootstrap.memory_lock: false
node.max_local_storage_nodes: 1
http.cors.enabled: true
http.cors.allow-origin: /.*/
第四步,启动集群,在docker-compose文件所在目录下运行命令:
docker-compose up -d
集群启动情况
可以看到,三个es节点和kibana均成功启动,形成一个具有完备功能的三节点es集群。
安装IK分词器
ik分词器下载地址:
💡下载的时候同样注意版本对应,ik分词器github项目主业README有标明:
在es01、es02、es03目录下的plugins目录新建目录ik,再将下载好的压缩包分别解压到ik目录下,重启集群,ik分词器就安装好了。
完结
以上三节点ES集群搭建以及kibana、ik分词器安装过程,博主亲自实验踩坑,只是简单集群搭建过程,ES详细配置没有涉及到,如果有不对的地方,或者有生产环境最佳实践欢迎指正。