主要知识点:

  • 理解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. MapReduce02

    ====================== MapReduce实现 ====================== Input: 一系列key/value对 用户提供两个函数实现: map(k,v) ...

  2. cf 749D Leaving Auction

    Leaving Auction time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  3. HDU4336:Card Collector

    题意 有n张卡片,每一次 有pi的概率买到第i张卡.求买到所有卡的期望购买次数. n<=20 解析 Solution 1:大力状压(就是步数除以方案数) #include<iostream ...

  4. Scala 获取当前时间

    def NowDate(): String = { val now: Date = new Date() val dateFormat: SimpleDateFormat = new SimpleDa ...

  5. java网络编程UDP

    图片来自网络 [发送端] import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSoc ...

  6. ognl表达式注意事项

    1.在jsp页面中: <s:a action="departmentAction_delete.action?did="></s:a> 说明:   1.st ...

  7. php settype()和gettype()

    gettype()是获得变量的类型,settype()函数用来配置或转换变量类型.成功返回 true 值,其它情形返回 false 值.参数 var 为原来的变量名,参数 type 为下列的类型之一: ...

  8. A Few Words on Callbacks and Asynchronous Mechanism In Javascript

    It is said that the one of the most routine work a javascript programmer do is writing codes like &q ...

  9. [Swift通天遁地]九、拔剑吧-(15)搭建具有滑出、视差、3D变形等切换效果的引导页

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  10. 03-vue实例生命周期和vue-resource

    vue实例的生命周期 什么是生命周期:从Vue实例创建.运行.到销毁期间,总是伴随着各种各样的事件,这些事件,统称为生命周期! 生命周期钩子:就是生命周期事件的别名而已: 生命周期钩子 = 生命周期函 ...