首页 文章

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

提问于
浏览
80

我需要重命名集群中的几个索引(它们的名称 must 被更改,我不能使用aliases) .

我看到没有支持的方法可以做到这一点,我找到的最接近的是rename the directory of the index,我在集群中尝试了这个 .

群集有3台机器 ABC ,并且每个机器都会复制分片 . 我关闭 A 上的elasticsearch,将 /var/lib/elasticsearch/security/nodes/0/indices/oldindexname 重命名为 /var/lib/elasticsearch/security/nodes/0/indices/newindexname 并重新启动 A .

集群的状态是黄色的,而elasticsearch正在为恢复正确的状态做一些魔术 . 过了一段时间,我结束了

  • oldindexname 可用并完全复制(从 BC 恢复)

  • newindexname 可用(我可以搜索它)但是头插件显示其分片处于"Unassigned"状态,并且它们显示为灰色(未复制)

在恢复期间 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 回滚到上一个状态 . 群集返回绿色,没有任何"Unassigned"条目 .

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

Note: 我想到的最终解决方案是将 oldindex 滚动复制到 newindex 并随后删除 oldindex . 这需要时间,所以如果有更直接的解决方案,那就太棒了 .

7 回答

  • 5

    因此,没有直接的方法来复制或重命名ES中的索引(我确实广泛搜索了我自己的项目)

    但是,一个非常简单的选择是使用流行的迁移工具[Elastic-Exporter] .

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

    [PS:这不是我的博客,只是偶然发现并发现它很好]

    因此,您可以复制索引/类型,然后删除旧的索引/类型 .

  • 115

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

    • 关闭需要重命名的索引

    • 重命名主节点和数据节点的所有数据目录中的索引文件夹 .

    • 重新打开旧的封闭索引(我使用kofp插件) . 旧索引将重新打开但保持未分配状态 . 新索引将以关闭状态显示

    • 重新打开新索引

    • 删除旧索引

    如果您碰巧收到此错误“悬挂的索引目录名称为”,请删除所有主节点(而非数据节点)中的索引文件夹,然后重新启动其中一个数据节点 .

  • -4

    您可以使用REINDEX来执行此操作 .

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

    • 首先将索引复制到新名称
    POST /_reindex
    {
      "source": {
        "index": "twitter"
      },
      "dest": {
        "index": "new_twitter"
      }
    }
    
    • 现在删除索引
    DELETE /twitter
    
  • 3

    如果你不能REINDEX workaround 是使用别名 . 来自official文档:

    elasticsearch中的API在针对特定索引时接受索引名称,并在适用时接受多个索引 . 索引别名API允许使用名称对索引进行别名,所有API都自动将别名转换为实际索引名称 . 别名也可以映射到多个索引,并且在指定别名时,别名将自动扩展到别名索引 . 别名还可以与过滤器关联,该过滤器将在搜索和路由值时自动应用 . 别名不能与索引同名 .

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

  • 5

    Elasticsearch reference for snapshot module所示,

    rename_pattern和rename_replacement选项也可用于使用正则表达式在还原时重命名索引

  • 29

    要重命名索引,可以使用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: - 要备份数据的新索引名称 .

  • 6

    另一种实现重命名或更改索引映射的不同方法是使用logstash重新索引 . 以下是logstash 2.1配置的示例:

    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"
     }
    }
    

相关问题