AWS ElasticSearch 使用方案、主机和白名单从远程集群问题重新索引
Posted
技术标签:
【中文标题】AWS ElasticSearch 使用方案、主机和白名单从远程集群问题重新索引【英文标题】:AWS ElasticSearch reindex from remote cluster issue with scheme, host, and whitelist 【发布时间】:2020-08-11 12:50:39 【问题描述】:背景:
我们在同一个 AWS 中有两个版本为 6.8 的 AWS ElasticSearch 集群 帐号和地区。 我们需要将一个索引从集群 1(源)重新索引到集群 2(目标)。我尝试按照documentation of ES 中的描述使用 6.8 的重新索引 API
POST <https://endpoint of destination Elasticsearch>/_reindex
"source":
"remote":
"host": "https://endpoint-of-source-elasticsearch-cluster-1.es.amazonaws.com"
,
"index": "source-index-name"
,
"dest":
"index": "destination-index-name"
问题:
我遇到了错误
"error":
"root_cause": [
"type": "x_content_parse_exception",
"reason": "[8:3] [reindex] failed to parse field [source]"
],
"type": "x_content_parse_exception",
"reason": "[8:3] [reindex] failed to parse field [source]",
"caused_by":
"type": "illegal_argument_exception",
"reason": "[host] must be of the form [scheme]://[host]:[port](/[pathPrefix])? but was [https://endpoint-of-source-elasticsearch-cluster-1.es.amazonaws.com]",
"caused_by":
"type": "u_r_i_syntax_exception",
"reason": "The port was not defined in the [host]: https://endpoint-of-source-elasticsearch-cluster-1.es.amazonaws.com"
,
"status": 400
可能的原因:
-
根据文档,主机参数必须包含方案、主机、端口(例如 https://otherhost:9200)。
远程主机必须使用 reindex.remote.whitelist 属性在 elasticsearch.yaml 中明确列入白名单
由于我使用的是 AWS 集群,我不知道如何遵循主机、post 或如何将集群列入白名单的方案,因为我不知道如何在 AWS 集群上进行这些更改。
请求帮助,如果有任何可用的解决方法。谢谢,
【问题讨论】:
【参考方案1】:不幸的是,在 AWS 托管的 Elasticsearch 中,您将无法修改 reindex.remote.whitelist 参数等静态配置设置,因为配置 reindex.remote.whitelist 参数需要修改 elasticsearch.yml 文件。这是因为 AWS ES 托管服务,目前客户无法访问操作系统/文件系统。
作为替代方案,
您可以使用以前域的manual snapshot 并将其恢复为新域。与从远程重新索引相比,这种方法一次只影响一个域,即从中获取快照的域或将快照恢复到的域。
您还可以将 Logstash 与 Elasticsearch input 和 output 插件一起使用,以从原始域中的索引中读取数据并将其索引到任何其他/index domain。
【讨论】:
【参考方案2】:AWS Elasticsearch v7.9 现在支持远程重新索引,您只需发出重新索引命令,例如:
POST <local-domain-endpoint>/_reindex
"source":
"remote":
"host": "https://remote-domain-endpoint:443"
,
"index": "remote_index"
,
"dest":
"index": "local_index"
您必须在远程域端点的末尾添加 443 以进行验证检查。
验证索引是否复制到本地域:
GET <local-domain-endpoint>/local_index/_search
如果远程索引位于与本地域不同的区域,请传入其区域名称,例如在此示例请求中:
POST <local-domain-endpoint>/_reindex
"source":
"remote":
"host": "https://remote-domain-endpoint:443",
"region": "eu-west-1"
,
"index": "test_index"
,
"dest":
"index": "local_index"
注意: 1- 您必须在源地址中包含端口
2- 使用 AWS Elasticsearch,您不再需要像使用标准 Elasticsearch 那样将源 IP/地址列入白名单,AWS Elasticsearch 假定通过发出此命令源地址是可信的。
Elasticsearch AWS 文档在这里供参考: https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/remote-reindex.html
【讨论】:
你确定吗? "error":"root_cause":["type":"illegal_argument_exception","reason":"[xxxx.eu-west-1.es.amazonaws.com:443] 未在 reindex.remote.whitelist 中列入白名单"],"type":"illegal_argument_exception","reason":"[xxxx.eu-west-1.es.amazonaws.com:443] 未在 reindex.remote.whitelist 中列入白名单","status":400 您需要将集群升级到 v7.9 或更高版本 我尝试使用上述解决方案,但我得到了 null_pointer_exception 。有人可以帮忙详细说明吗?我的目标域具有基本身份验证(ELK 管理的用户名和密码)。我能够通过在邮递员中提供用户名和密码而不是重新索引查询来触发基本查询 @user1845926:我也得到了空指针......你的问题有没有解决?怎么样? @user1845926 您的集群在 VPC 中是私有的还是可公开访问的?【参考方案3】:从未设法将远程重新索引功能与 aws 一起使用,它只是不起作用。
好老的elasticdump 永远不会失败:
elasticdump \
--input=https://xxxx.eu-west-1.es.amazonaws.com:443/index-name \
--output=https://xxxx.eu-west-1.es.amazonaws.com:443/index-name \
--type=data \
--limit=500 \
--concurrency=5
不使用 sudo 安装:
# Install node without root
curl -s https://webinstall.dev/node | bash
# Install elasticdump
npm install elasticdump -g
【讨论】:
【参考方案4】:如果您从不是 OpenSearch 域本身的远程重新索引,请记住添加 "external": true
。
POST _reindex?pretty=true&scroll=30m&wait_for_completion=false
"source":
"remote":
"host": "http://x.x.x.x:9200",
"external": true
,
"index": "from_index",
"size": 1000
,
"dest":
"index": "to_index"
【讨论】:
以上是关于AWS ElasticSearch 使用方案、主机和白名单从远程集群问题重新索引的主要内容,如果未能解决你的问题,请参考以下文章
AWS:为什么Elasticache和RDS需要VPC,而Elasticsearch和DynamoDb则不需要
Elasticsearch 使用 AWS OpsWorks 配置堆大小