如何重命名群集中的索引?

我需要重命名群集中的多个索引(它们的名称必须更改,我不能使用别名 )。

我看到有没有支持的方式来做到这一点,我发现最接近的是重命名索引的目录 ,我试图在一个集群中。

群集有3台机器ABC ,分别在其上复制碎片。 我closures了AA /var/lib/elasticsearch/security/nodes/0/indices/oldindexname/var/lib/elasticsearch/security/nodes/0/indices/newindexname /var/lib/elasticsearch/security/nodes/0/indices/oldindexname重命名为/var/lib/elasticsearch/security/nodes/0/indices/oldindexname /var/lib/elasticsearch/security/nodes/0/indices/newindexname并重新启动。

集群的状态是黄色的,弹性search正在做一些魔术来恢复正确的状态。 过了一段时间,我结束了

  • oldindexname可用并完全复制(从BC恢复,我猜)
  • newindexname可用(我可以search它),但头插件显示它的碎片处于“未分配”状态,并且它们变灰(不复制)

在恢复期间, 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是可search的,但肯定不是正常状态。

我通过删除newindexname回滚到以前的状态。 群集恢复为绿色,没有任何“未分配”条目。

鉴于此,我如何将oldindexname重命名为集群中的newindexname

注意:我想到的最终解决scheme是将oldindex滚动复制到newindex然后删除oldindex 。 这将需要时间,所以如果有更直接的解决scheme,这将是伟大的。

你可以使用REINDEX来做到这一点。

重build索引不会尝试设置目标索引。 它不会复制源索引的设置。 您应该在运行_reindex操作之前设置目标索引 ,包括设置映射,碎片计数,副本等。

  1. 首先复制索引到一个新的名字
 POST /_reindex { "source": { "index": "twitter" }, "dest": { "index": "new_twitter" } } 
  1. 现在删除索引
 DELETE /twitter 

要重命名索引,可以使用Elasticsearch Snapshot模块。

首先,您必须对索引进行快照。在恢复索引时,您可以重命名索引。

  POST /_snapshot/my_backup/snapshot_1/_restore { "indices": "jal", "ignore_unavailable": "true", "include_global_state": false, "rename_pattern": "jal", "rename_replacement": "jal1" } 

rename_replacement: – 要在其中备份数据的新索引名称。

重命名或更改索引映射的最佳方法是使用logstash重新索引。 以下是logstash 2.1configuration的示例:

 input { elasticsearch { hosts => ["es01.example.com", "es02.example.com"] index => "old-index-name" size => 500 scroll => "5m" } } filter { mutate { remove_field => [ "@version" ] } date { "match" => [ "custom_timestamp", "MM/dd/YYYY HH:mm:ss" ] target => "@timestamp" } } output { elasticsearch { hosts => ["es01.example.com", "es02.example.com" ] manage_template => false index => "new-index-name" } } 

因此,在ES中没有直接的方法来复制或重命名索引(我为自己的项目进行了广泛的search)

然而,一个非常简单的select是使用stream行的迁移工具[Elastic-Exporter]。

http://www.retailmenot.com/corp/eng/posts/2014/12/02/elasticsearch-cluster-migration/

[PS:这不是我的博客,只是偶然发现而已]

从而可以复制索引/types,然后删除旧的。

正如Elasticsearch快照模块参考所示,

rename_pattern和rename_replacement选项也可用于使用正则expression式对还原时的索引进行重命名

如果您不能REINDEX 解决方法是使用别名 。 从官方文档:

elasticsearch中的API在针对特定索引进行操作时接受索引名称,并在适用时接受多个索引。 索引别名API允许使用名称对索引进行别名,所有API都会自动将别名转换为实际的索引名称。 别名还可以映射到多个索引,并且在指定别名时,别名将自动扩展到别名索引。 一个别名还可以与一个filter相关联,这个filter在search和路由值时会自动应用。 别名不能与索引具有相同的名称。

请注意,如果您使用“更喜欢此function”,则此解决scheme不起作用。 https://github.com/elastic/elasticsearch/issues/16560

以防万一有人仍然需要它。 重命名索引的成功而非官方的方式是:

  1. closures需要重命名的索引
  2. 在主节点和数据节点的所有数据目录中重命名索引文件夹。
  3. 重新打开旧的封闭索引(我使用kofp插件)。 旧索引将重新打开,但保持未分配状态。 新的索引将出现在closures状态
  4. 重新打开新的索引
  5. 删除旧的索引

如果遇到此错误“dangled index directory name is”,请删除所有主节点(不是数据节点)中的索引文件夹,然后重新启动其中一个数据节点。