5

https://www.elastic.co/blog/changeing-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
}

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

4

2 回答 2

8

如果我猜对了,假设您当前的索引被命名为“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 

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

谢谢

希望这可以帮助

于 2015-04-08T09:17:42.720 回答
1

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

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

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

于 2015-04-08T09:26:02.910 回答