主要知识点:

  • 理解reindex的使用场景和必要性
  • 学会reindex

 
 

 
 

一、理解reindex的使用场景和必要性

假设:在某一个index中依靠dynamic mapping插入数据,但是不小心有些数据是2017-01-01这种日期格式的,所以title这个field被插入2017-01-01这条数据之后就被es自动映射为了date类型,实际上它应该是string类型的。如果后面有"hello word"这个格式的数据插入时就会报错,在这种情况下,是不能修改原index下的mapping的,只能是重建正确的索引,然后把原索引的数据放入新索引中。具体做法如下:

因为一个field的设置是不能被修改的,如果要修改一个Field,那么应该重新按照新的mapping,建立一个index,然后将数据批量查询出来,重新用bulk api写入index中。批量查询的时候,建议采用scroll api,并且采用多线程并发的方式来reindex数据,每次scoll就查询指定日期的一段数据,交给一个线程即可。

 
 

二、零停机下reindex实验

1、插入格式错误的数据

 
 

PUT /my_index/my_type/3

{

"title": "2017-01-03"

}

 
 

查看field的mappings

语句:GET /my_index/_mapping/my_type

执行结果:

{

"my_index": {

"mappings": {

"my_type": {

"properties": {

"title": {

"type": "date"

}

}

}

}

}

}

 
 

2、插入string类型的值

当后期向索引中加入string类型的title值的时候,就会报错

 
 

PUT /my_index/my_type/4

{

"title": "my first article"

}

 
 

{

"error": {

"root_cause": [

{

"type": "mapper_parsing_exception",

"reason": "failed to parse [title]"

}

],

"type": "mapper_parsing_exception",

"reason": "failed to parse [title]",

"caused_by": {

"type": "illegal_argument_exception",

"reason": "Invalid format: \"my first article\""

}

},

"status": 400

}

 
 

3、测试修改title的mapping类型

如果此时想修改title的类型,是不可能的

 
 

PUT /my_index/_mapping/my_type

{

"properties": {

"title": {

"type": "text"

}

}

}

执行结果

{

"error": {

"root_cause": [

{

"type": "illegal_argument_exception",

"reason": "mapper [title] of different type, current_type [date], merged_type [text]"

}

],

"type": "illegal_argument_exception",

"reason": "mapper [title] of different type, current_type [date], merged_type [text]"

},

"status": 400

}

 
 

4、把原index使用别名

此时,唯一的办法,就是进行reindex,也就是说重新建立一个索引,将旧索引的数据查询出来,再导入新索引。如果说旧索引的名字是old_index,新索引的名字是new_index,终端java或python应用,已经在使用old_index在操作了,f如果停止终端应用,修改使用的index为new_index,再重新启动终端应用,这个过程就会导致终端应用停机,使es可用性降低。解决办法就是,给终端应用一个别名,这个别名是指向旧索引的,终端应用先用着这个别名,例如:终端应用先用goods_index alias来进行es操作,此时实际指向的是旧的my_index。语法如下:

 
 

PUT /my_index/_alias/goods_index

 
 

5、新建一个index,调整其title的类型为string

 
 

PUT /my_index_new

{

"mappings": {

"my_type": {

"properties": {

"title": {

"type": "text"

}

}

}

}

}

 
 

6、使用scroll api将数据批量查询出来

 
 

GET /my_index/_search?scroll=1m

{

"query": {

"match_all": {}

},

"sort": ["_doc"],

"size": 1

}

执行结果(部分):

{

"_scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAADpAFjRvbnNUWVZaVGpHdklqOV9zcFd6MncAAAAAAAA6QRY0b25zVFlWWlRqR3ZJajlfc3BXejJ3AAAAAAAAOkIWNG9uc1RZVlpUakd2SWo5X3NwV3oydwAAAAAAADpDFjRvbnNUWVZaVGpHdklqOV9zcFd6MncAAAAAAAA6RBY0b25zVFlWWlRqR3ZJajlfc3BXejJ3",

"took": 1,

"timed_out": false,

"_shards": {

"total": 5,

"successful": 5,

"failed": 0

},

 

7、采用bulk api将scoll查出来的一批数据,批量写入新索引

 
 

POST /_bulk

{ "index": { "_index": "my_index_new", "_type": "my_type", "_id": "2" }}

{ "title": "2017-01-02" }

 
 

8、反复循环6~7步骤

查询一批又一批的数据出来,采取bulk api将每一批数据批量写入新索引中。

 
 

9、切换别名

将goods_index alias切换到my_index_new上去,终端应用会直接通过index别名使用新的索引中的数据,java应用程序不需要停机,从而达到零停机高可用的目的。

 
 

POST /_aliases

{

"actions": [

{ "remove": { "index": "my_index", "alias": "goods_index" }},

{ "add": { "index": "my_index_new", "alias": "goods_index" }}

]

}

 
 

10、验证别名

直接通过goods_index别名来查询,是否能进行正确的查询。

 
 

GET /goods_index/my_type/_search

66.零停机下reindex的更多相关文章

  1. ElasticSearch(三十)基于scoll+bulk+索引别名实现零停机重建索引

    1.为什么要重建索引? 总结,一个type下的mapping中的filed不能被修改,所以如果需要修改,则需要重建索引 2.怎么zero time重建索引? 一个field的设置是不能被修改的,如果要 ...

  2. Elasticsearch如何修改Mapping结构并实现业务零停机

    Elasticsearch 版本:6.4.0 一.疑问 在项目中后期,如果想调整索引的 Mapping 结构,比如将 ik_smart 修改为 ik_max_word 或者 增加分片数量 等,但 El ...

  3. 详解k8s零停机滚动发布微服务 - kubernetes

    1.前言 在当下微服务架构盛行的时代,用户希望应用程序时时刻刻都是可用,为了满足不断变化的新业务,需要不断升级更新应用程序,有时可能需要频繁的发布版本.实现"零停机"." ...

  4. DevOps之零停机部署

    “零停机部署(ZDD)可在不中断现有服务的情况下部署新版系统.” 通过ZDD方式部署应用程序时,可在确保用户不会遭遇应用程序停机的前提下将新版应用引入生产环境.从用户和公司的角度来看,这应该是最佳部署 ...

  5. Elasticsearch系列---实战零停机重建索引

    前言 我们使用Elasticsearch索引文档时,最理想的情况是文档JSON结构是确定的,数据源源不断地灌进来即可,但实际情况中,没人能够阻拦需求的变更,在项目的某个版本,可能会对原有的文档结构造成 ...

  6. elasticsearch 5.x 系列之七 基于索引别名的零停机升级服务

    一,写在前面的话,elasticsearch 建立索引时的Mapping 设置 建议你在设计索引的初期,就把索引的各个字段设计好,因为,elasticsearch 的各个字段,定义好类型后,就无法进行 ...

  7. [terry笔记]11gR2_DataGuard搭建_primary零停机

    11gR2搭建dataguard环境,此篇文章是利用rman搭建dataguard,这样的好处是primary不用停机,当然,前提条件是primary已经开启归档. 相对于可以停机,零停机传送数据文件 ...

  8. java应用零停机,时间索引重建(reindex)

    一个field的设置是不能被修改的,如果要修改一个Field,那么应该重新按照新的mapping,建立一个index,然后将数据批量查询出来,重新用bulk api写入index中 批量查询的时候,建 ...

  9. Azure进阶攻略 | 数据库上云:零停机、自动化

    小明最近挺忙,刚刚在外地找了个新工作,正在忙着搬家.多年积攒的家当很多,根本不能潇洒地「说走就走」,于是他联系了搬家公司.专业的就是不一样,不费什么事,就把所有东西打包.运输.拆包到位了.抵达新城市的 ...

随机推荐

  1. ListView总结(多选框ListViiew,动态加载,多线程更新ListView中的进度条)

    Why ListView? ListView 如果仅仅出于功能上的需求ListView可能没有存在的必要,ListView能作的事情基本上ScrollView也能胜任.ListView存在的最根本的原 ...

  2. MySQL之自定义函数实例讲解

    转自:https://www.2cto.com/database/201804/740205.html MySQL中已经有很多函数,如时间函数等,但是有时这些函数不能满足自己的设计需求,此时需要自定义 ...

  3. 【WIP】Bootstrap modal

    创建: 2017/09/28   更新: 2017/10/14 标题加上[WIP]

  4. 枚举详解之EnumSet、EnumMap用法

    枚举简单例子 /** * @author shuliangzhao * @Title: Color * @ProjectName design-parent * @Description: TODO ...

  5. Unity - 简单实例化的应用

    项目描述:每帧实例化一个随机颜色的物体(Cube),坐标在某范围内随机:且物体每帧都会缩小,当缩小到一定的尺寸时,就销毁物体 代码描述: public class CubeSpawner : Mono ...

  6. Kafka详解与总结(四)

    Kafka消息分发和消费者push.pull机制 1. 消息分发 Producer客户端负责消息的分发 kafka集群中的任何一个broker都可以向producer提供metadata信息,这些me ...

  7. python--修改默认递归层级

    import sys sys.setrecursionlimit(最大递归次数)

  8. 【转】Linux 之 数据流重定向

    转自:http://www.linuxidc.com/Linux/2012-09/69764.htm linux在你登入时,便将默认的标准输入.标准输出.标准错误输出安排成你的终端.I/O重定向就是你 ...

  9. Spring Cloud (6) 分布式配置中心-高可用

    高可用 现在已经可以从配置中心读取配置文件了,当微服务很多时都从配置中心读取配置文件,这时可以将配置中心做成一个微服务,将其集群化,从而达到高可用. 改造config-server 加入eureka ...

  10. C语言关键字之sizeof

    C语言关键字 sizeof 是一个操作符,返回对象或类型所占内存字节数,类型为size_t(定义在<stddef.h>),有2种用法: sizeof unary-expression si ...