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
请尊重原创,转载请注明出处。
- Changing Mapping with Zero Downtime(不停机修改mapping)
- 不停机修改mysql表结构
- elasticsearch-不停服务修改mapping
- Mapping
- Mapping
- Mapping
- Mapping Requests With @RequestMapping
- [译]elasticsearch-不停服务修改mapping
- elasticsearch更改mapping(不停服务重建索引)
- elasticsearch更改mapping(不停服务重建索引)
- 3D mapping with turtlebot
- Cg shader with refraction mapping
- MYSQL性能优化之分库分表与不停机修改mysql表结构
- Simple Shadow Mapping Tutorial with OpenGL
- Mapping Guids in IIS with Friendly Names
- Tangent space normal mapping with GLSL
- Lighting and environment mapping with GLSL
- Mapping a bidirectional list with Hibernate
- POJ 1804 Brainman (归并排序 -- 求逆序对数)
- 引用作为函数参数和常引用作为函数参数
- redis集群动态增加或者删除节点
- 删除Golang函数代码块,保留函数名
- Python基础学习----网页爬虫
- Changing Mapping with Zero Downtime(不停机修改mapping)
- VB杀Excel进程
- 意大利公投再度考验欧盟
- 三大Java 虚拟机垃圾回收机制的比较(HotSpot, JRockit, IBM JVM)
- SSIS 中union all , 合并 ,合并链接的使用
- R语言数据储存与读取
- linux网络编程之System V 信号量(二):用信号量实现进程互斥示例和解决哲学家就餐问题
- aar和jar的区别
- 面向对象设计原则 面向对象设计原则之接口隔离原则