ElasticSearch - 以零停机时间重新索引数据

时间:2015-04-08 07:53:51

标签: elasticsearch reindex

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
}

我想我失去了逻辑......

2 个答案:

答案 0 :(得分:4)

让我们说你的当前索引被命名为“photoshooter”,如果我猜对了。

现在首先为此索引创建别名 - 确定

     {
            "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 

注意 - 此工具还会复制从旧索引到新索引的映射,您可能不希望这样做。因此,您已阅读其文档或根据您的用途进行编辑。

由于

希望这有帮助

答案 1 :(得分:0)

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

您需要考虑新索引的新名称,重新索引新索引中的数据,然后删除旧名称,以便为其提供相同的名称。

如果您希望每天都这样做,您可以考虑将每个日期添加到索引的名称并每天切换它。