武穴建设网站,wordpress 发邮件,wordpress 服务器权限,wordpress 后台登录作者#xff1a;David Pilato 我最近在讨论论坛上收到一个问题#xff0c;关于如何修改官方 Docker 镜像以提供一个现成的 Elasticsearch 集群#xff0c;其中已经包含一些数据。
说实话#xff0c;我不喜欢这个想法#xff0c;因为你必须通过提 entrypoint.sh 的分叉版本…作者David Pilato 我最近在讨论论坛上收到一个问题关于如何修改官方 Docker 镜像以提供一个现成的 Elasticsearch 集群其中已经包含一些数据。
说实话我不喜欢这个想法因为你必须通过提 entrypoint.sh 的分叉版本来破解 Elasticsearch 服务的启动方式。 这将使你的维护和升级变得更加困难。
相反我发现使用其他解决方案来实现相同的目标会更好。 设置问题
首先我们将考虑使用 Elasticsearch Docker 镜像并遵循文档
docker pull docker.elastic.co/elasticsearch/elasticsearch:8.7.0
docker network create elastic
docker run --name es01 --net elastic -p 9200:9200 -it docker.elastic.co/elasticsearch/elasticsearch:8.7.0 请注意我们没有在此处挂载 data 目录因此该集群的数据将是短暂的并且一旦节点关闭就会消失。 启动后我们可以使用生成的密码检查它是否运行良好 curl -s -k -u elastic:CHANGEME https://localhost:9200 | jq
请使用在安装时候显示的 Elasticsearch 密码来替换上面的 CHANGEME。上面的命令给出
{name: 697bf734a5d5,cluster_name: docker-cluster,cluster_uuid: cMISiT__RSWkoKDYql1g4g,version: {number: 8.7.0,build_flavor: default,build_type: docker,build_hash: 09520b59b6bc1057340b55750186466ea715e30e,build_date: 2023-03-27T16:31:09.816451435Z,build_snapshot: false,lucene_version: 9.5.0,minimum_wire_compatibility_version: 7.17.0,minimum_index_compatibility_version: 7.0.0},tagline: You Know, for Search
}
因此我们希望有一个可用的数据集。 让我们采用我在演示 Elasticsearch 时经常使用的示例数据集人员数据集。 我创建了[一个生成器](https://github.com/dadoonet/injector) 来创建一些假数据。
首先让我们下载注入器
wget https://repo1.maven.org/maven2/fr/pilato/elasticsearch/injector/injector/8.7/injector-8.7.jar
然后我们将使用以下选项在磁盘上生成数据集
mkdir data
java -jar injector-8.7.jar --console --silent data/persons.json
我们有 1000000 个 json 文档数据集如下所示
head -2 data/persons.json{name:Charlene Mickael,dateofbirth:2000-11-01,gender:female,children:3,marketing:{cars:1236,shoes:null,toys:null,fashion:null,music:null,garden:null,electronic:null,hifi:1775,food:null},address:{country:Italy,zipcode:80100,city:Ischia,countrycode:IT,location:{lon:13.935138341699972,lat:40.71842684204817}}}
{name:Kim Hania,dateofbirth:1998-05-18,gender:male,children:4,marketing:{cars:null,shoes:null,toys:132,fashion:null,music:null,garden:null,electronic:null,hifi:null,food:null},address:{country:Germany,zipcode:9998,city:Berlin,countrycode:DE,location:{lon:13.164834451298645,lat:52.604673827377155}}} 使用 shell 脚本
我们这里有 100 万个文档因此我们无法真正使用批量请求来发送它。 我们需要
分成 10000 个或更少的索引操作对于每个文档添加缺少的 bulk 标题使用 _bulk API 发送文档 我最终编写了这个脚本它要求你安装了 curl 和 jq
#!/bin/bash
ELASTIC_PASSWORDCHANGEME
mkdir tmp
echo Split the source in 10000 items
split -d -l10000 ../data/persons.json tmp/part
BULK_REQUEST_FILEtmp/bulk_request.ndjson
FILEStmp/part*
for f in $FILES
dorm $BULK_REQUEST_FILEecho Preparing $f file...while read p; doecho -e {index:{}} $BULK_REQUEST_FILEecho -e $p $BULK_REQUEST_FILEdone $fecho Calling Elasticsearch Bulk APIcurl -XPOST -s -k -u elastic:$ELASTIC_PASSWORD https://localhost:9200/person/_bulk -H Content-Type: application/json --data-binary $BULK_REQUEST_FILE | jq Bulk executed in \(.took) ms with errors\(.errors)
done
有关脚本输入文档的方法你也可以参考文章 “Elasticsearch如何使用 shell 脚本来写入数据到 Elasticsearch 中”。
这基本上打印
Preparing tmp/part00 file...
Calling Elasticsearch Bulk API
Bulk executed in 1673 ms with errorsfalse
Preparing tmp/part01 file...
Calling Elasticsearch Bulk API
Bulk executed in 712 ms with errorsfalse
...
Preparing tmp/part99 file...
Calling Elasticsearch Bulk API
Bulk executed in 366 ms with errorsfalse
在我的机器上运行它需要 8 分钟多。 大部分时间都花在编写批量请求上。 可能还有很大的改进空间但我必须承认我不太擅长编写 shell 脚本。 哈 你已经猜到了吗 使用logstash
Logstash 可以完成与我们手动完成的类似工作但还提供更多功能例如错误处理、监控我们甚至不需要编写代码... 我们将在这里再次使用 Docker
docker pull docker.elastic.co/logstash/logstash:8.7.0
让我们为此编写一个作业
input {file {path /usr/share/logstash/persons/persons.jsonmode readcodec json { }exit_after_read true}
}filter {mutate {remove_field [ log, timestamp, event, version ]}
}output {elasticsearch {hosts ${ELASTICSEARCH_URL}index personuser elasticpassword ${ELASTIC_PASSWORD}ssl_certificate_verification false}
}
我们现在可以运行该作业
docker run --rm -it --name ls01 --net elastic \-v $(pwd)/../data/:/usr/share/logstash/persons/:ro \-v $(pwd)/pipeline/:/usr/share/logstash/pipeline/:ro \-e XPACK_MONITORING_ENABLEDfalse \-e ELASTICSEARCH_URLhttps://es01:9200 \-e ELASTIC_PASSWORDCHANGEME \docker.elastic.co/logstash/logstash:8.7.0
在我的机器上运行它只需要不到 2 分钟。 使用 docker 撰写
你可以更轻松地使用 docker compose 命令来根据需要运行所有内容并向用户公开一个可供使用的集群而不是手动运行所有这些内容。 这是一个简单的 .env 文件
ELASTIC_PASSWORDCHANGEME
STACK_VERSION8.7.0
ES_PORT9200
以及 docker-compose.yml
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_locktrueulimits:memlock:soft: -1hard: -1healthcheck:test:[CMD-SHELL,curl -s -k https://localhost:9200 | grep -q missing authentication credentials,]interval: 10stimeout: 10sretries: 120logstash:depends_on:es01:condition: service_healthyimage: docker.elastic.co/logstash/logstash:${STACK_VERSION}volumes:- type: bindsource: ../datatarget: /usr/share/logstash/personsread_only: true- type: bindsource: pipelinetarget: /usr/share/logstash/pipelineread_only: trueenvironment:- ELASTICSEARCH_URLhttps://es01:9200- ELASTIC_PASSWORD${ELASTIC_PASSWORD}- XPACK_MONITORING_ENABLEDfalse
我们仍然在 ../data 目录中保存有 person.json 文件。 它被安装为 /usr/share/logstash/persons/persons.json 就像在前面的示例中一样。 因此我们使用与之前相同的 pipeline/persons.conf 文件。 要运行它我们现在只需输入
docker compose up
并等待 with-compose-logstash-1 容器退出
with-compose-logstash-1 | [2023-04-21T15:17:55,335][INFO ][logstash.runner ] Logstash shut down.
with-compose-logstash-1 exited with code 0
这表明我们的服务现在已准备好运行并完全加载了我们的示例数据集。
有关这个部分的内容更多阅读请参考数据集成的强大联盟Elasticsearch、Kibana、Logstash、MySQL。 使用快照/恢复
你还可以使用创建快照 API 将 Elasticsearch 中的现有数据集备份到共享文件系统或 S3然后使用 Restore Restore API 将其恢复到新集群。 假设你已经注册了一个名为 example 的存储库。 你可以使用以下命令创建快照
# We force merge the segments first
POST /person/_forcemerge?max_num_segments1# Snapshot the data
PUT /_snapshot/sample/persons
{indices: person,include_global_state: false
}
因此无论何时启动新集群你都可以使用以下命令恢复快照
POST /_snapshot/sample/persons/_restore
你只需要小心使用此方法当你将其升级到新的主要版本时你拥有的快照仍然可以在集群中恢复。 例如如果你使用版本 6.3 创建了快照则无法在 8.2 中还原它。 有关更多详细信息请参阅快照索引兼容性。 但好消息 借助存档索引Elasticsearch 现在能够访问较旧的快照存储库返回到版本 5... 你只需要了解一些限制即可。 为了保证你的快照始终完全兼容你可能需要使用相同的脚本使用最新版本再次创建索引快照。 请注意在这种情况下Force Merger API 调用很重要因为它将使用最新的 Elasticsearch/Lucene 版本重写所有段。 使用已挂载的目录
还记得我们启动集群时的情况吗
docker run --name es01 --net elastic -p 9200:9200 -it docker.elastic.co/elasticsearch/elasticsearch:8.7.0
我们没有绑定挂载 data 和 config 目录。 但实际上我们可以这样做
docker run --name es01 --net elastic -p 9200:9200 -it -v persons-data:/usr/share/elasticsearch/data -v persons-config:/usr/share/elasticsearch/config docker.elastic.co/elasticsearch/elasticsearch:8.7.0
我们可以检查刚刚创建的 Docker volume
docker volume inspect persons-data persons-config
[{CreatedAt: 2023-05-09T10:20:14Z,Driver: local,Labels: null,Mountpoint: /var/lib/docker/volumes/persons-data/_data,Name: persons-data,Options: null,Scope: local},{CreatedAt: 2023-05-09T10:19:51Z,Driver: local,Labels: null,Mountpoint: /var/lib/docker/volumes/persons-config/_data,Name: persons-config,Options: null,Scope: local}
]
如果你想使用完全相同的命令行再次启动 Elasticsearch 节点你可以稍后再次重用此挂载点。 如果需要与其他用户共享卷可以将 /var/lib/docker/volumes/persons-config/ 和 /var/lib/docker/volumes/persons-data/ 中的数据备份到 /tmp/volume-backup
然后你可以与其他用户共享 /tmp/volume-backup/persons.tgz 文件并让他们恢复它。
docker volume create persons-config
docker volume create persons-data
docker run --rm -it -v /tmp/volume-backup:/backup -v /var/lib/docker:/docker alpine:edge tar xfz /backup/persons.tgz -C /
并再次启动容器
docker run --name es01 --net elastic -p 9200:9200 -it -v persons-data:/usr/share/elasticsearch/data -v persons-config:/usr/share/elasticsearch/config docker.elastic.co/elasticsearch/elasticsearch:8.7.0 使用 Elastic Cloud
当然你可以使用之前创建的快照来配置新的 Elasticsearch Cloud 实例而不是自行启动和管理本地 Elasticsearch 实例。 以下代码假设你已经定义了 API key。
POST /api/v1/deployments?validate_onlyfalse
{resources: {elasticsearch: [{region: gcp-europe-west1,plan: {cluster_topology: [{zone_count: 2,elasticsearch: {node_attributes: {data: hot}},instance_configuration_id: gcp.es.datahot.n2.68x10x45,node_roles: [master,ingest,transform,data_hot,remote_cluster_client,data_content],id: hot_content,size: {resource: memory,value: 8192}}],elasticsearch: {version: 8.7.1},deployment_template: {id: gcp-storage-optimized-v5},transient: {restore_snapshot: {snapshot_name: __latest_success__,source_cluster_id: CLUSTER_ID}}},ref_id: main-elasticsearch}],kibana: [{elasticsearch_cluster_ref_id: main-elasticsearch,region: gcp-europe-west1,plan: {cluster_topology: [{instance_configuration_id: gcp.kibana.n2.68x32x45,zone_count: 1,size: {resource: memory,value: 1024}}],kibana: {version: 8.7.1}},ref_id: main-kibana}]},settings: {autoscaling_enabled: false},name: persons,metadata: {system_owned: false}
}
只需将 CLUSTER_ID 替换为从中获取快照的源集群即可。 集群启动后你就拥有了一个功能齐全的实例可以在互联网上使用你想要的默认数据集。 完成后你可以使用以下命令轻松关闭部署
POST /api/v1/deployments/DEPLOYMENT_ID/_shutdown
同样只需将 DEPLOYMENT_ID 替换为你在创建部署时看到的部署 ID。 结论
与往常一样对于 Elastic特别是 Elasticsearch你有多种方法可以实现你的目标。 我在这里列出了其中一些但可能还有其他一些方法
使用 Shell 脚本你实际上不需要任何第三方工具但这需要编写一些代码。 代码看起来很简单只要偶尔运行一下就可以了。 如果你需要它更安全例如具有捕获和重试功能那么这将使你创建和维护更多代码。使用 Logstash它非常灵活因为你还可以将数据发送到 Elasticsearch 之外的其他目的地或者使用多个过滤器来修改/丰富源数据集。 启动速度有点慢但出于测试目的这不应该成为真正的问题。使用 docker compose我最喜欢的方法之一。 你只需运行 docker compose up 等几分钟后就完成了。 但这可能需要时间和硬件资源。使用快照/恢复比以前的方法更快因为数据已经建立索引。 但灵活性较差因为快照需要与你要恢复到的集群兼容。 一般来说我总是更喜欢再次注入数据因为一切都是新鲜的并且我可以从 Elasticsearch 和 Lucene 的所有改进中受益。使用挂载目录类似于快照但更本地化。 老实说我更喜欢使用 Elastic API而不是手动挂载现有目录。 让 Elasticsearch 做它知道的事情让我感觉更安全。使用 Elastic Cloud我认为这是与其他人例如客户或内部测试人员共享数据集的最简单方法。 一切都已准备就绪安全可以通过适当的 SSL 证书使用。
根据你的品味和限制你可以选择其中一种想法并根据你的需求进行调整。 如果你有其他好主意要分享请在 Twitter 上告诉我们或讨论区。 许多很棒的想法/功能都来自社区。 分享你的 原文Preload Elasticsearch with your dataset | Elastic Blog