天元建设集团有限公司法定代表人,宁波专业seo团队,页面设计零基础,wordpress亲子模板下载在我们创建 Elasticsearch 进行开发时#xff0c;最简单的办法就是在本地使用 docker-compose 来一键部署一个 Elasticsearch 集群。有时#xff0c;特别是在准备测试环境时#xff0c;开发人员希望从一开始就创建包含一些测试数据的数据库容器。我们可以使用 Logstash 来很…在我们创建 Elasticsearch 进行开发时最简单的办法就是在本地使用 docker-compose 来一键部署一个 Elasticsearch 集群。有时特别是在准备测试环境时开发人员希望从一开始就创建包含一些测试数据的数据库容器。我们可以使用 Logstash 来很方便地把数据写入到 Elasticsearch 中。 在我之前的文章 “Elasticsearch使用 Docker-Compose 启动单节点 Elastic Stack”我有讲到这个方法。在今天的文章中我们通过另外一种方法来实现。你可以在地址 https://github.com/liu-xiao-guo/elasitcPreloadData 下载所有的代码。 首先我们项目的根目录下创建一个 .env 的文件。
.env
ELASTIC_PASSWORDDEFAULT
STACK_VERSION7.17.14
ES_PORT9203
接下来创建 docker-compose.yaml 配置文件
docker-compose.yaml
version: 2.2
services:es01:image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}ports:- ${ES_PORT}:9200environment:- node.namees01- cluster.initial_master_nodeses01- ELASTIC_PASSWORD${ELASTIC_PASSWORD}- bootstrap.memory_locktrue- xpack.security.enabledtruehealthcheck:test:[CMD-SHELL,curl -s -k http://localhost:9200,]interval: 10stimeout: 10sretries: 120logstash:build:context: logstash/dockerfile: Dockerfiledepends_on:es01:condition: service_healthyenvironment:- ELASTICSEARCH_URLhttp://es01:9200- ELASTICSEARCH_USERNAMEelastic- ELASTIC_PASSWORD${ELASTIC_PASSWORD}- XPACK_MONITORING_ENABLEDfalse
有几点需要注意
使用 xpack.security.enabled 为 Elasticsearch 启用用户名/密码身份验证。 如果不需要请将其删除以便默认值为 false。健康检查只是为了得到 9200 端口的响应Logstash 将从 Docker 文件构建
Logstash 的 Dockerfile
logstash/Dockerfile
FROM docker.elastic.co/logstash/logstash:7.17.14COPY importData.conf /usr/share/logstash/pipeline
RUN mkdir /usr/share/logstash/data-test/
COPY testdata.json /usr/share/logstash/data-test/
COPY --chmod0755 progress.sh /tmp
#Install exec plugin to run shell script in Logstash pipeline
RUN bin/logstash-plugin install logstash-output-execENTRYPOINT [/usr/local/bin/docker-entrypoint]
JSON 数据文件应将每个文档包含为一行如下所示
{name: Bobbie, emailaddress: Bobmail2u.org, address: 1186 Neil Court, country: UK, birthdate: 1995-10-15T01:00:00Z,}
{name: Helen, emailaddress: Helemail.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.jsonmode readcodec json { }exit_after_read truetype sample}
}
filter {mutate {remove_field [ log, timestamp, event, version ]}
}
output {elasticsearch {hosts ${ELASTICSEARCH_URL}index test_datauser elasticpassword ${ELASTIC_PASSWORD}ssl_certificate_verification false}exec {command /tmp/progress.sh}
}
Logstash 旨在成为一种监听连续输入流的服务。 通常停止它是没有意义的因为新数据无论何时到来都应该通过管道进行处理。 然而在这种情况下我只想 Logstash 导入我的测试数据然后停止释放资源。
这是我在导入数据后终止 Logstash 容器的一种 hack
#!/bin/bashCHECK$ELASTICSEARCH_URL/test_data/_count
#Expected data test size is 10 documents
CONDITION\count\:10while [ true ]
do if curl -u $ELASTICSEARCH_USERNAME:$ELASTIC_PASSWORD $CHECK | grep -q $CONDITION; then#Kill Logstash service so container would stopkill $(ps aux | grep logstash | awk {print $2})breakelseecho Counting documents from Elasticsearch does not return the expected number. Retryingsleep 2fi
done
现在只需 docker-compose up -d 大约 2 分钟后Elasticsearch 就会启动并创建索引其中包含一些文档。