我在一台机器上从Elasticsearch导出,现在想将这些数据导入到另一台机器中,在那里我在docker上运行Elasticsearch。
这是 docker-compose 文件中与 Elasticsearch 相关的内容:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:5.5.0
environment:
- cluster.name=my-docker-cluster
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- xpack.security.enabled=false
- http.host=0.0.0.0
ulimits:
memlock:
soft: -1
hard: -1
nofile:
soft: 65536
hard: 65536
cap_add:
- IPC_LOCK
volumes:
- ./src/elastic:/home
ports:
- 9200
- 9300
networks:
- my_network
弹性搜索容器已启动并正在运行。但是,我不知道如何导入数据。
我找到了 Elasticsearch 容器的 IP(如下XXX.XX.XX.X
指定(并执行了以下命令:
curl -X PUT -H "Content-Type: application/json" -H "Cache-Control: no-cache" -d '{
"type": "fs",
"settings": {
"location": "/home/test/etk_backup/myproject_backup"
}
}' "http://XXX.XX.XX.X:9200/_snapshot/myproject_backup"
但是得到这个错误:
{">error":{"root_cause":[{"type":"repository_exception","reason":"[myproject_backup] 位置 [/home/test/etk_backup/myproject_backup] 与以下任何位置都不匹配 路径.repo 指定的位置,因为此设置为空"}]
我进入了 Elasticsearch 的容器,并在elasticsearch.yml
中手动指定了path.repo
,如下所示:
path-repo: ["/home/test/etk_backup/myproject_backup"]
但得到了同样的错误。如何解决此问题?
试试这个:
path.repo: ["/home/test/etk_backup/myproject_backup"]
提到一个方便的工具:我们一直在使用 Elasticdump 将数据从一个索引复制到另一个索引(通常让开发人员在本地索引中包含数据(。目前尚不清楚它是否仍在维护,但它仍然适用于 ES6.3
你会这样使用它:
$ npm install elasticdump -g
$ elasticdump --input=https://XXX.XX.XX.X:9200/<index> --output /tmp/es-mapping --type=mapping --headers='{"Content-Type": "application/json"}'
$ elasticdump --input=https://XXX.XX.XX.X:9200/<index> --output /tmp/es-data --type=data --headers='{"Content-Type": "application/json"}' [--searchBody '<some query to filter what's being copied>']
$ elasticdump --input /tmp/es-mapping --output https://YYY.YY.YY.Y:9200/<index> --type mapping
$ elasticdump --input /tmp/es-data --output https://YYY.YY.YY.Y:9200/<index> --type data
您可能不需要保存到文件的中间步骤,但我发现在进行本地试验并且在实验以破坏性方式失败时需要重新加载索引的情况下,这是一件好事。