Docker-compose搭建Elasticsearch集群及kibana


前言

  本篇主要是介绍docker-compose搭建Es的实践,关于Es的深入理论知识不会在这篇讲太多,只会根据官网简单介绍一下es及kibana的用途(以下理论出自官网)。

什么是 Elasticsearch?

  Elasticsearch 是一个分布式的开源搜索和分析引擎,适用于所有类型的数据,包括文本、数字、地理空间、结构化和非结构化数据。Elasticsearch 在Apache Lucene 的基础上开发而成,由 Elasticsearch N.V.(即现在的 Elastic)于 2010 年首次发布。Elasticsearch 以其简单的 REST 风格 API、分布式特性、速度和可扩展性而闻名,是 Elastic Stack 的核心组件;Elastic Stack 是适用于数据采集、充实、存储、分析和可视化的一组开源工具。人们通常将Elastic Stack 称为 ELK Stack(代指 Elasticsearch、Logstash 和 Kibana),目前 Elastic Stack 包括一系列丰富的轻量型数据采集代理,这些代理统称为Beats,可用来向 Elasticsearch 发送数据。

Elasticsearch 的用途是什么?

Elasticsearch 在速度和可扩展性方面都表现出色,而且还能够索引多种类型的内容,这意味着其可用于多种用例:

  • 应用程序搜索
  • 网站搜索
  • 企业搜索
  • 日志处理和分析
  • 基础设施指标和容器监测
  • 应用程序性能监测
  • 地理空间数据分析和可视化
  • 安全分析
  • 业务分析 

Elasticsearch 的工作原理是什么?

  原始数据会从多个来源(包括日志、系统指标和网络应用程序)输入到 Elasticsearch 中。数据采集指在 Elasticsearch 中进行索引之前解析、标准化并充实这些原始数据的过程。这些数据在 Elasticsearch 中索引完成之后,用户便可针对他们的数据运行复杂的查询,并使用聚合来检索自身数据的复杂汇总。在 Kibana 中,用户可以基于自己的数据创建强大的可视化,分享仪表板,并对 Elastic Stack 进行管理。 

Elasticsearch 索引是什么?

  Elasticsearch 索引指相互关联的文档集合。Elasticsearch 会以 JSON 文档的形式存储数据。每个文档都会在一组(字段或属性的名称)和它们对应的值(字符串、数字、布尔值、日期、数值组、地理位置或其他类型的数据)之间建立联系。

  Elasticsearch 使用的是一种名为倒排索引的数据结构,这一结构的设计可以允许十分快速地进行全文本搜索。倒排索引会列出在所有文档中出现的每个特有词汇,并且可以找到包含每个词汇的全部文档。

  在索引过程中,Elasticsearch 会存储文档并构建倒排索引,这样用户便可以近实时地对文档数据进行搜索。索引过程是在索引 API 中启动的,通过此API 您既可向特定索引中添加 JSON 文档,也可更改特定索引中的 JSON 文档。

Kibana 的用途是什么?

  Kibana 是一款适用于 Elasticsearch 的数据可视化和管理工具,可以提供实时的直方图、线形图、饼状图和地图。Kibana 同时还包括诸如 Canvas 和Elastic Maps 等高级应用程序;Canvas 允许用户基于自身数据创建定制的动态信息图表,而 Elastic Maps 则可用来对地理空间数据进行可视化。

为何使用 Elasticsearch?

Elasticsearch 很快。 由于 Elasticsearch 是在 Lucene 基础上构建而成的,所以在全文本搜索方面表现十分出色。Elasticsearch 同时还是一个近实时的搜索平台,这意味着从文档索引操作到文档变为可搜索状态之间的延时很短,一般只有一秒。因此,Elasticsearch 非常适用于对时间有严苛要求的用例,例如安全分析和基础设施监测。

Elasticsearch 具有分布式的本质特征。 Elasticsearch 中存储的文档分布在不同的容器中,这些容器称为分片,可以进行复制以提供数据冗余副本,以防发生硬件故障。Elasticsearch 的分布式特性使得它可以扩展至数百台(甚至数千台)服务器,并处理 PB 量级的数据。

Elasticsearch 包含一系列广泛的功能。 除了速度、可扩展性和弹性等优势以外,Elasticsearch 还有大量强大的内置功能(例如数据汇总和索引生命周期管理),可以方便用户更加高效地存储和搜索数据。

Elastic Stack 简化了数据采集、可视化和报告过程。 通过与 Beats 和 Logstash 进行集成,用户能够在向 Elasticsearch 中索引数据之前轻松地处理数据。同时,Kibana 不仅可针对 Elasticsearch 数据提供实时可视化,同时还提供 UI 以便用户快速访问应用程序性能监测 (APM)、日志和基础设施指标等数据。

 

Docker-compose搭建步骤

1.环境准备

  docker、docker-compose、lunux。版本问题应该不大,我用的是Docker version 18.09.0, build 4d60db4、docker-compose version 1.23.0-rc3, buildea3d406e、centos7.2。

      elasticsearch:7.2.0及kibana:7.2.0可以去官方镜像仓库拉取docker pull elasticsearch:7.2.0、docker pull  kibana:7.2.0,或者后续我会把离线的tar包上传到github上面,直接下载下来docker load --input xxx.tar到服务器即可。

       完成准备之后,docker images看一下,那两个镜像是否搞定了。

2.编写docker-compose文件,我这里命名es.yml

 

version: '3'
services:
  elasticsearch_n0:
    image: elasticsearch:7.2.0
    container_name: elasticsearch_n0
    privileged: true
    environment:
      - cluster.name=elasticsearch-cluster
      - node.name=node0
      - node.master=true
      - node.data=true
      - bootstrap.memory_lock=true
    - search.max_buckets=100000000
      - http.cors.enabled=true
      - http.cors.allow-origin=*
      - cluster.initial_master_nodes=node0
      - "ES_JAVA_OPTS=-Xms1024m -Xmx1024m"
      - "discovery.zen.ping.unicast.hosts=elasticsearch_n0,elasticsearch_n1,elasticsearch_n2"
    # 如果是拆分版,这里必须填写宿主机ip
      #- discovery.zen.ping.unicast.hosts=192.168.133.68,192.168.133.75,192.168.133.77
      - "discovery.zen.minimum_master_nodes=2"
      - discovery.zen.ping_timeout=120s
      - client.transport.ping_timeout=60s
      # 如果是拆分版,这条配置必须加上,指定当前节点访问的ip
      #- network.publish_host=192.168.133.68
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - /etc/localtime:/etc/localtime
      - /data/base/es/data/node0:/usr/share/elasticsearch/data
      - ./logs/node0:/usr/share/elasticsearch/logs
    ports:
      - 9200:9200
      - 9300:9300
    networks:
      - esnet
  elasticsearch_n1:
    image: elasticsearch:7.2.0
    container_name: elasticsearch_n1
    privileged: true
    environment:
      - cluster.name=elasticsearch-cluster
      - node.name=node1
      - node.master=true
      - node.data=true
      - bootstrap.memory_lock=true
      - search.max_buckets=100000000
      - http.cors.enabled=true
      - http.cors.allow-origin=*
      - cluster.initial_master_nodes=node0
      - "ES_JAVA_OPTS=-Xms1024m -Xmx1024m"
      - "discovery.zen.ping.unicast.hosts=elasticsearch_n0,elasticsearch_n1,elasticsearch_n2"
      # 如果是拆分版,这里必须填写宿主机ip
      #- discovery.zen.ping.unicast.hosts=192.168.133.68,192.168.133.75,192.168.133.77
      - "discovery.zen.minimum_master_nodes=2"
      - discovery.zen.ping_timeout=120s
      - client.transport.ping_timeout=60s
      # 如果是拆分版,这条配置必须加上,指定当前节点访问的ip
      #- network.publish_host=192.168.133.75
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - /etc/localtime:/etc/localtime
      - /data/base/es/data/node1:/usr/share/elasticsearch/data
      - ./logs/node1:/usr/share/elasticsearch/logs
    ports:
      - 9201:9200
      - 9301:9300
    networks:
      - esnet
  elasticsearch_n2:
    image: elasticsearch:7.2.0
    container_name: elasticsearch_n2
    privileged: true
    environment:
      - cluster.name=elasticsearch-cluster
      - node.name=node2
      - node.master=true
      - node.data=true
      - bootstrap.memory_lock=true
      - search.max_buckets=100000000
      - http.cors.enabled=true
      - http.cors.allow-origin=*
      - cluster.initial_master_nodes=node0
      - "ES_JAVA_OPTS=-Xms1024m -Xmx1024m"
      - "discovery.zen.ping.unicast.hosts=elasticsearch_n0,elasticsearch_n1,elasticsearch_n2"
      # 如果是拆分版,这里必须填写宿主机ip
#注:端口非9200的节点, ip后需加端口号, 因 es 默认识别端口是9200 #- discovery.zen.ping.unicast.hosts=192.168.133.68,192.168.133.75,192.168.133.77 - "discovery.zen.minimum_master_nodes=2" - discovery.zen.ping_timeout=120s - client.transport.ping_timeout=60s # 如果是拆分版,这条配置必须加上,指定当前节点访问的ip #- network.publish_host=192.168.133.77 ulimits: memlock: soft: -1 hard: -1 volumes: - /etc/localtime:/etc/localtime - /data/base/es/data/node2:/usr/share/elasticsearch/data - ./logs/node2:/usr/share/elasticsearch/logs ports: - 9202:9200 - 9302:9300 networks: - esnet kibana: image: kibana:7.2.0 container_name: kibana ports: - 5601:5601 volumes: - /etc/localtime:/etc/localtime -./kibana/kibana.yml:/usr/share/kibana/config/kibana.yml:rw depends_on: - elasticsearch_n0 networks: - esnet networks: esnet: external: true

 

a.集群名称,默认为elasticsearch:
cluster.name: elasticsearch
b.节点名称,es启动时会自动创建节点名称,但你也可进行配置:
node.name: “node0”
c.是否作为主节点,每个节点都可以被配置成为主节点,默认值为true:
node.master: true
d.是否存储数据,即存储索引片段,默认值为true:
node.data: true
master和data同时配置会产生一些奇异的效果:
1) 当master为false,而data为true时,会对该节点产生严重负荷;
2) 当master为true,而data为false时,该节点作为一个协调者;
3) 当master为false,data也为false时,该节点就变成了一个负载均衡器。
4) 当master为true,data也为true时,这种组合表示这个节点即有成为主节点的资格,又存储数据。

附上kibana.yml的配置

#
## ** THIS IS AN AUTO-GENERATED FILE **
##
#  
#  # Default Kibana configuration for docker target
server.name: kibana
server.host: "0"
#这里写你的es第一个node的地址
elasticsearch.hosts: [ "http://10.10.10.7:9200" ]
xpack.monitoring.ui.container.elasticsearch.enabled: true
i18n.locale: zh-CN

 

3.创建es的data目录以及log目录

 

   这里我建议最好手动创建es的data挂载目录以及log的挂载目录。为什么呢?因为一般来说,data目录是挂载在磁盘阵列后的一些独立的硬盘里面,跟系统盘是分开的。一般是以root的用户创建的,普通用户一般不具备读写权限。直接执行docker-compose up -d ,会自动创建挂载目录,但是,可能不具备读写权限,这个时候,es是起不来的,不信你到时候看看日志就知道了,会报你没有权限操作某个某个文件夹。

  所以确保万无一失,最好把所有挂载的目录,先提前创建好,然后附上读写权限。

 

4.修改sysctl.conf配置(非常重要)

  有些朋友可能会漏掉这一步,发现搭建ES起来之后,查看ES日志,会发现仍然有报错。Ubuntu elasticsearch max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] ,问题翻译过来就是:elasticsearch用户拥有的内存权限太小,至少需要262144

  很显然,就是漏掉了配置sysctl.conf的 vm.max_map_count。这什么玩意?这是限制一个进程可以拥有的VMA(虚拟内存区域)的数量。具体还有什么深层次的解释或者啥用处,就另行百度了。废话不多说了,配置也很简单

1、切换到root用户修改配置sysctl.conf

vi /etc/sysctl.conf

2、添加下面配置:

vm.max_map_count=655360

3、并执行命令:

sysctl -p

5.运行es以及kibana

好了,准备工作都完全搞定了。就跑起来了

执行命令 docker-compose -f es.yml up -d

 

 检查一下状态,是否都起来了呢

看起来没什么问题,也可以用docker ps看状态,只是我服务器容器太多了,docker ps不太好看,见仁见智。

分别用docker logs -f elasticsearch_n* 看一下各个容器日志,发现没什么问题。说明ES搭建已经完成了。

这里说一下kibana,因为刚启动容器组的时候,kibana没有那么快监听到es集群,等个一两分钟这样再打开kibana页面就可以了。

 

 

 

  大概是这个样子,页面做得好像蛮好看的呢。这个就是es的一个监控平台以及客户端工具。可以理解成Mysql的sqlyong或者navicate。这个东西怎么用,到时候我会出一篇教程。

温馨提示一下: 这是单机版的,拆分版的你们可以参照docker-compose上面的配置,自己知道怎么拆分了吧,多的不说了

  OK,Docker-compose搭建Elasticsearch集群及Kibana就这么简单,大功告成,接下来干嘛?肯定是使用啊,网上有各种springboot整合es的教程,或者到时候我会出一片springboot整合es的博客,网上推荐,es7.0以后,不要再用springboot-data-elasticsearch方式了,而是用springboot整合“elasticsearch-rest-high-level-client”这个工具去访问es,我呢,在项目上也是这么做的。然后git上面有很多牛人,专门转对“elasticsearch-rest-high-level-client”这个工具做了一层自己的封装,也就是自己造轮子。这里推荐一下,这个链接https://gitee.com/zxporz/ESClientRHL/tree/es7。我就是把这位热心博主的自制插件"EsClientRHL"拿过来,然后改了一下里面的源码,或者加一些这个插件本身没有功能,就加以使用了。后续我会在springboot整合es的博客里面演示怎么进行增删改查(查涉及到一下复杂的条件检索)、聚合统计、多桶聚合等操作。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM