docker环境下分别搭建elasticsearch单体环境和集群环境、IK分词器的安装及SpringBoot项目的配置连接

一、elasticsearch简介

Elasticsearch 是一个实时的分布式搜索分析引擎,它能让你以前所未有的速度和规模,去探索你的数据。 它被用作全文检索、结构化搜索、分析以及这三个功能的组合。

二、单体环境搭建

1.使用docker命令拉取elasticsearch镜像

docker pull elasticsearch

2.配置文件

  1. 执行命令mkdir -p /mydata/elasticsearch/{config,data,plugins}创建文件夹

  2. 并在config文件夹下创建elasticsearch.yml文件,具体配置如下:

    http.host: 0.0.0.0                    # 监听每一个可用的网络接口
    http.cors.enabled: true            # 是否支持跨域,默认为false
    http.cors.allow-origin: "*"         # 当设置允许跨域,默认为*,表示支持所有域名
    
  3. 将文件权限修改为777

    chmod -R 777 /mydata/elasticsearch/
    

3.启动elasticsearch

docker run --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /mydata/elasticsearch/data:/usr/share/elasticsearch/data -v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins -d elasticsearch:7.10.1
  • 具体参数含义
  •   docker run 
      --name elasticsearch       
      -p 9200:9200 
      -p 9300:9300 
      -e "discovery.type=single-node"        #单节点部署
      -e ES_JAVA_OPTS="-Xms256m -Xmx256m"      #设置初始堆内存和最大内存 也可以调整虚拟机内存
      -v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml 
      -v /mydata/elasticsearch/data:/usr/share/elasticsearch/data 
      -v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins   #挂载文件夹
      -d elasticsearch:7.10.1               #使用docker镜像elasticsearch:7.10.1    以后台模式启动
    

4.安装elasticsearch head插件监控管理

docker pull mobz/elasticsearch-head:5
docker run --name es-head -d -p 9100:9100 docker.io/mobz/elasticsearch-head:5

5.es-head插件不能创建索引问题

控制台中查看请求报错信息为:Content-Type header [application/x-www-form-urlencoded] is not supported

所以我们需要修改一下elasticsearch-head 5的配置文件

1.因为docker容器里面无法使用vi/vim,所以需要先将文件拷贝出来

docker cp es-head:/usr/src/app/_site/vendor.js /mydata/es-head/

2、编辑vendor.js文件

1)6886行
contentType: "application/x-www-form-urlencoded
改成
contentType: "application/json;charset=UTF-8"
2)7573行
var inspectData = s.contentType === "application/x-www-form-urlencoded" &&
改成
var inspectData = s.contentType === "application/json;charset=UTF-8" &&

3.将改完后的文件拷贝回容器

docker cp /mydata/es-head/vendor.js es-head:/usr/src/app/_site/vendor.js

4.无需重启,刷新页面即可

6.展示

使用docker ps -a命令查看容器启动情况
在这里插入图片描述
使用9100端口查看elasticsearch-head界面
在这里插入图片描述

三、集群环境搭建

为了演示方便,我只是在一台服务器上进行操作,实际业务中,elasticsearch各个节点应分别部署在不同的服务器上,这样保证其健壮性。

1.使用docker命令拉取elasticsearch镜像

docker pull elasticsearch

2.配置文件管理

  • 使用命令mkdir -p /mydata/es-cluster/{es-date01,es-date02,es-date03}/{config,data,plugins}创建文件夹

  • 分别在/mydata/es-cluster/{es-date01,es-date02,es-date03}/config文件夹下添加elasticsearch.yml文件,具体配置如下

      # 集群名称,同一集群环境名称一致
      cluster.name: es-cluster
      # 节点名称,应保证不一致
      node.name: es-node-1
      # 绑定host,0.0.0.0代表当前节点的ip
      network.host: 0.0.0.0
      # 设置其它节点和该节点交互的ip地址,如果不设置它会自动判断,值必须是个真实的ip地址(本机ip)
      network.publish_host: 47.94.93.93
      # 设置对外服务的http端口,默认为9200,切记与docker-compose文件中端口保持一致
      http.port: 9200
      # 设置节点间交互的tcp端口,默认是9300
      transport.tcp.port: 9300
      # 是否支持跨域,默认为false
      http.cors.enabled: true
      # 当设置允许跨域,默认为*,表示支持所有域名,如果我们只是允许某些网站能访问,那么可以使用正则表达式。比如只允许本地地址。 /https?:\/\/localhost(:[0-9]+)?/
      http.cors.allow-origin: "*"
      # 表示这个节点是否可以充当主节点
      node.master: true
      # 是否充当数据节点
      node.data: true
      # 所有主从节点ip:port
      discovery.seed_hosts: ["47.94.93.93:9300","47.94.93.93:9301","47.94.93.93:9302"]  #本地只有一个节点,无法正常启动,先注释
      # 这个参数决定了在选主过程中需要 有多少个节点通信  预防脑裂 N/2+1
      discovery.zen.minimum_master_nodes: 2
      #初始化主节点
      cluster.initial_master_nodes: ["es-node-1","es-node-2","es-node-3"]  #本地只有一个节点,无法正常启动,先注释
    

3.docker-compose文件编写

使用docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。 最后,执行 docker-compose up 命令来启动并运行整个应用程序。

version: '3'

services:
 elasticsearch-1:
  image: elasticsearch:7.10.1
  restart: always  
  hostname: es1
  container_name: es-date01
  volumes:
   - /mydata/es-cluster/es-date01/data:/usr/share/elasticsearch/data
   - /mydata/es-cluster/es-date01/plugins:/usr/share/elasticsearch/plugins
   - /mydata/es-cluster/es-date01/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
  environment:
   - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
  ports:
    - '9200:9200'
    - '9300:9300'
  privileged: true 
  
 elasticsearch-2:
  image: elasticsearch:7.10.1
  restart: always  
  hostname: es2
  container_name: es-date02
  volumes:
   - /mydata/es-cluster/es-date02/data:/usr/share/elasticsearch/data
   - /mydata/es-cluster/es-date02/plugins:/usr/share/elasticsearch/plugins
   - /mydata/es-cluster/es-date02/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
  environment:
   - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
  ports:
    - '9201:9201'
    - '9301:9301' 
  privileged: true
  
 elasticsearch-3:
  image: elasticsearch:7.10.1
  restart: always  
  hostname: es3
  container_name: es-date03
  volumes:
   - /mydata/es-cluster/es-date03/data:/usr/share/elasticsearch/data
   - /mydata/es-cluster/es-date03/plugins:/usr/share/elasticsearch/plugins
   - /mydata/es-cluster/es-date03/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
  environment:
   - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
  ports:
    - '9202:9202'     
    - '9302:9302'    
  privileged: true

4.编写es-stop.sh文件,方便集群一键关停

docker stop es-date01;
docker rm es-date01;
docker stop es-date02;
docker rm es-date02;
docker stop es-date03;
docker rm es-date03;

5.使用docker-compose up命令启动elasticsearch集群

  • 启动后docker ps -a查看容器如下:
    在这里插入图片描述

  • 在浏览器中查看集群中所有节点
    在这里插入图片描述

  • 使用9100端口查看elasticsearch-head界面,访问集群中其中一个端口,可以显示集群中所有节点,图中可以看到,elasticsearch集群自动分配es-node-3为主节点,其余为从节点。
    在这里插入图片描述

6.演示当有节点宕机之后的情况

  1. 使用docker stop es-data03停掉03节点,发现现在只有两个节点,并且图中红框位置9202端口已经访问不到了,同时01节点变为主节点
    在这里插入图片描述
  2. 使用docker restart es-data03重新启动03节点后,03节点恢复为从节点
    在这里插入图片描述

四.IK分词器的安装

1.下载分词器

地址:https://github.com/medcl/elasticsearch-analysis-ik/releases

一定是下载和自己elasticsearch版本一致的ik分词器版本

2.解压

在这里插入图片描述

3.使用xftp上传到服务器对应位置

/mydata/es-cluster/{es-date01,es-date02,es-date03}/plugins

在这里插入图片描述

4.重启elasticsearch

5.测试分词效果

在这里插入图片描述

五.SpringBoot项目配置连接

1.maven依赖

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        <version>2.5.0</version>
    </dependency>

2.yml文件中配置参数

spring:
  data:
    elasticsearch:
      repositories:
        enabled: true
      cluster-name: 47.94.93.93:9200,47.94.93.93:9201,47.94.93.93:9202        #如果是单节点,则只需要写一个ip:port即可
      cluster-nodes: es-cluster
  elasticsearch: #springboot 默认配置 localhost:9200
    rest:
      uris: ["47.94.93.93:9200","47.94.93.93:9201","47.94.93.93:9202"]         #和上方cluster-name保持一致

六.搭建过程中遇到的问题

  1. es启动报错:

    ERROR: [1] bootstrap checks failed. You must address the points described in the following [1] lines before starting Elasticsearch.
    bootstrap check failure [1] of [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
    ERROR: Elasticsearch did not exit normally - check the logs at /usr/share/elasticsearch/log/my-es.log
    

    原因是vm虚拟机的内存默认分配的太低了,导致elasticsearch容器启动失败。报错信息提示vm.max_map_count[65530]太低,至少需要262144。

    max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
    

    解决方案:

       vim /etc/sysctl.conf
       
       在该文件中添加如下所示配置:
       vm.max_map_count=655360
    
       保存后退出,并刷新配置 sysctl -p /etc/sysctl.conf
    
       再次启动即可成功
    
  2. Docker在多机器上搭建ES集群,各节点无法互通

     1.检查ES的network.*配置
     
     network.host值可以设置为0.0.0.0(表示监听所有网卡)或宿主机Ip(如果设为宿主机Ip则不能通过localhost或127.0.0.1即回环地址进行访问es),我这里设置为0.0.0.0。
     network.publish_host表示ES的发布地址,该项地址作为ES节点内部或集群交互地址。建议设置为宿主机地址。
     
     2.按上面配置了,但是各节点不能形成集群,每个节点都作为master节点?
     
     检查data目录是否为空,如果不为空需要把data目录清空,再按上述配置network,搞定。
    
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值