Docker搭建ES集群,kibana以及安装IK分词器详细步骤

2,096 阅读6分钟

前言

本篇文章根据官方文档扩展采用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搜索es镜像

拉取镜像

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集群中的每个必须组件进行冗余,集群就必须符合以下几点要求:

  1. 集群中最少要有三个主节点,这样如果集群中其中一个主节点down掉,其余两个主节点仍然占多数,仍然可以进行主节点选举。
  2. 每种角色的节点至少要有两个,这就保证了如果特定角色的一个节点down掉,另一个同样角色的节点仍然可以担任其职责。
  3. 集群必须至少具有每个分片的两个副本,如果一个副本失败,那么可以有好的副本继续来接管。

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两个配置可以参考官方文档以下两处:

discovery-settings

modules-discovery-settings

ES_JAVA_OPTS 设置堆内存大小

默认情况下,ES根据节点的角色和总内存自动设置堆大小。

如果要根据实际机器内存情况覆盖默认堆内存大小,设置Xms和Xms必须设置大小同样的值。由于ES需要堆以外的内存来进行其他工作,因此这两个值不应该大于总内存的50%。

关于堆大小设置,可以参考官方文档:

set-jvm-heap-size

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

集群启动情况

集群启动情况1

集群启动情况2

kibana启动

可以看到,三个es节点和kibana均成功启动,形成一个具有完备功能的三节点es集群。

安装IK分词器

ik分词器下载地址:

下载地址

💡下载的时候同样注意版本对应,ik分词器github项目主业README有标明:

版本对应

在es01、es02、es03目录下的plugins目录新建目录ik,再将下载好的压缩包分别解压到ik目录下,重启集群,ik分词器就安装好了。

完结

以上三节点ES集群搭建以及kibana、ik分词器安装过程,博主亲自实验踩坑,只是简单集群搭建过程,ES详细配置没有涉及到,如果有不对的地方,或者有生产环境最佳实践欢迎指正。