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

时间:2015-02-20 10:32:22

标签: elasticsearch

我需要重命名群集中的多个索引(他们的名称必须才能更改,我不能使用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可用(我可以搜索)但是头插件显示其分片处于“未分配”状态,并且它们显示为灰色(未复制)

在恢复期间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。这需要时间,所以如果有更直接的解决方案,那就太棒了。

8 个答案:

答案 0 :(得分:135)

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

  

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

  1. 首先将索引复制到新名称
  2. convert backgroung.jpg -coalesce \
           -delete 1 \
           null:  \( img1.gif -coalesce -resize 322x360 \) \
           -gravity Center -geometry -14-34 -loop 0 -layers composite null: \( img2.gif -coalesce -resize 171x126 \) \
           -gravity Center -geometry -289-210 -loop 0 -layers composite null:  \
           -set -delay 20 -loop 0 -layers optimize resultImg.gif
    
    1. 现在删除索引
    2. POST /_reindex
      {
        "source": {
          "index": "twitter"
        },
        "dest": {
          "index": "new_twitter"
        }
      }
      

答案 1 :(得分:42)

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

答案 2 :(得分:6)

如果您无法REINDEX 解决方法,则使用别名。来自official文档:

elasticsearch中的

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

请注意,如果您使用“更多此功能”,此解决方案将无效。 https://github.com/elastic/elasticsearch/issues/16560

答案 3 :(得分:5)

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

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

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

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

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

答案 4 :(得分:5)

实现重命名或更改索引映射的另一种不同方法是使用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"
 }
}

答案 5 :(得分:3)

Elasticsearch reference for snapshot module所示,

  

rename_pattern和rename_replacement选项也可用于使用正则表达式重命名恢复时的索引

答案 6 :(得分:2)

从ElasticSearch 7.4开始,重命名索引的最佳方法是使用新引入的Clone Index API复制索引,然后使用Delete Index API删除原始索引。

出于相同的目的,与使用Snapshot API或Reindex API相比,Clone Index API的主要优势是速度,因为Clone Index API会将段从源索引硬链接到目标索引,而无需重新处理其任何索引内容(显然是在支持硬链接的文件系统上;否则,将在文件系统级别复制文件,这比其他方法要有效得多)。克隆索引还可以确保目标索引在每个点上都与源索引相同(也就是说,与Reindex方法相反,无需手动复制设置和映射),并且不需要配置本地快照目录

旁注: 尽管此过程比以前的解决方案要快得多,但仍然意味着停机。在实际的用例中,有必要使用重命名索引(例如,作为拆分,收缩或备份工作流中的一个步骤),但是重命名索引不应成为日常操作的一部分。如果您的工作流程需要频繁地重命名索引,那么您应该考虑改为使用Indices Aliases

以下是将索引source_index重命名为target_index的完整操作序列的示例。可以使用某些ElasticSearch特定的控制台(例如集成的in Kibana)来执行。有关此示例的替代版本,请参见this gist,使用curl代替Elastic Search控制台。

# Make sure the source index is actually open
POST /source_index/_open

# Put the source index in read-only mode
PUT /source_index/_settings
{
  "settings": {
    "index.blocks.write": "true"
  }
}

# Clone the source index to the target name, and set the target to read-write mode
POST /source_index/_clone/target_index
{
  "settings": {
    "index.blocks.write": null 
  }
}

# Wait until the target index is green;
# it should usually be fast (assuming your filesystem supports hard links).
GET /_cluster/health/target_index?wait_for_status=green&timeout=30s

# If it appears to be taking too much time for the cluster to get back to green,
# the following requests might help you identify eventual outstanding issues (if any)
GET /_cat/indices/target_index
GET /_cat/recovery/target_index
GET /_cluster/allocation/explain

# Delete the source index
DELETE /source_index

答案 7 :(得分:-4)

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

  1. 关闭需要重命名的索引
  2. 重命名主节点和数据节点的所有数据目录中的索引文件夹。
  3. 重新打开旧的封闭索引(我使用kofp插件)。旧索引将重新打开但保持未分配状态。新索引将以关闭状态显示
  4. 重新开启新索引
  5. 删除旧索引
  6. 如果您碰巧收到此错误“悬挂的索引目录名称为”,请删除所有主节点(不是数据节点)中的索引文件夹,然后重新启动其中一个数据节点。