66.零停机下reindex

主要知识点:

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

原文地址:https://www.cnblogs.com/liuqianli/p/8476897.html

时间: 2024-07-30 12:23:05

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

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

Elasticsearch 版本:6.4.0 一.疑问 在项目中后期,如果想调整索引的 Mapping 结构,比如将 ik_smart 修改为 ik_max_word 或者 增加分片数量 等,但 Elasticsearch 不允许这样修改呀,怎么办? 常规 解决方法: 根据最新的 Mapping 结构再创建一个索引 将旧索引的数据全量导入到新索引中 告知用户,业务要暂停使用一段时间 修改程序,将索引名替换成新的索引名称,打包,重新上线 告知用户,服务可以继续使用了,并说一声抱歉 我认为最大的弊端

[terry笔记]GoldenGate_迁移同步_主库零停机

ogg根据scn同步数据,源库零停机时间 本次实验与上次的区别:更加注重细节,几乎包含所有步骤,把我越到的坑都作出了说明.并且同步是由10g向11g进行同步,更加符合升级迁移需求. 如下是主要步骤: 1. 配置好ogg源端的mgr.抓取和传送进程,并启动. 2. 配置好ogg目标端的mgr.复制进程,仅启动mgr. 3. 源端可自由进行交易,此时观察源与目标的trail文件是否都正常. 4. 查询源端此时的scn,并按照参数flashbask_scn进行expdp. 5. 目标端impdp导入.

[terry笔记]ogg_迁移同步实验_零停机

oracle golden gate我最近正在琢磨,这个软件我觉得约等于dataguard的逻辑模式,我认为其最大的优势是更可控制,比如可以细化到某个schema.某个table的同步. 如下实验的主要步骤: ogg根据scn同步数据,源库零停机时间 1. 配置好ogg源端的mgr.抓取和传送进程,并启动. 2. 配置好ogg目标端的mgr.复制进程,仅启动mgr. 3. 源端可自由进行交易,此时观察源与目标的trail文件是否都正常. 4. 查询源端此时的scn,并按照参数flashbask_

oracle Ksplice Uptrack实现linux零停机内核补丁升级

1.ORACLE linux零停机更新介绍 Linux的内核升级是一项很重大的变更,传统情况下需要停止应用,重启操作系统,现在,ORACLE使Linux可以在一秒时间内动态地应用内核与安全补丁等升级,实现零停机,对应用不产生中断影响,是依赖Ksplice Uptrack实现的. 这项技术,被ORACLE号称为号称为"永不可摧"的神力,也确实使得ORACLE Linux可以像UNIX一样,如果排除硬件的影响外,系统可以永远运行下去.不过,ORACLE的此功能产品,也是收购而来的,不管它怎

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

前言 我们使用Elasticsearch索引文档时,最理想的情况是文档JSON结构是确定的,数据源源不断地灌进来即可,但实际情况中,没人能够阻拦需求的变更,在项目的某个版本,可能会对原有的文档结构造成冲击,增加新的字段还好,如果要修改原有的字段,只能重建索引了. 概要 本篇以实战方式讲解如何零停机完成索引重建的三种方案. 外部数据导入方案 整体介绍 系统架构设计中,有关系型数据库用来存储数据,Elasticsearch在系统架构里起到查询加速的作用,如果遇到索引重建的操作,待系统模块发布新版本后

linux下LVM相关知识(动态增减LVM,快照功能)的总结

一,什么是LVM LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性.LVM是磁盘分区和文件系统之间添加的一个逻辑层,来为文件系统屏蔽下层磁盘分区布局,提供一个抽象的盘卷,在盘卷上建立文件系统.物理卷(physical volume)物理卷就是指硬盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质

Oracle RAC环境下如何更新patch(Rolling Patch)

Oracle RAC数据库环境与单实例数据库环境有很多共性,也有很多异性.对于数据库补丁的更新同样如此,都可以通过opatch来完成.但RAC环境的补丁更新有几种不同的更新方式,甚至于可以在零停机的情况下对所有节点实现滚动升级.本文主要是转述了Doc 244241.1,描述RAC环境下的patch更新方式以及在不同的情形下选择何种更新方式. 1.RAC patch的几种方式 OPatch supports 3 different patch methods on a RAC environmen

一阶电路的零状态响应

零状态响应就是电路在零初始状态下(动态元件初始储能为零)由外施激励引起的响应. RC电路的零状态响应 在t=0时刻,开关S闭合,电路接入直流电压源US.根据KVL,有 uR+uC=US (KVL ∑u=0 指定回路的绕行方向是顺时针的,R.C的电压参考方向与绕行方向一致,电压前面取“+”号,US的电压参考方向与绕行方向不一致,前面取“-”号. 根据KVL,有 uR+uC-US=0 得 US=uR+uC) 将uR=Ri,i=CduC/dt代入,得电路的微分方程 RC(duC/dt)+uC=US 此

ES--07

61.索引管理_快速上机动手实战创建.修改以及删除索引 课程大纲 1.为什么我们要手动创建索引? 2.创建索引 创建索引的语法 PUT /my_index{ "settings": { ... any settings ... }, "mappings": { "type_one": { ... any mappings ... }, "type_two": { ... any mappings ... }, ... }} 创