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

来源:互联网 发布:智能优化算法 知乎 编辑:程序博客网 时间:2024/04/28 10:14

首先我们要明确,为什么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
原创粉丝点击