我需要重命名集群中的几个索引(它们的名称必须更改,我不能使用aliases)。
我发现没有支持的方法来完成这一任务,我找到的最接近的方法是rename the directory of the index,我在集群中尝试了这一方法。
集群有3台机器A
、B
和C
,每个机器上都复制了碎片。我关闭了A
上的elasticsearch,将/var/lib/elasticsearch/security/nodes/0/indices/oldindexname
重命名为/var/lib/elasticsearch/security/nodes/0/indices/newindexname
,然后重新启动A
。
集群的状态是黄色的,而elasticsearch正在做一些神奇的事情来恢复正确的状态。
oldindexname
可用且完全复制(我猜是从B
和C
恢复的)newindexname
可用(我可以搜索它),但head插件显示其碎片处于“未分配”状态,并且它们是灰色的(未复制)
在恢复过程中,security.log
显示以下消息:
[2015-02-20 11:02:33,461][INFO ][gateway.local.state.meta ] [A.example.com] dangled index directory name is [newindexname], state name is [oldindexname], renaming to directory name
虽然newindexname
是可搜索的,但它肯定不是处于正常状态。
我通过删除newindexname
回滚到以前的状态。集群恢复为绿色,没有任何“未分配”条目。
既然如此,如何在集群中将oldindexname
重命名为newindexname
?
**注意:**我想到的最终解决方案是将oldindex
滚动复制到newindex
,然后删除oldindex
。这需要时间,所以如果有更直接的解决方案,那就太好了。
9条答案
按热度按时间11dmarpk1#
您可以使用REINDEX来完成此操作。
Reindex不会尝试设置目标索引。它不会复制源索引的设置。在运行a _reindex操作之前,应执行set up the destination index,包括设置Map、碎片计数、副本等。
1.首先将索引复制为新名称
1.现在删除索引
xeufq47z2#
从ElasticSearch 7.4开始,重命名索引的最佳方法是使用新引入的Clone Index API复制索引,然后使用Delete Index API删除原始索引。
克隆索引API相对于使用快照API或重新索引API的主要优点是速度,因为克隆索引API将段从源索引硬链接到目标索引,而无需重新处理其任何内容(显然,在支持硬链接的文件系统上;否则,文件将在文件系统级别复制,这仍然比其他方法更有效)。克隆索引还保证目标索引在每个点都与源索引相同(即,不需要手动复制设置和Map,这与重新索引方法相反),并且不需要配置本地快照目录。
***旁注:***尽管此过程比以前的解决方案快得多,但它仍然意味着停机时间。有真实的使用案例证明重命名索引是合理的(例如,作为剥离、收缩或备份工作流中的一个步骤),但重命名索引不应成为日常操作的一部分。如果您的工作流需要频繁重命名索引,则应考虑改用Indices Aliases。
以下是将索引
source_index
重命名为target_index
的完整操作序列示例。可以使用某些ElasticSearch特定控制台(如集成的in Kibana)执行此操作。有关此示例的替代版本,请参阅this gist,该版本使用curl
而不是ElasticSearch控制台。enyaitl33#
要重命名索引,您可以使用Elasticsearch快照模块。
首先,你必须采取快照您的索引。而恢复它,你可以重命名您的索引。
rename_replacement:-要在其中备份数据新索引名称。
pgx2nnw84#
如果无法REINDEX,解决方法是使用 aliases。从official文档:
请注意,如果您使用的是“更多类似内容”功能,则此解决方案不起作用。https://github.com/elastic/elasticsearch/issues/16560
vfhzx4xs5#
因此,在ES中没有复制或重命名索引的直接方法(我确实广泛地搜索了我自己的项目)
然而,一个非常简单的选择是使用流行的迁移工具[Elastic-Exporter]。
http://www.retailmenot.com/corp/eng/posts/2014/12/02/elasticsearch-cluster-migration/
[PS:这不是我的博客,只是偶然发现并发现它不错]
因此,您可以复制index/type,然后删除旧的。
vqlkdk9b6#
实现重命名或更改索引Map的另一种不同方法是使用logstash重新建立索引。下面是logstash 2.1配置的示例:
relj7zay7#
如快照模块的Elasticsearch参考中所示,
rename_pattern和rename_replacement选项也可用于在使用正则表达式恢复时重命名索引
bvjveswy8#
对于那些基于OpenSearch登陆这里的用户,以下是您的操作方法...
PUT /<source-index>/_block/write
DELETE <target-index>
(如果已存在)PUT /<source-index>/_clone/<target-index>
dvtswwa39#
以防万一有人仍然需要它。成功的(非官方的)重命名索引的方法是:
1.关闭需要重命名的索引
1.重命名主节点和数据节点的所有数据目录中的索引文件夹。
1.重新打开旧的关闭的索引(我使用kofp插件)。旧的索引将被重新打开,但保持未分配。新的索引将出现在关闭状态
1.重新打开新索引
1.删除旧索引
如果您碰巧得到这个错误“悬挂索引目录名称是”,删除所有主节点(不是数据节点)中的索引文件夹,并重新启动其中一个数据节点。