记录一次es写数据延迟引发的问题

这篇具有很好参考价值的文章主要介绍了记录一次es写数据延迟引发的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

某天,项目中来了一个需求,简单描述下就是这样的:

全量查询业务系统mysql中某一张表的数据,灌入到es中

easy so much,索引设定一个字段versionTime,每天同步数据时塞入时间戳,之后根据条件,将不是这次的versionTime的数据删除,就完成了全量更新,并将这一天中业务系统可能发生的删除操作的数据在es中删除。

本以为结束了,但却忽略了一个问题,es有延迟,近实时搜索引擎不只是说说而已。结果就杯具了,60%以上的几率,最终存在于es中的数据只有一半左右,难以接受呀!接下来就是排查问题

排查问题的过程

因为数据量比较少,项目最近也要求轻量化,就没有部署到平台运行,而是用springboot整合的quartz框架完成,于是启动本地,打个断点,想看看批量写入后返回的啥(最初以为写数据出现了问题...),结果返回的正常,放掉断点,执行完后续代码后,一切正常,查看es,数据也对的上,一条没少。然后打着断点,试了个5 、6、 7、 8次之后,依然无法复现,最后排除了所有的可能,剩下唯一的不可能,难道断点有影响?

说干就干,去掉断点,试了两次之后,果然又出现了,es里面数据不全。

这下稍微想了想es的介绍,近实时搜索引擎,为啥是近实时而不是实时?这可真的有区别的,然后仔细查阅了资料,基本上可以断定,问题的原因就是es的更新延迟问题了。

接下来说下为啥有延时,延迟的本质在哪

延时的原因

首先要了解的一件事,ES的索引数据是写入到磁盘上的。但这个过程是分阶段实现的,因为IO的操作是比较费时的。整个过程大概如下:

写数据----->ES内存 buffer(缓存区)-------定期refresh成segment------>os系统文件缓冲区(在这里的数据对搜索可见)---->磁盘

而在这里还有个很重要的参数需要介绍一下,refresh_interval

refresh_interval默认为1s,可以通过 GET /index_name/_settings?include_defaults=true

命令查看,在返回中会看到类似这样的结果:

es数据延迟,elasticsearch,elasticsearch

 (由于返回的数据太多,只截取了部分,各位看官可以自行实验)

这也就是本人这次创建的索引并未指定refresh_interval参数,使用了默认的1s,最终导致,在写操作结束后,立马执行删除操作,由于新的versionTime还没能被检索到,所以就删掉了一部分数据

如何解决

解决的思路在于es写入的过程,首先第一个想到的是sleep个 2s,反正是定时任务,而且还是在基本无人使用的时间段更新数据,程序执行慢点也无所谓,但是刚冒出来就否了,首先太挫,其次如果后续有人改了refresh_interval参数,sleep个 2s也没卵用,于是就使用了第二种办法,保证被索引的文档能够立即被搜索到

保证被索引的文档能够立即被搜索到, 有两种方法:_refresh 或者_flush。

调用_refresh就可以立即实现内存->文件系统缓存, 从而使文档可以立即被搜索到。

flush,flush是用于translog的。

这次用了refresh解决问题。以下列出了java版本常用API设置刷新策略的方法

java high level client中,为index、insert、update、bulk 提供了setRefreshPolicy方法,用于设置数据更改后的刷新策略。
NONE("false"), // 默认;异步刷新,立即返回;
IMMEDIATE("true"), // 立即刷新,对es集群压力会比较大
WAIT_UNTIL("wait_for"); // 等刷新时返回,响应性不太好,

io.serchbox中 Bulk.Builder Index.Builder 的 refresh()方法文章来源地址https://www.toymoban.com/news/detail-716862.html

到了这里,关于记录一次es写数据延迟引发的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [Elasticsearch] ES更新问题踩坑记录,直面秋招

    基本可以定位是在es更新这块出问题了 看对应代码 final TableDocBean docBean = baseSearchService.getById(id); setValueForBean(afterColumns, docBean); log.info(“update table data to es: {}”, JSON.toJSONString(docBean)); baseSearchService.update(docBean); 代码先通过表id 获取对应ES文档,然后赋值 执行更新数据操作 这块

    2024年03月25日
    浏览(41)
  • ElasticSearch|ES 连接超时及创建连接失败问题定位过程记录

    socket.timeout:等待源端服务器响应超时 ConnectionRefusedError:尝试创建连接被拒绝 ES 集群中某个节点的 ES 主进程被杀(由于服务器内存不足导致),导致该节点 ES 重新拉起,报 “尝试创建连接被拒绝”; ES 集群中某个节点的服务器内存不足,导致该节点 ES 的 cache 被清空,E

    2024年02月04日
    浏览(35)
  • 记一次线上问题引发的对 Mysql 锁机制分析

    最近双十一开门红期间组内出现了一次因 Mysql 死锁导致的线上问题,当时从监控可以看到数据库活跃连接数飙升,导致应用层数据库连接池被打满,后续所有请求都因获取不到连接而失败 整体业务代码精简逻辑如下: 数据库实例监控: 当时通过分析上游问题流量限流解决后

    2024年02月05日
    浏览(41)
  • 【工作记录】springboot集成spring-data-elasticsearch访问es及问题解决

    ​ 前文我们介绍了通过可视化爬虫爬取新闻到Mysql库、基于docker-compose的elk集群部署及抽取mysql数据到es的过程,本文我们介绍通过集成springboot和spring-data-elasticsearch客户端完成连接es并查询数据的开发过程以及遇到的问题和解决方案,希望对大家能有所帮助,对文中内容有任何

    2023年04月10日
    浏览(31)
  • 一次不规范HTTP请求引发的nginx响应400问题分析与解决

    最近分析数据偶然发现nginx log中有一批用户所有的HTTP POST log上报请求均返回400,没有任何200成功记录,由于只占整体请求的不到0.5%,所以之前也一直没有触发监控报警,而且很奇怪的是只对于log上报的POST接口会存在这种特定用户全部400的情况,而对于其他接口无论POST还是

    2024年02月14日
    浏览(34)
  • ES6 数组解构时不加分号引发的问题

    由于没有在适当的行尾加上分号,导致下面的代码被误读: 被语法解释器解释成 上面这行代码并不会报错,并且会将末尾的 [4, 5, 6] 赋值给 [value1_1, value1_2, value1_3] 这样就引发了直接打印 [value1_1, value1_2, value1_3] 的结果不等于 myhandle(1, 2) 的返回值。 可以通过尝试下面的代码:

    2024年02月07日
    浏览(40)
  • Es 通过javaApi上传数据Long类型丢失精度的问题一次性解决

    通过 updateRequest.docAsUpsert(true) true 表示无匹配_id是插入数据,false 表示无匹配_id会抛出异常

    2024年02月15日
    浏览(35)
  • 记录一次使用unordered_set插入数据异常的问题

    问题和 unordered_set 有关,相关代码如下: 这些代码作为so提供给 程序A 调用,但是程序执行过程中发现,defined_task_variable 插入值后,printSet()方法应该遍历defined_task_variable,打印出其内部数据的,但实际上其打印出来的都是(null),且只在arm平台出现,且必现,但x86一切正常 相

    2024年04月08日
    浏览(33)
  • 记录一次es的性能调优

    成都的es集群经常出现告警,查看日志发现 这是 JVM 垃圾回收过程中的一条日志,表示在最近 38.6 秒内,JVM 进行了一次 GC (Garbage Collection) 的操作,回收垃圾所占用的内存。这条日志的含义是,在这次 GC 中,有很大一部分时间(38.3 秒)是用于处理 GC 相关的开销(例如标记垃

    2024年02月01日
    浏览(69)
  • 【SpringCloud】这一次终于使用MQ解决了Eureka服务下线延迟感知问题

    其实,“ 通过Redis手动更新Ribbon缓存来解决Eureka微服务架构中服务下线感知的问题 ”是一种解,但不是最优解 上一篇文章的标题是: 通过Redis手动更新Ribbon缓存来解决Eureka微服务架构中服务下线感知的问题 当时在文章的末尾就指出,使用Redis+AOP的方式有很多漏洞,只有在服

    2024年01月17日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包