【问题标题】:ElasticSearch - Reindexing your data with zero downtimeElasticSearch - 以零停机时间重新索引您的数据
【发布时间】:2015-04-08 07:53:51
【问题描述】:

https://www.elastic.co/blog/changing-mapping-with-zero-downtime/

我尝试使用本指南创建一个新索引并以零停机时间重新索引我的数据。

现在我有一个名为“photoshooter”的索引,我按照步骤进行操作

1) 使用新映射创建新索引“photoshooter_v1”...(完成)

2) 创建别名...

curl -XPOST localhost:9200/_aliases -d '

{
    "actions": [
        { "add": {
            "alias": "photoshooter",
            "index": "photoshooter_v1"
        }}
    ]
}

我得到了这个错误...

{
    "error": "InvalidAliasNameException[[photoshooter_v1] Invalid alias name [photoshooter], an index exists with the same name as the alias]",
    "status": 400
}

我觉得我在逻辑上失去了一些东西..

【问题讨论】:

  • 你做到了吗? ES 文档从未提到您尝试做的事情是不可能的,但他们的示例明确地将别名添加到多个索引作为单个操作的一部分。
  • 嘿,我没有正确阅读错误消息 :) 我理解它不会让您将相同的别名应用于超过 1 个索引。

标签: elasticsearch reindex


【解决方案1】:

假设你当前的索引被命名为“photoshooter”,如果我没猜错的话。

现在先为这个索引创建一个别名 - OK

     {
            "actions": [
                { "add": {
                    "alias": "photoshooter_docs",
                    "index": "photoshooter"
                }}
            ]
        }

测试它 - curl -XGET 'localhost:9200/photoshooter_docs/_search'

注意 - 现在您将使用“photoshooter_docs”作为索引名称来与实际上是“photoshooter”的索引进行交互。

现在我们使用您的新映射创建一个新索引,假设我们将其命名为“photoshooter_v2”,现在将您的“photoshooter”索引数据复制到新索引(photoshooter_v2)

一旦您复制了所有数据,现在只需 从以前的索引中删除别名到新索引 -

      curl -XPOST localhost:9200/_aliases -d '
        {
            "actions": [
                { "remove": {
                    "alias": "photoshooter_docs",
                    "index": "photoshooter"
                }},
                { "add": {
                    "alias": "photoshooter_docs",
                    "index": "photoshooter_v2"
                }}
            ]
        }

再次测试 -> curl -XGET 'localhost:9200/photoshooter_docs/_search'

恭喜您在零停机的情况下更改了映射。

要复制数据,您可以使用这样的工具

    https://github.com/mallocator/Elasticsearch-Exporter 

注意 - 此工具还将映射从旧索引复制到新索引,您可能不想这样做。以便您阅读其文档或根据您的使用进行编辑。

谢谢

希望对你有帮助

【讨论】:

  • 如何将旧索引中的数据复制到新索引中。我应该从我的应用中更改索引名称吗?
  • 要将数据从一个索引复制到另一个索引,您可以使用像这样的工具github.com/mallocator/Elasticsearch-Exporter 还有许多其他可用的工具,您可以使用任何一个。只需阅读该工具的文档并根据您的项目需要运行它。
  • 复制数据 elasticsearch 有一个带有基本 _reindex 的选项。没试过。 elastic.co/guide/en/elasticsearch/reference/7.3/…
【解决方案2】:

这很简单,您不能使用已存在的索引名称创建别名。

您需要为新索引考虑一个新名称,重新索引新索引中的数据,然后删除旧索引以便能够为其赋予相同的名称。

如果您想每天都这样做,您可以考虑在索引名称中添加日期并每天切换。

【讨论】:

  • 如果我删除旧的,我会丢失所有数据!!我想要零停机时间...如果在将我的数据复制到新索引时将新数据追加或更改到我的索引..这将是一个问题
  • 您必须重新索引新索引中的数据,然后删除旧索引。没有其他办法。
  • 这是方式...elastic.co/guide/en/elasticsearch/guide/master/… 但我错过了一些东西...“首先,创建索引 my_index_v1,并设置别名 my_index 指向它:”但是当我尝试这个时......我得到这个错误...... {“错误”:“InvalidAliasNameException [[photoshooter_v1]无效的别名[photoshooter],存在与别名同名的索引]”,“状态”:400 }
  • 因为您正在创建一个与现有索引同名的别名!正如我已经回答的那样。您可以尝试使用 cat API 使用您拥有的索引表以及别名来更新您的问题吗
猜你喜欢
  • 1970-01-01
  • 2017-12-22
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
  • 2017-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多