Elasticsearch docker-compose 使用 Logstash 从 JSON 文件中预加载数据

在我们创建 Elasticsearch 进行开发时,最简单的办法就是在本地使用 docker-compose 来一键部署一个 Elasticsearch 集群。有时,特别是在准备测试环境时,开发人员希望从一开始就创建包含一些测试数据的数据库容器。我们可以使用 Logstash 来很方便地把数据写入到 Elasticsearch 中。

在我之前的文章 "Elasticsearch:使用 Docker-Compose 启动单节点 Elastic Stack",我有讲到这个方法。在今天的文章中,我们通过另外一种方法来实现。你可以在地址 github.com/liu-xiao-gu... 下载所有的代码。

首先,我们项目的根目录下创建一个 .env 的文件。

.env

ini 复制代码
1.  ELASTIC_PASSWORD=DEFAULT
2.  STACK_VERSION=7.17.14
3.  ES_PORT=9203

接下来创建 docker-compose.yaml 配置文件:

docker-compose.yaml

ini 复制代码
1.  version: "2.2"
2.  services:
3.    es01:
4.      image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
5.      ports:
6.        - ${ES_PORT}:9200
7.      environment:
8.        - node.name=es01
9.        - cluster.initial_master_nodes=es01
10.        - ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
11.        - bootstrap.memory_lock=true
12.        - xpack.security.enabled=true
13.      healthcheck:
14.        test:
15.          [
16.            "CMD-SHELL",
17.            "curl -s -k http://localhost:9200",
18.          ]
19.        interval: 10s
20.        timeout: 10s
21.        retries: 120
22.    logstash:
23.      build:
24.        context: logstash/
25.        dockerfile: Dockerfile
26.      depends_on:
27.        es01:
28.          condition: service_healthy
29.      environment:
30.        - ELASTICSEARCH_URL=http://es01:9200
31.        - ELASTICSEARCH_USERNAME=elastic
32.        - ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
33.        - XPACK_MONITORING_ENABLED=false

有几点需要注意:

  • 使用 xpack.security.enabled 为 Elasticsearch 启用用户名/密码身份验证。 如果不需要,请将其删除,以便默认值为 false。
  • 健康检查只是为了得到 9200 端口的响应
  • Logstash 将从 Docker 文件构建

Logstash 的 Dockerfile:

logstash/Dockerfile

bash 复制代码
1.  FROM docker.elastic.co/logstash/logstash:7.17.14

3.  COPY importData.conf /usr/share/logstash/pipeline
4.  RUN mkdir /usr/share/logstash/data-test/
5.  COPY testdata.json /usr/share/logstash/data-test/
6.  COPY --chmod=0755 progress.sh /tmp
7.  #Install exec plugin to run shell script in Logstash pipeline
8.  RUN bin/logstash-plugin install logstash-output-exec

10.  ENTRYPOINT ["/usr/local/bin/docker-entrypoint"]

JSON 数据文件应将每个文档包含为一行,如下所示:

perl 复制代码
1.  {"name": "Bobbie", "emailaddress": "Bob@mail2u.org", "address": "1186 Neil Court", "country": "UK", "birthdate": "1995-10-15T01:00:00Z",}
2.  {"name": "Helen", "emailaddress": "Hele@mail.ru", "address": "839 Federal Ridge", "country": "Hungary", "birthdate": "1985-11-03T01:00:00Z"}

要在 Logstash 中运行的管道配置文件应定义输入文件(我们的 JSON 数据测试文件)和输出(插入 Elasticsearch 并运行自定义脚本):

ini 复制代码
1.  input {
2.    file {
3.      path => "/usr/share/logstash/data-test/testdata.json"
4.      mode => "read"
5.      codec => json { }
6.      exit_after_read => true
7.      type => "sample"
8.    }
9.  }
10.  filter {
11.    mutate {
12.      remove_field => [ "log", "@timestamp", "event", "@version" ]
13.    }
14.  }
15.  output {
16.      elasticsearch {
17.          hosts => "${ELASTICSEARCH_URL}"
18.          index => "test_data"
19.          user => "elastic"
20.          password => "${ELASTIC_PASSWORD}"
21.          ssl_certificate_verification => false
22.      }
23.      exec {
24.        command => "/tmp/progress.sh"
25.      }
26.  }

Logstash 旨在成为一种监听连续输入流的服务。 通常停止它是没有意义的,因为新数据无论何时到来都应该通过管道进行处理。 然而在这种情况下,我只想 Logstash 导入我的测试数据,然后停止释放资源。

这是我在导入数据后终止 Logstash 容器的一种 hack:

bash 复制代码
1.  #!/bin/bash

3.  CHECK="$ELASTICSEARCH_URL/test_data/_count"
4.  #Expected data test size is 10 documents
5.  CONDITION="\"count\":10"

7.  while [ true ]
8.  do  
9.     if curl -u $ELASTICSEARCH_USERNAME:$ELASTIC_PASSWORD $CHECK | grep -q "$CONDITION"; then
10.          #Kill Logstash service so container would stop
11.          kill $(ps aux | grep 'logstash' | awk '{print $2}')
12.          break
13.     else
14.          echo "Counting documents from Elasticsearch does not return the expected number. Retrying"
15.          sleep 2
16.     fi 
17.  done

现在只需 docker-compose up -d ,大约 2 分钟后,Elasticsearch 就会启动并创建索引,其中包含一些文档。

相关推荐
LI JS@你猜啊16 分钟前
Elasticsearch 集群
大数据·服务器·elasticsearch
神奇侠20244 小时前
解决集群Elasticsearch 未授权访问漏洞
elasticsearch
Elastic 中国社区官方博客4 小时前
如何通过 Kafka 将数据导入 Elasticsearch
大数据·数据库·分布式·elasticsearch·搜索引擎·kafka·全文检索
神奇侠20244 小时前
解决单台Elasticsearch 未授权访问漏洞
elasticsearch
nece0014 小时前
elasticsearch 杂记
大数据·elasticsearch·搜索引擎
开心最重要(*^▽^*)4 小时前
Es搭建——单节点——Linux
大数据·elasticsearch
喝醉酒的小白7 小时前
ElasticSearch 的核心功能
大数据·elasticsearch·jenkins
forestsea12 小时前
【Elasticsearch】分片与副本机制:优化数据存储与查询性能
大数据·elasticsearch·搜索引擎
运维&陈同学13 小时前
【Beats01】企业级日志分析系统ELK之Metricbeat与Heartbeat 监控
运维·elk·elasticsearch·云原生·kibana·heartbeat·metricbeat
INFINI Labs13 小时前
Elasticsearch filter context 的使用原理
大数据·elasticsearch·jenkins·filter·querycache