ElasticSearch这些坑记得避开

Index用不好,麻烦事不会少;

一、管理方式

ElasticSearch作为最常用的搜索引擎组件,在系统架构中发挥极其重要的能力,可以极大的提升数据的加载和检索效率;但不可否认的是,在长期的应用实践中,也发现很多不好处理的流程和场景;

ElasticSearch这些坑记得避开

从直观感觉上说,业务中对索引的使用主要涉及如图的几个流程,其核心也就是索引的结构维护与数据的流动管理两个模块;

如果数据结构比较简单且体量小,那么使用起来可能很顺手;如果数据主体复杂且会动态扩展,并且体量偏大,那么就很容易踩中一些比较坑的点;

比如:索引中字段一旦有误,调整的流程十分复杂;数据流向索引中的方式,需要根据场景灵活选择;以及数据查询时的深度分页问题;下面将围绕这些问题来总结下应对策略;

顺带补充一句,其实很多组件在应用的时候都有不太符合预期的地方,所以在集成时可以考虑编写自定义的管理程序,来解决使用时可能存在的问题;

二、结构维护

对于ES索引的结构维护,数据主体如果相对简单的话,可以考虑手动管理,但实际上使用索引时,通常主体结构都比较复杂,字段个数超过三五十都很常见,所以基于流程化的管理很有必要;

ElasticSearch这些坑记得避开

结构映射:将需要构建索引的主体结构,在字段库中统一维护,值得注意的是字段名称和类型,字段可以与关系型数据库的查询一致,但是不同组件类型的描述不一样,尤其对ES来说,如果字段类型不合理,会影响搜索的使用;

索引结构:在实际的业务场景中,字段的信息是会动态变化的,这就会给索引结构的维护带来很多麻烦,字段的增减都好管理,但是如果涉及类型的变动,则存在索引重建的过程,会导致数据多次重新调度,这也是风险较高的操作;

程序维护:这种结构维护的机制,其核心目的是把整个流程进行程序化管理,避免人工进行干预,以此来确保索引结构的稳定扩展;

不得不提的一个经验教训,曾经在管理业务日志的索引结构时,出现过一次误删动作,好在可以重新构建和数据备份恢复,但是依旧给心里留下了几厘米的阴影,此后也将维护流程彻底程序化,避免失误动作发生;

三、数据调度

1、同步方案

数据的调度管理,其本质就是将数据从一个容器向另一个容器搬运或者拷贝,其核心操作就是读和写两个动作,但是为了让流程具备容错和稳定性,通常需要做策略和方案的设计;

ElasticSearch这些坑记得避开

同步双写:对数据的实时性要求极高,通常在一个事务中完成数据的双写动作,保证数据层面的强一致性;

异步解耦:在完成数据库的写动作之后,基于MQ消息解耦索引的写入,流程存在轻微的延迟,如果消费失败会导致数据缺失;

定时任务:通过任务调度的方式,以指定的时间周期执行新增数据的同步机制,存在明显的时效问题;

组件同步:采用合适的同步组件,比如官方提供的组件或者一些第三方开源的组件,在原理上与任务同步类似;

数据同步的选型方案有多种,如何选择完全看具体的场景,在过往的使用过程中,对于核心业务会采用同步双写,对于内部的活动类业务会采用异步的方式,对于业务日志会采用任务调度,对于系统的监控或执行日志则多是依赖同步组件;

2、中断和恢复

无论采用何种方式将数据同步到索引中,都不得不面对一个灵魂问题,如果流程突然异常中断,恢复后如何保证索引数据不丢失?这个问题适应于很多复杂的流程;

ElasticSearch这些坑记得避开

容错性是衡量一个复杂流程的核心指标,比如在索引数据同步的过程,需要短暂性的暂停,或者流程被迫中断时,都应该具备恢复后自动修复索引中数据缺失的能力;

ES实践中一个非常经典的问题,修改索引的结构时需要进行索引重建,此时要将当前索引迁入临时索引中,在完成索引结构调整之后,需要从临时索引中迁回数据,在此过程中,可以对服务交互的索引名称动态调整;

ElasticSearch这些坑记得避开

当然也可以直接使用临时索引作为交互索引,避免一次迁移动作,这种动态的识别需要在服务中嵌入,在整个 reindex过程中要避免手动干预,个人还是更相信程序的安全性和准确性;

四、刷新策略

在向ES索引中写数据时,存在三种不同的数据刷新机制,查看 6.8版本的设置中,参数 refresh_interval设置的是1s时间,即执行写入动作1秒后数据才可以被搜索到,避免频繁写入消耗过多的资源;

NONE:默认的刷新策略,请求提交之后不会等待数据刷新,降低资源消耗但数据实时性低;

IMMEDIATE:请求提交后立即刷新索引,数据的实时性很高但是资源消耗过大,API文档中建议测试使用;

WAIT_UNTIL:请求提交之后会等待索引刷新完成才会结束,相对来说是一种比较平衡的策略;

刷新机制对于索引的数据维护来说,主要在增删改的动作中,对即时查询有直接的影响,至于如何选择还是要结合具体的场景,尤其与同步方案关联密切,也可以在索引交互中动态维护策略,来应对不时之需;

五、深度分页

对于数据查询来说,几乎都存在分页的需求,在常见的应用中,不断下拉的功能都是存在最大的极限值;

ES中常用From/Size进行分页查询,但是存在一个限制,在索引的设置中存在 max_result_window分页深度的限制, 6.8版本默认值是10000条,即10000之后的数据无法使用From/Size翻页;

先从实际应用场景来分析,大多数的翻页需求最多也就前10页左右,所以从这个角度考虑,ES的翻页限制在合理区间,在实践中也存在对部分索引调高的情况,暂未出现明显问题;

再从技术角度来思考一下,如果翻页的参数过大意味着更多的数据过滤,那计算资源的占用也会升高,ES引擎的强大在于搜索能力,检索出符合要求的数据即可;

ElasticSearch这些坑记得避开

不管是ES还是其它类似的分布式存储组件,甚至是MySQL分库分表模式,其本质都是数据分布在不同服务节点的不同数据片上;常规的执行原理都是给请求分配一个主节点,协调各个节点执行相同的查询,并完成结果汇总和响应,深度分页时计算资源的占用自然非常高;

如果一定需要深度分页,在 6.8的版本中提供了 ScrollSearch-After两种其他的方式,用法参考相关文档即可。

六、参考源码

编程文档:
https://gitee.com/cicadasmile/butte-java-note

应用仓库:
https://gitee.com/cicadasmile/butte-flyer-parent

Original: https://www.cnblogs.com/cicada-smile/p/16856506.html
Author: 知了一笑
Title: ElasticSearch这些坑记得避开

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/712566/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • MySQL高级

    事务是一个不可分割的工作逻辑单元。 举例:张三和李四账户中各有100块钱,现李四需要转换500块钱给张三,具体的转账操作为: 第一步:查询李四账户余额 第二步:从李四账户金额 -5…

    技术杂谈 2023年7月25日
    068
  • 测试左移和测试右移,我们为何要“上下求索”?

    转载请注明出处❤️ 作者:测试蔡坨坨 原文链接:caituotuo.top/7b9ad46d.html 你好,我是测试蔡坨坨。 今天,我们来聊一聊测试左移和测试右移。 传统测试流程…

    技术杂谈 2023年7月11日
    076
  • Web Accessibility All In One

    Web Accessibility All In One a11y / Accessibility / 可访问性(无障碍) Accessibility (often abbrevi…

    技术杂谈 2023年6月1日
    086
  • 8086汇编 Loop 指令

    8086汇编 Loop 指令 功能:实现循环(计数型循环) 指令的格式 loop 标号 CPU 执行loop指令时要进行的操作: (cx)=(cx)-1; 判断cx中的值不为零则转…

    技术杂谈 2023年6月1日
    093
  • 剑指offer计划20( 搜索与回溯算法中等)—java

    1.1、题目1 剑指 Offer 07. 重建二叉树 1.2、解法 注释解法。 1.3、代码 class Solution { int[] preorder; HashMap ma…

    技术杂谈 2023年7月25日
    068
  • Word中的公式:如何插入任意行列的矩阵?

    方法: 对着1处的元素右键-插入-在此处插入列。 posted on2022-07-26 08:24 一杯明月 阅读(785 ) 评论() 编辑 Original: https:/…

    技术杂谈 2023年5月31日
    094
  • 安装完Ubuntu启动时自动进入grub命令行模式的解决办法

    1.先使用ls命令,找到Ubuntu的安装在哪个分区: grub>ls 会罗列所有的磁盘分区信息,比方说: (hd0,1),(hd0,5),(hd0,3),(hd0,2) 2…

    技术杂谈 2023年7月11日
    090
  • N68第二周作业

    完成作业:完成一个shell脚本,脚本的作用。1. 运行脚本可以显示出本机的ip地址2. 如果ip地址中有3这个数字,那么就打印出当前的系统时间3. 如果ip地址中不含3这个数字,…

    技术杂谈 2023年6月21日
    086
  • 枚举转字符串

    include using namespace std; enum Abc { AAA = -1, BBB = 0, CCC = 1 }; class EnumToStringUt…

    技术杂谈 2023年6月1日
    085
  • Open Physics

    1、开放物理计划。 开放物理计划,英文Open Physics。是AMD公司为自己的3A平台打造的物理模拟计算平台,以OpenCL为基础,由CPU+GPU联合计算完成。所谓&#82…

    技术杂谈 2023年5月31日
    097
  • JZ0047:二叉树剪支

    title:二叉树剪支 📃 题目描述 题目链接:二叉树剪支、相同题目 🔔 解题思路 第一种做法:dfs,思考方式是你站在一个点上怎么做,在一个点上,先看左子树是否要删除,再看看右子…

    技术杂谈 2023年7月24日
    075
  • 方法是什么

    什么是方法? System.out.println(),这是方法,输出语句的方法 这句语句就是调用系统System类中的标准输出对象out中的println()方法。 (类+对象+…

    技术杂谈 2023年6月21日
    0126
  • java本地缓存

    由于服务器、数据库、网络等资源有限,无法支撑越来越多的请求与计算量,所以将一部分数据放在缓存中,以此减小薄弱环节的计算量和请求流程。 网站中缓存的应用场景:1:可以缓存整个页面的h…

    技术杂谈 2023年7月11日
    053
  • 记录一下代码模版

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/qscqesze/p/15467312.htmlAuth…

    技术杂谈 2023年6月1日
    085
  • Vue_基础功能循环、计算、绑定、事件处理、组件

    1 DOCTYPE html> 2 <html lang="en" xmlns:v-bind="http://www.w3.org/199…

    技术杂谈 2023年7月24日
    079
  • IntelliJ IDEA – System.out.println shortcut

    https://www.websparrow.org/misc/intellij-idea-system-out-println-shortcut#:~:text=println%…

    技术杂谈 2023年5月31日
    0103
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球