ES 索引 mpping 字段数据类型更改过程
更改背景
存在 field 类型设置错误,导致文档无法写入。比如:String 类型的数据,但是 field 的字段却是 integer。
修改方案
ES 在索引创建后,不能直接修改 mapping 中 field 的类型设置。这就造成一旦 field 类型设置错误。可能导致整个索引无法使用。因此,索引的建立,字段的添加,一定要经过严格的评审 ,测试环境测试通过,再往生产环境迁移。修改起来将会比较曲折:
新建不同名称的正确索引,使用 es 的 _reindex API 将数据复制到新索引,并确定数据一致。
把旧索引删掉,重建与旧索引名称相同,正确配置的空索引。(注意:需要保证数据停写、ES 不动态创建索引)
使用_reindex API 操作将第<1>步新建的索引中备份数据写回到步骤<2>中重建的索引中。
注意:整个过程一定要做到数据停写,并将 ES 的动态创建索引开关关掉。
⚠️注意事项
整个操作过程中,如果数据不停写,动态索引创建正好又在开着。会导致以下问题产生:
执行步骤<1>时:新数据会继续往旧索引中写入,造成备份的数据很难保证一致性。
执行步骤<2>时:刚删完旧索引,由于数据写入操作,es 自己动态创建索引,此时它自动添加的索引大概率不是你想要的设定类型,导致你在重建时,直接报索引已存在。而数据又已经写入到它所创建的索引中,想要再复制到你指定的索引中,大概率又会出现类型检查错误。阻碍整个过程执行。
倘若操作者又在一种比较着急的问题修正场景,很容易由于紧张加上错误判断出现数据无法挽回的翻车。后果很可能很严重。
执行操作示例
索引创建
索引数据复制
注意:数据复制时,根据执行步骤调整 source 和 dest 的索引名称
版权声明: 本文为 InfoQ 作者【Lin】的原创文章。
原文链接:【http://xie.infoq.cn/article/357d4093bc3cf0281dd29c604】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论