Changing Mapping with Zero Downtime(不停机修改mapping)

首先我们要明确,为什么mapping不能修改?

你只能查找到存储在索引中的内容,为了让你的数据可搜索,es需要知道你的每个字段里存放什么样类型的数据,如果你改变一个字段的类型,比如从string改成date,那么你之前索引的所有数据都没有用了,你需要重新索引那个字段。这不只是对于es,所有使用索引的数据库都是这样,如果不用索引,那么就要为灵活性来牺牲性能了。es(包括lucene),把索引存储在不可改变的段(segment)里,每个segment是一个小的反向索引,这些段永远都不会被更新,更新一个文档(document)事实上就是创建一个新的document,然后把旧的document标记为已删除。当你添加很多document或者更新一些已经存在的document时,会创建新的segment,后台运行的merge操作把一些小的segment合并成一个新的大segment,然后那些旧的segment会被彻底删除。通常,es中一个index包含多个不同的type,每个_type有自己的mapping,一个segment可能包含任何type下的document,所以就算你只是想改变一个type的一个字段,除了重新索引index下的所有数据也几乎没有什么其他办法。


当面对不得不更改mapping时,我们该怎么办?

情况A,我不关心原有数据。

1. 可以删除mapping,删除mapping时原有数据都会被删除,这个api在2.0以上版本被废弃了。

2. 给字段改个名字,我们知道es是可以增加字段的,我们可以新增一个字段代替原来的字段,只要在应用里指向新的字段即可。

3. 升级成multi-field类型的字段,multi-field的字段可以使一个字段被用于不同目的,比如title,可以有一个分词的字段用于搜索,再设置一个不分词的用于排序。

情况B,改变只用于新数据就好。

可以利用es的别名机制,新建一个索引new_index,与原索引old_index共用同一个别名index_alias,查询时指向别名即可。

情况C,我要新老通吃。

同样利用es的别名机制,原索引old_index,别名index_alias,新建一个索引new_index,通过reindex把old_index中的内容重建到new_index中,只需把别名切换到new_index,即可实现不停机切换索引。


参考地址:https://www.elastic.co/blog/changing-mapping-with-zero-downtime

请尊重原创,转载请注明出处。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值