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

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

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

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

.env

复制代码
ELASTIC_PASSWORD=DEFAULT
STACK_VERSION=7.17.14
ES_PORT=9203

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

docker-compose.yaml

复制代码
version: "2.2"
services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
    ports:
      - ${ES_PORT}:9200
    environment:
      - node.name=es01
      - cluster.initial_master_nodes=es01
      - ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
      - bootstrap.memory_lock=true
      - xpack.security.enabled=true
    healthcheck:
      test:
        [
          "CMD-SHELL",
          "curl -s -k http://localhost:9200",
        ]
      interval: 10s
      timeout: 10s
      retries: 120
  logstash:
    build:
      context: logstash/
      dockerfile: Dockerfile
    depends_on:
      es01:
        condition: service_healthy
    environment:
      - ELASTICSEARCH_URL=http://es01:9200
      - ELASTICSEARCH_USERNAME=elastic
      - ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
      - XPACK_MONITORING_ENABLED=false

有几点需要注意:

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

Logstash 的 Dockerfile:

logstash/Dockerfile

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

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

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

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

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

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

复制代码
input {
  file {
    path => "/usr/share/logstash/data-test/testdata.json"
    mode => "read"
    codec => json { }
    exit_after_read => true
    type => "sample"
  }
}
filter {
  mutate {
    remove_field => [ "log", "@timestamp", "event", "@version" ]
  }
}
output {
    elasticsearch {
        hosts => "${ELASTICSEARCH_URL}"
        index => "test_data"
        user => "elastic"
        password => "${ELASTIC_PASSWORD}"
        ssl_certificate_verification => false
    }
    exec {
      command => "/tmp/progress.sh"
    }
}

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

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

复制代码
#!/bin/bash

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

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

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

相关推荐
问道飞鱼5 分钟前
【数据库知识】MySQL 多表关联高效实现指南:场景化方案与底层原理
数据库·mysql·多表关联
马克学长6 分钟前
SSM校园二手交易平台7fut7(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·校园闲置资源交易
dblens 数据库管理和开发工具13 分钟前
MySQL :5.7与8.0版创建用户与授权、密码认证插件、角色、密码过期策略
数据库·mysql·dblens·mysql创建用户·mysql设置密码·mysql用户授权
曹牧24 分钟前
Oracle:字段为值列表
数据库·oracle
Guheyunyi28 分钟前
安全风险监测预警系统如何重塑企业安全防线
大数据·人工智能·科技·安全·信息可视化
云境天合小科普29 分钟前
隧道洞外亮度检测仪:全天守护隧道入口安全
大数据
亮子AI31 分钟前
【Prisma】如何修复(重建)已经损坏的迁移历史?
数据库·prisma
GIS数据转换器35 分钟前
空天地一体化边坡监测及安全预警系统
大数据·人工智能·安全·机器学习·3d·无人机
+VX:Fegn089542 分钟前
计算机毕业设计|基于springboot + vue职位管理推荐系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
玄微云1 小时前
玄微科技:大健康数智化的 4 个 AI 智能体落地要点
大数据·人工智能·科技·软件需求·门店管理