提问者:小点点

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


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

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

现在我有一个名为“照片射手”的索引,我按照步骤操作

1)使用新的映射创建新的索引photoshooter_v1…(完成)

2)创建别名…

curl-XPOSTlocalhost: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个答案

匿名用户

假设你当前的索引被命名为“照片射手”,如果我猜对了,好吧。

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

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

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

注意-现在你将使用'photoshooter_docs'作为索引名称来与你的索引进行交互,这实际上是'photoshot ter'OK。

现在我们用你的新映射创建一个新索引,假设我们把它命名为“photoshooter_v2”,现在把你的“照片射手”索引数据复制到新索引(photoshooter_v2)

复制所有数据后,现在只需将别名从以前的索引删除到新索引-

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

再次测试-

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

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

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

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

谢啦

希望这有帮助

匿名用户

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

您需要为新索引考虑一个新名称,在新索引中重新索引数据,然后删除旧索引以使其具有相同的名称。

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