前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【ES三周年】2h10min就进行一次莫名选主异常

【ES三周年】2h10min就进行一次莫名选主异常

原创
作者头像
大侠之运维
发布2023-02-20 18:18:32
3320
发布2023-02-20 18:18:32
举报
文章被收录于专栏:大侠之运维大侠之运维

最近刚做系统迁移,其中涉及到一套es环境,因为业务场景并不复杂,也不是主流程,所以之前一直用的是单点,但这次迁移计划直接用集群环境,在迁移后遇到了集群节点莫名连接超时导致重新选主的问题。

其中elasticsearch的版本为7.6.2

问题描述:

最开始是出现在链路监控上,连接es有超时情况发生

pinpoint链路监控
pinpoint链路监控

查看es日志发现elasticsearch集群每隔一段时间就会发生一次重新选主,在选主之前,会发现集群中节点通过9300连接有超时情况。

部分报错如下:

应用日志
应用日志

起初怀疑是配置哪里有问题,尝试修改了一些配置后,问题依旧。

但是发现有个共同点,就是出现问题,每次的时间是大致相同的,基本是2小时,后面去整理了下,基本是2h10m。

于是怀疑是哪里有什么参数把连接断掉了,网上查了好久,都没有类似的报错,其它环境因为是不同版本或者安装方式不同,也没有复现类似错误。

直到看到下面这篇文章:

在 Elasticsearch 中处理 NodeNotAvailableExceptions

在发现之前我们还进行了抓包,看到在异常的情况下,会有几次TCP重传的现象,后面才知道这是正常的重试流程。

如何解决:

修改内核参数,主要是下面这条,这个参数默认是7200,单位是秒,也就是2小时,代表2小时去检测一次tcp连接状态。

代码语言:javascript
复制
net.ipv4.tcp_keepalive_time=600

还有两个参数,默认是75和9,代表重试9次,每次间隔73,也就是11min,是不是发现和前面问题出现的时间能够对上了。

代码语言:javascript
复制
net.ipv4.tcp_keepalive_intvl=60 
net.ipv4.tcp_keepalive_probes=3

所以问题就是,在2小时一次的检测时发现,之前用于集群间通信的tcp连接已经断开了,所以节点间连接超时,从而发生了重新选主。

解决办法就是将上述检测间隔时间调整为600,这个时间间隔取决于底层设备的配置。也就是说是什么断开了这个连接,这个时间是多久,我们将这个设备暂且定义为是一个防火墙,这个防火墙会跟踪你的tcp连接,由于所有这些连接跟踪都会占用内存,因此将丢弃不再使用的连接。防火墙不会通知另一端它已经这样做了!防火墙对此有一个超时,通常设置为 1 到 6 小时之间的任何时间。如果此连接的任何数据包在超时后仍然到达,防火墙将说“对不起,您说您属于连接 X,但我对连接 X 一无所知”并静默丢弃数据包,再次不让发送方知道。至少我们的防火墙是这样做的。

所以将配置调整为600秒,可以更早的知道tcp连接已经断开,尽快去替换为新的连接。

其实关于这个长连接的提醒,在es的官方文档中其实是有介绍的。

更多具体的介绍可以参考上述文章,有更详细的介绍,但是这个问题,在8.0版本中并没有出现,不知道是不是做了什么优化。

原文首发于本人公众号:【大侠之运维】

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档