首页 > 解决方案 > 在不丢失数据的情况下更新积极使用的索引的配置

问题描述

有时,我需要更新映射、设置或将默认管道绑定到活跃使用的索引。

目前,我使用的数据丢失方法如下:

  1. 使用适当的映射更新索引模板(或通过 绑定默认管道index.default_pipeline);
  2. 创建a_new_index(匹配模板 index_patterns);
  3. 重新索引index_to_fixtoa_new_index以迁移已索引的数据;
  4. 使用别名将即将到来的索引请求重定向到(别名将与确保索引不受干扰a_new_index的名称相同)并删除;index_to_fixindex_to_fix

但是在第 3 步和第 4 步之间,有一个时间间隔,在此期间,新索引的数据会丢失在原始index_to_fix.


有没有办法在不丢失任何数据的情况下更新积极使用的索引的配置?

标签: elasticsearch

解决方案


感谢@LeBigCat 的帮助,经过一些讨论。我认为这个问题可以分三步解决。

为 CRUD 使用别名

首先,尽量不要直接使用索引,尽可能使用别名;由于您不能使用与现有索引同名的别名,因此即使索引已损坏(设计不佳)也无法直接替换该索引。最简单的方法是使用模板并将索引名称直接包含在别名中。

PUT _template/test
{
  ...
  "aliases" : {
    "{index}-alias" : {} 
  }
}

重定向索引

由于index_to_fix正在积极使用,在更新模板并创建新索引a_new_fix后,我们可以使用别名将索引重定向a_new_fix.

POST /_aliases
{
    "actions" : [
        { "add":  { "index": "a_new_index", "alias": "index_to_fix-alias" } },
        { "remove": { "index": "index_to_fix", "alias": "index_to_fix-alias" } }  
    ]
}

迁移数据

只需使用_reindex将所有数据从 迁移index_to_fixa_new_index.

POST _reindex
{
  "source": {
    "index": "index_to_fix"
  },
  "dest": {
    "index": "index_to_fix-alias"
  }
}

推荐阅读