【发布时间】:2017-10-19 13:29:41
【问题描述】:
我正在开发一个 java 应用程序来创建一个 elasticSearch 索引。该索引目前每周在开发机器上构建,并且集群手动复制到其他(测试和生产)机器上的现有集群。新方案仍涉及每周从头开始重建索引。
我正在使用 5.6.3 和低级和高级别的客户端进行更新。经过一些初步调查(并获得了相当多的帮助),我的目标是使用别名进行 2(或 3)阶段开发。
最初,我将在 dev 上为现有索引设置别名,将所有新数据写入别名,然后用别名替换索引。我能想到的其他替代方案是
每次都重新创建集群,我认为这总是 一个相当手动的过程,或
重新创建索引并移动它们。由于索引无法重命名 (或者我相信,这总是会更加笨拙,因为它涉及在一台机器上创建索引,从活动机器中删除它们然后读取它们。目前我们在集群中有一个节点,所以这将 涉及相当长的停机时间(尽管如果别名变成 作为一个糟糕的解决方案,我想我们可以添加另一个节点并一次替换一个节点的索引)。
所以我选择了
- 使用别名。这样,我可以从重新创建索引并将其复制过来(阶段 1)开始,然后转向更复杂的解决方案,以编程方式恢复数据并且不会降低弹性搜索(阶段 3 是我们的梦想,如果我们曾经更新索引让我们的数据正确排序!)
所以问题来了。我真的很想直接创建索引的空别名。据我所知,这是不可能的。在其他页面中,github issue. 虽然来自较旧版本,但看起来像这样的举动会适得其反,并且不是弹性想要引入的东西。所以我只是想知道如果
- 我完全看错了设计,或者
- 现在有一种方法可以创建空别名或
- 我是否应该创建一个别名,然后从别名中创建delete all documents?
【问题讨论】:
-
我不确定空别名会给你带来什么。您始终可以使用单个别名。 Live 应用程序将指向别名。加载过程将创建一个新索引,然后您可以将别名从旧索引切换到新索引。单独删除所有文档不是一个好主意。相反,您可以删除索引。此外,您还可以探索 Elasticsearch Curator 以获取索引的快照/恢复。
-
好吧,我想我误解了。我认为别名是索引元数据的一部分,因此您不能将别名与另一个索引交换。我正在考虑将应用程序指向索引并创建临时别名以重建索引,然后将别名换回。实际上,别名可以指向不同的索引,因此相反并设置应用程序更有意义查看别名 ([appind]),然后将其指向索引 - 每周更改 - 称为 appind [ddmmyyyyhhmm]。 (这样对吗!?)
-
正确。应用程序无需担心数据是来自 19 日还是 20 日。它只会指向别名appind。数据恢复/加载完成后,您可以将别名与单个帖子交换。您可以在同一请求中执行删除操作和添加操作,以将别名从旧索引交换到新索引。
标签: elasticsearch elasticsearch-5