ES 异常写入解决流程

这篇具有很好参考价值的文章主要介绍了ES 异常写入解决流程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题说明
一天下午,在北京客户现场的同学反馈我们elasticsearch出现的大量的异常,他反馈说他使用多线程写入大量数据到elasticsearch集群时,隔一段时间之后就会出现CircuitBreakingException,多尝试几次后,他就把问题反馈到我们这边了

如何解决es的写入瓶颈,elastic search,elasticsearch,大数据,搜索引擎


解决思路
1.降低并发度
看到这个问题我首先想到的是减少写入的并发量,毕竟很明显是达到内存的阈值
ES 为了避免 OOM 会设置一些 circuit breaker (断路器),这些断路器的作用就是在内存不够的时候主动拒绝接下来的操作,而不是进一步的分配内存最终产生 OutOfMemoryError,断路器的作用就是保护整个进程不至于挂掉。
因此我就跟现场同学说,先把并发度降下来,我们是16个进程,先改为4个进程,发现问题还存在,于是我就跟现场同学说,把并发度降低为单线程,结果问题依然存在。
2.提高阈值
竟然降低并发解决不了,我们就想到能不能提高的elasticsearch熔断的阈值,给它更大的内存进行处理,当然这种方式是指标不治本的,于是我们参考官方熔断阈值设置,因此我将一些阈值动态的调大了,结果发现线程同学反馈问题依旧存在,调大了没有起到什么作用。而且过了一会,现场同学反馈我们集群状态变为yello了,出现了很多unassign的分片,而且此时kibana也变得很不稳定,经常性的卡死,同时还出现节点丢失的情况

如何解决es的写入瓶颈,elastic search,elasticsearch,大数据,搜索引擎

如何解决es的写入瓶颈,elastic search,elasticsearch,大数据,搜索引擎
3.尝试解决未分配分片
因为,于是就让现场同学停止写入,先等待集群状态恢复为green,决定先等半个小时,让es集群自动进行平衡,结果半小时之后,es集群并没有恢复,此时觉得问题有些大了,感觉集群出了较大的问题,于是我们尝试分析unassign的原因,于是使用Cluster allocation explain API对这些unassign的分片进行分析,分析结果如下 

如何解决es的写入瓶颈,elastic search,elasticsearch,大数据,搜索引擎


根据分析,大致是recover失败,超过了最大的尝试次数,建议我们通过手动的形式去处理,因此我们尝试通过Cluster reroute API进行手动迁移分片,当然是显而易见的失败了,错误如下

如何解决es的写入瓶颈,elastic search,elasticsearch,大数据,搜索引擎

 


4.限制集群节点的流量
虽然觉察到可能是由于GC引起了,但我们首先希望能够通过非重启的方法先暂时去解决,然后再去分析原因,最后在最终找到解决方案,
因为我们此时节点是黄的,此时集群的容错率很低,万一为了修改某些参数在重启的过程中,存在或者某一台节点出现问题,无法正常启动,导致数据数据丢失,不到万不得已,不会重建集群。
于是我们就想到控制节点的流量,降低传输的速度,于是我们就做了如下事情
1.取消有问题的副本
2.使用Index Recover设置集群传输的速度
indices.recovery.max_bytes_per_sec:限制每个节点的出栈入站流量,默认40mb,我们这里改为20mb;indices.recovery.max_concurrent_file_chunks:每次恢复并行发送的文件块请求的数量,默认为2,这里改为1
3.重新将副本设置为1
及时,这样问题还是没有解决,过了一会依旧出现了这样的问题
5.GC参数调整
虽然之前认为GC可能存在问题,但我认为GC是果,不是因,尝试去解决让GC不正常的问题,当然都失败了。
查看kibana的监控,找到出现问题节点的监控,图如下

如何解决es的写入瓶颈,elastic search,elasticsearch,大数据,搜索引擎


根据此图发现es节点内存占用率一直在上升,说明申请的内存大于回收的内存空间,那么到内存快满的时候还有请求进行,那么必然内存不足,触发CircuitBreakingException。那么此时会进行fullgc,导致节点假死,就出现图中的现象。
我们使用的是G1
因此,就这种情况我就提出了我的想法,能够提前GC,那么就能够降低内存不足状况的概率,当然这样子的话,GC会更加频繁,降低系统的吞吐量,对比现状,显然是保护es集群更加重要,于是我们就参照这个想法去调整G1回收器的参数
查询G1参数列表如下

如何解决es的写入瓶颈,elastic search,elasticsearch,大数据,搜索引擎

 


-XX:InitiatingHeapOccupancyPercent=30 默认为45%,这里是为了让垃圾回收器提前进入垃圾回收周期
-XX:G1ReservePercent=25% 默认10%,保留更多的内存空间,避免内存不足导致错误

重启集群
此时由于集群时yello状态,表明集群万一有一台重启失败或者出现意外,那么就势必导致数据丢失,因此必要要慎重。于是,我们跟现场同步进行沟通,指定重启步骤
1.提前修改所有节点的配置
2.将有问题的索引的副本设置为0
3.限制节点流程和传输,参考上面
4.禁止集群自动分配,避免因为重启导致集群重启导致分片自动分配,同时也为了数据快速恢复,参考Cluster-level shard allocation and routing settings

PUT _cluster/settings
{
 "persistent": {
   "cluster.routing.allocation.enable": "none"
 }
}

5.依次重启每一台几点
6.打开集群分片设置,设置策略为 "all"
7.恢复索引副本设置
上述步骤执行完成后,我们就等待集群恢复,发现副本能够正常恢复,同时并发写入也没有问题了,当然我们降低了并发度
总结
垃圾回收器改变带来的影响
一周前我们使用的垃圾回收器为CMS回收器,因为项目并发问题修改为G1,在使用CMS的时候这个问题并没有出现,但改成G1后出出现了
CMS和G1区别
CMS分为老年代和年轻代,当内存区域即将耗尽时会进行垃圾回收,回收时是线程停止的
G1内存是按region进行划分的,虽然也分年轻代和老年代,但并不严格,那块region是老年代或者新生代并非一成不变的,这是由垃圾回收器自动进行管理的,G1可以提供可预测的停顿,这是由region划分这个特性决定的
原因分析
索引数据体积过大,写入消耗内存过快,同时由于垃圾回收速度过慢,导致内存不停上涨,导致错误的发生
后续改进
1.由于应用直接多线程大量数据写入,导致es集群压力过大,中间缺少一层对写入流量进行控制,同时应当对集群进行压测,了解集群的写入状况,避免集群过载
2.GC改进,有上面总结,造成熔断的一个重要原因是垃圾回收过慢,为什么回收过慢,是因为我们设置-XX:MaxGCPauseMillis=200,这个参数表示最长垃圾回收时间,该属性设置过小,导致垃圾回收过慢,因此我们可以适当调大该属性,具体多少就该进行测试了
G1回收时并非我们常见那种对所有内存区域进行回收,而是选择一部分内存块进行回收,具体回收多少,有用户设置进行决定,这里由于设置过小,导致回收过慢,也是导致熔断的原因
参考
Elasticsearch新增节点引发CircuitBreakingException错误 - 御坂研究所
Elasticsearch Guide [8.6] | Elastic文章来源地址https://www.toymoban.com/news/detail-785905.html

到了这里,关于ES 异常写入解决流程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 使用docker安装elastic search[ES]和kibana

    使用docker安装elastic search和kibana,版本均为7.17.1 docker pull# 去dockerhub看具体版本,这里用7.17.1 临时安装生成文件# 参数说明 -d 后台启动 –name 起别名即:NAMES -p 9200:9200 将端口映射出来 elasticsearch的9200端口是供外部访问使用;9300端口是供内部访问使用集群间通讯 -e “discovery.

    2024年02月14日
    浏览(37)
  • 【ES】search_phase_execution_exception 出现这个异常的可能情况

    search_phase_execution_exception是Elasticsearch搜索期间可能出现的异常类型之一。当发生搜索期间的错误或异常时,Elasticsearch可能会抛出search_phase_execution_exception异常。下面列出了一些可能导致此异常的情况: 解析错误:如果您的搜索查询无法被正确解析,Elasticsearch可能会抛出sear

    2024年02月11日
    浏览(23)
  • 解决ES search.max_buckets参数问题

    Trying to create too many buckets. Must be less than or equal to: [65535] but was [65536]. This limit can be set by changing the [search.max_buckets] cluster level setting. 临时 解决办法: 或者   -------------------------------------------------------------------------------------------------------------------------------- 永久 解决方法:  或

    2024年02月11日
    浏览(37)
  • Java实现读取转码写入ES构建检索PDF等文档全栈流程

    之前已简单使用ES及Kibana和在线转Base64工具实现了检索文档的demo,并已实现WebHook的搭建和触发流程接口。 传送门: 基于GitBucket的Hook构建ES检索PDF等文档全栈方案 使用ES检索PDF、word等文档快速开始 总体思路:基于前面已经搭建的WebHook触发流程,接收到push更新消息之后,使用

    2024年03月10日
    浏览(50)
  • es-并发写入报错及解决

    众所周知,es经常被用于存储日志数据,其中在某些场景下,日志产生的时机不同,并且需要将多类具备关联关系的日志写入同一个document,就会带来同一个文档可能会被其它文档覆盖,或者missing等问题。 大家都知道es是不支持事务的,同时也不具备像关系型数据库那样可以

    2024年02月02日
    浏览(47)
  • ElasticSearch第十五讲 ES数据写入过程和写入原理以及数据如何保证一致性

    ES 数据并发冲突控制是基于的乐观锁和版本号的机制 一个document第一次创建的时候,它的_version内部版本号就是1;以后,每次对这个document执行修改或者删除操作,都会对这个_version版本号自动加1;哪怕是删除,也会对这条数据的版本号加1(假删除)。 对于更新操作 客户端对

    2024年02月12日
    浏览(32)
  • es sharding 文档数量超过最大限制,写入失败的4种解决方案

    es 插入数据的时候报错 failure in bulk execution: [0]: index [leopard_user.driver_work_detail_record], type [detail_info], id [xxx], message [ElasticsearchException[Elasticsearch exception [type=illegal_argument_exception, reason=number of documents in the index cannot exceed 2147483519]]], 超过了2^31次方 解决方案: 方案一 重新创建一个

    2024年02月03日
    浏览(64)
  • ES修改字段类型(elastic)

    有个需求是将es的一个date类型的字段改为string类型,经查阅资料发现es不支持直接修改字段类型,只能将原索引结构复制出来,然后单独修改某个字段的类型后,再去新建一个索引将这个结构填充进去,填充完复制原索引数据到新索引,进而使用新的索引(也可以删掉老的索

    2024年02月06日
    浏览(38)
  • 使用docker安装我们的ES启动时的异常解决

    一开始我启动失败,我一直是以为我们的内存大小分配的问题(es默认启动占用内存是2g): 但是我怎么看都不是这个问题,后来通过 docker logs ES023 查看日志才发现原来不是我们的内存大小的问题: 是我们没有给我们挂载的配置文件足够的权限,导致我们启动失败 我们只需使用

    2024年02月12日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包