教你如何在 elasticsearch 中重建索引

序言

Elasticsearch 是一个实时的分布式搜索分析引擎。Teambition 使用 Elastisearch 作为搜索引擎,为用户提供搜索服务,当我们决定存储某种数据时,我们需要使用PUT /teambition创建索引,在创建索引的时候需要将数据结构完整确定下来,于此同时索引的设定和很多固定配置将用不能改变。当需要改变数据结构时,就需要重新建立索引,为此,Elastic团队提供了很多辅助工具帮助开发人员进行重建索引。

决定是否需要重建?

重建时相当痛苦的,如果没有很好的基础,服务可能中断,当数据量非常大时,重建恢复时间可能很长,甚至在重建过程中出错等等。所以,没有万不得已的情况下还是尽量避免重建索引。Teambition 重建索引的理由略,因为这并不重要。

使用正确的工具

kibana 是 Elasticsearch 的最佳拍档,从 ES 5.0 开始,Kibana 强大的功能能够替代几乎所有旧时代 ES 1.x 和 ES 2.x 的插件。关键是人家还是免费的!

先决条件

正在运行的服务必须使用别名(alias)来访问索引(index),原因很简单,搜索服务最终要使用重建的索引,原始的索引将被删除。如果你的服务正在直接使用索引名,在重建前创建别名,更新服务。

POST /_aliases
{"actions": [{"add": {"index": "teambition", // 原有索引"alias": "teambition_latest" // 服务的别名}}]
}
复制代码

先决条件2

记得查看 Elasticsearch 的 Disk Usage,如果不够,请先申请好足够的空间。

创建新索引

和创建普通索引一样创建新索引。这里值得一提的时,当数据量很大的时候,需要设置刷新时间间隔,在此期间写入的数据不能搜到,从而提高重建速度:refresh_intervals = -1, number_of_replicas = 0。实践告诉我,大概会提高100% ~ 400%的提升。

PUT /teambition_20180328
{"settings": {...},"mapping": {...}
}
复制代码

记录同步数据的偏移值(offset)

Teambition使用Kafka把MongoDB中的数据导入到Elasticsearch中,如果没有kafka,亦可读取oplog的数据写入Elasticsearch。无论使用哪种同步数据的方式,都需要记录同步数据的offset。重建索引可能非常耗时,在这段时间内,同步进程仍然在向旧索引更新数据,此时重建索引是无法更新这些新数据的。这里记录的方法就不多说了,Teambition 使用 kafka-admin 的API记录 offset。

开始重建索引

使用 Elasticsearch 团队提供的 reindex api 就可以将数据 copy 到新索引中。这里几条路可以选:

  1. 当只是改变 mapping 数据结构时,可以仅仅使用 reindex api 即可。例如:删除字段,更新字段分词方式等。
  2. 当需要写入新的字段,新的字段是由老的字段计算得到时,可以使用script参数。例如,计算某条数据某字段的总和。script 有很多坑,当 script 出错时,reindex 跑了很久之后失败,即使将数据恢复,也需要重新跑 reindex。
  3. 当含有很复杂的逻辑时,额,还是自己写程序吧。

调用 reindex 接口,接口将会在 reindex 结束后返回,而接口返回超时只有30秒,如果 reindex 时间过长,建议加上wait_for_completion=false的参数条件,这样 reindex 将直接返回taskId

POST _reindex?wait_for_completion=false
{"source": {"index": "teambition"},"dest": {"index": "teambition_20180328"},"script": {...}
}
复制代码

重建索引中

重建索引非常耗时,喝杯咖啡歇一会儿吧(顺便去打个球,睡个觉,旅个游)。

在没有设置 refresh_intervalsnumber_of_replicas 时,reindex 的速度在 500~1000 doc/sec, 如果包含 script 时可能会更低。设置之后,可以到 4000~8000 doc/sec。 Teambition 70M Documents 大概耗时4小时。

可以使用GET _tasks/{taskID}可以看到重建进程,其中包含耗时,剩余doc数量等信息。

如果发现错误,可以使用PUT _tasks/{taskID}/cancel接口放弃任务,从头再来。

恢复同步数据

重建索引结束后,别忘了在setting中的将number_of_replicasrefresh_intervals设为原有值. 启动新的同步索引的进程(从记录 offset 开始同步)

建立新的alias

需要在同时绑定建立的新索引以及解绑旧索引,语句如下:

POST _aliases
{"actions": [{"add": {"index": "teambition_20180328","alias": "teambition_latest"}}, {"remove": {"index": "teambition","alias": "teambition_latest"}}]
}
复制代码

删掉index

删除旧的 index,释放磁盘空间;停止原有同步进程。

DELETE teambition
复制代码

总结

修改索引真的是一件费时费力的工作,特别是如果发生了错误,整个人都不好了。所以还是在创建索引的时候尽量想好能否满足需求,当然大家都知道这几乎是不可能的,因为存在着万恶的产品经理。

这里还有一个很重要的内容没有详细介绍就是同步进程,前面提到同步进程是将 MongoDB 的数据同步到 ES 中去的程序,这个程序同时还需要有能力暂停同步,重复同步的等能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/254599.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

halcon控制算子Control,持续更新

目录Controlassignassign_atbreakcasecatchcommentcontinueconvert_tuple_to_vector_1dconvert_vector_to_tupledefaultelseelseifendforendifendswitchendtryendwhileexecutable_expressionexitexport_defforglobalififelseimportinsertpar_joinrepeatreturnstopswitchthrowtr…

《CLR via C#》之线程处理——线程基础

《CLR via C#》之线程处理——线程基础 《CLR via C#》之线程处理——线程基础windows为什么要支持线程线程开销CPU发展趋势CLR线程和Windows线程使用专用线程执行异步的计算限制操作线程调度和优先级windows为什么要支持线程 早期的操作系统只有一个执行线程,但同时…

《高效程序员的45个习惯》-之二

请您在阅读本文之前,先了解《高效程序员的45个习惯》-之一。 每一期都会涉及15个话题,用3期来列出这45个习惯,每次不贪多,贪精,大家如果有空,一定要细细品味这15个习惯。 注意:每一个好的习…

MIME Type的介绍

转载自: http://www.cnblogs.com/jsean/articles/1610265.html 一、 首先,我们要了解浏览器是如何处理内容的。在浏览器中显示的内容有 HTML、有 XML、有 GIF、还有 Flash ……那么,浏览器是如何区分它们,决定什么内容用什么形式来…

spring boot之从零开始开发自己的网站

概述 首先要感谢两位大神,该项目的想法来源自tale和MyBlog。 做了一些改造,增加了一些功能和一些代码的重构,并且更换了博客主题。 关于项目,对于开发的练手项目,能够工程化,严谨一些。 关于文档&#x…

halcon深度学习算子,持续更新

目录Deep Learning 深度学习Classification:分类apply_dl_classifierclear_dl_classifierclear_dl_classifier_resultclear_dl_classifier_train_resultdeserialize_dl_classifierget_dl_classifier_paramget_dl_classifier_resultget_dl_classifier_train_resultre…

python day5--正则表达式

#----正则表达式 import re elink <a href"(.*)">(.*)</a> info <a href"http://www.baidu.com">baidu</a> cinfo re.findall(elink,info) print (cinfo) import re print(re.search (r^a,abc\neee)) #预期结果 ^匹配字符开…

WCF系列教程之WCF客户端调用服务

1、创建WCF客户端应用程序需要执行下列步骤 (1)、获取服务终结点的服务协定、绑定以及地址信息 (2)、使用该信息创建WCF客户端 (3)、调用操作 (4)、关闭WCF客户端对象 二、操作实例 1、WCF服务层搭建:新建契约层、服务层、和WCF宿主,添加必须的引用(这里不会的参考本人前面的随…

《高效程序员的45个习惯》-之三

请您在阅读本文之前&#xff0c;先了解《高效程序员的45个习惯》-之二。 每一期都会涉及15个话题&#xff0c;用3期来列出这45个习惯&#xff0c;每次不贪多&#xff0c;贪精&#xff0c;大家如果有空&#xff0c;一定要细细品味这15个习惯。 注意&#xff1a;每一个好的习…

负载均衡的那些事?

什么是负载均衡&#xff1f;1、负载&#xff1a;就是后端系统的承载能力。比如同等条件下&#xff0c;一个1核cpu-1G内存的机器的承载能力一般会比8核cpu-8G内存的机器要差&#xff1b;相同配置下&#xff0c;一个cpu利用率为80%的机器比30%的承载能力一般要差等等。2、均衡&am…

Develop内部函数,持续更新

Develop内部函数 目录Develop内部函数dev_clear_objdev_clear_windowdev_close_inspect_ctrldev_close_tooldev_close_windowdev_disp_textdev_displaydev_error_vardev_get_exception_datadev_get_preferencesdev_get_systemdev_get_windowdev_inspect_ctrldev_map_pardev_map…

短信认证方案,用手机短信进行上网认证如何实现?

WFilter NGF的“Web认证”模块&#xff0c;提供了一系列的上网认证解决方案。包括如下认证方式&#xff1a;本地用户名密码认证AD域用户名密码认证企业邮箱用户名密码认证Radius用户名密码认证微信WiFi认证Facebook Wifi认证除此&#xff0c;WFilter NGF还有一个“其他”的选项…

《高效程序员的45个习惯》-末篇

请您在阅读本文之前&#xff0c;先了解《高效程序员的45个习惯》-之三。 每一期都会涉及15个话题&#xff0c;用3期来列出这45个习惯&#xff0c;每次不贪多&#xff0c;贪精&#xff0c;大家如果有空&#xff0c;一定要细细品味这15个习惯。 注意&#xff1a;每一个好的习…

【Qt开发】V4L2 API详解 Buffer的准备和数据读取

前面主要介绍的是&#xff1a;V4L2 的一些设置接口&#xff0c;如亮度&#xff0c;饱和度&#xff0c;曝光时间&#xff0c;帧数&#xff0c;增益&#xff0c;白平衡等。今天看看V4L2 得到数据的几个关键ioctl&#xff0c;Buffer的申请和数据的抓取。1. 初始化 Memory Mapping …

halcon File文件算子,持续更新

目录File文件Images图像read_imageread_sequencewrite_imagedeserialize_imageserialize_imagelist_image_fileparse_filenameMisc混合体copy_filedelete_filefile_existsget_current_dirlist_filesmake_dirread_world_fileremove_dirset_current_dirObject对象deserialize_obj…

Nginx 之一:编译安装nginx 1.8.1 及配置

转http://www.cnblogs.com/zhang-shijie/p/5294162.html 一&#xff1a;基介绍 官网地址www.nginx.org&#xff0c;nginx是由1994年毕业于俄罗斯国立莫斯科鲍曼科技大学的同学为俄罗斯rambler.ru公司开发的&#xff0c;开发工作最早从2002年开始&#xff0c;第一次公开发布时间…

PI校正环节的程序实现推导过程

PI校正环节在经典控制论中非常有用&#xff0c;特别是对负反馈控制系统&#xff0c;基本上都有PI校正环节。1.下面分别说明比例环节和积分环节的作用&#xff0c;以阶跃信号为例。①比例环节单独作用以上分析说明&#xff0c;若只有比例环节的控制系统&#xff0c;阶跃响应也是…

XML文档注释(C#)

目录XML文档编译器识别的标记添加XLM注释的方法添加XLM注释的例子XML文档 C#可以根据特定的注释自动创建XML格式的文档说明。 这些注释都是单行注释&#xff0c;但都以三条斜杠开头 编译器识别的标记 标记说明<C>把行中的文本标记为代码&#xff0c;例如<c>int …

vs里根据json快速创建对应类的方法

有时候,我们在调用别人接口的时候,服务端返回了一个json格式的字符串,我们要获取json里面的数据的话一般有两种方式: 1.通过正则 2.反序列化成一个对象 第一种方式这里不再多说,主要说一下第二种,(为什么呢&#xff0c;你看到后面 你也会喜欢上第二种) 有人肯定会说, json字符串…

德鲁克的《卓有成效的管理者》

是一本很好的书&#xff0c;对我有诸多的启发&#xff0c;这本书我在短期内连看两遍呢。 现将一些我觉得有启发性的句子发给大家分享。 1. 一个人的有效性&#xff0c;与他的智力、想象力或知识之间&#xff0c;几乎没有太大的关联。有才能的人往往最为无效&#xff0c;因为他们…