登录
首页 >  Golang >  Go问答

如何使用这种架构复制 Elastic Search 中的索引?

来源:stackoverflow

时间:2024-03-17 09:36:29 162浏览 收藏

为了解决将大量数据导入数据库并快速检索的问题,本文介绍了一个使用 Go 语言、AWS SQS、Elastic Search 和 REST API 的架构。然而,作者面临着如何替换现有数据以更新为新数据的挑战。本文提出了使用索引别名的方法,该方法涉及创建一个临时索引,然后将其替换为原始索引,从而实现无缝数据切换,同时最大限度地减少磁盘空间使用。

问题内容

我有一个场景,我必须从多个源导入数据(数百万条记录)并将其保存在数据库中。当用户尝试搜索与该数据相关的任何信息时,应该会在 2-3 秒内获得结果。

为此,我设计了一个架构,使用 golang 从多个源导入数据并将数据推送到 AWS SQS 中。我创建了一个 lambda 函数,当 AWS SQS 有一些数据时会触发该函数。然后,此 lambda 函数将数据推送到 AWS Elastic Search 中。我创建了一个 Rest API,用它向用户提供结果。

我每天早上都使用 CRON 来完成这项导入工作。现在我的问题是,如果有一批新数据到来,我想删除现有数据并用新数据替换所有数据。 我陷入了如何实现删除和添加新数据部分的困境。

我想到创建一个临时索引,然后用原始索引替换它。但问题是我不知道导入何时结束并可以进行此索引切换。


解决方案


您想要的概念是 index alias。基本工作流程是:

  1. 将今天的数据导入到带有 my-index-2019-09-16 的索引中(例如)。
  2. 确保导入完成且工作正常。
  3. 将别名指向新索引(这是索引之间的原子切换):

    POST /_aliases
    {
        "actions" : [
            { "remove" : { "index" : "my-index-2019-09-15", "alias" : "my-index" } },
            { "add" : { "index" : "my-index-2019-09-16", "alias" : "my-index" } }
        ]
    }
  4. 删除旧索引。

您将在导入过程中将磁盘空间增加一倍,但除此之外,这应该不会出现任何问题,并且只有在正确替换数据后才删除数据。

今天关于《如何使用这种架构复制 Elastic Search 中的索引?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>