• 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

    1. ELASTIC_PASSWORD=DEFAULT
    2. STACK_VERSION=7.17.14
    3. ES_PORT=9203

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

    docker-compose.yaml

    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

    1. FROM docker.elastic.co/logstash/logstash:7.17.14
    2. COPY importData.conf /usr/share/logstash/pipeline
    3. RUN mkdir /usr/share/logstash/data-test/
    4. COPY testdata.json /usr/share/logstash/data-test/
    5. COPY --chmod=0755 progress.sh /tmp
    6. #Install exec plugin to run shell script in Logstash pipeline
    7. RUN bin/logstash-plugin install logstash-output-exec
    8. ENTRYPOINT ["/usr/local/bin/docker-entrypoint"]

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

    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 并运行自定义脚本):

    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:

    1. #!/bin/bash
    2. CHECK="$ELASTICSEARCH_URL/test_data/_count"
    3. #Expected data test size is 10 documents
    4. CONDITION="\"count\":10"
    5. while [ true ]
    6. do
    7. if curl -u $ELASTICSEARCH_USERNAME:$ELASTIC_PASSWORD $CHECK | grep -q "$CONDITION"; then
    8. #Kill Logstash service so container would stop
    9. kill $(ps aux | grep 'logstash' | awk '{print $2}')
    10. break
    11. else
    12. echo "Counting documents from Elasticsearch does not return the expected number. Retrying"
    13. sleep 2
    14. fi
    15. done

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

  • 相关阅读:
    计算机网络实验:路由器交换机与其基本配置操作、常见命令
    4.k8s:cronJob计划任务,初始化容器,污点、容忍,亲和力,身份认证和权限
    433. 最小基因变化
    web3.0链游农民世界开发搭建0撸狼人杀玩法模式定制开发
    【数据结构】栈
    大二Web课程设计——家乡主题网页设计(web前端网页制作课作业) 四川旅游网页设计制作
    学习笔记——《LINUX设备驱动程序(第三版)》Linux设备模型:内核添加、删除设备、驱动程序
    Unity-协同程序
    转行网络安全是否可行?
    动作捕捉系统用于柔性机械臂的末端定位控制
  • 原文地址:https://blog.csdn.net/UbuntuTouch/article/details/134369032