最近刚做系统迁移,其中涉及到一套es环境,因为业务场景并不复杂,也不是主流程,所以之前一直用的是单点,但这次迁移计划直接用集群环境,在迁移后遇到了集群节点莫名连接超时导致重新选主的问题。
其中elasticsearch的版本为7.6.2
问题描述:
最开始是出现在链路监控上,连接es有超时情况发生
查看es日志发现elasticsearch集群每隔一段时间就会发生一次重新选主,在选主之前,会发现集群中节点通过9300连接有超时情况。
部分报错如下:
起初怀疑是配置哪里有问题,尝试修改了一些配置后,问题依旧。
但是发现有个共同点,就是出现问题,每次的时间是大致相同的,基本是2小时,后面去整理了下,基本是2h10m。
于是怀疑是哪里有什么参数把连接断掉了,网上查了好久,都没有类似的报错,其它环境因为是不同版本或者安装方式不同,也没有复现类似错误。
直到看到下面这篇文章:
在 Elasticsearch 中处理 NodeNotAvailableExceptions
在发现之前我们还进行了抓包,看到在异常的情况下,会有几次TCP重传的现象,后面才知道这是正常的重试流程。
如何解决:
修改内核参数,主要是下面这条,这个参数默认是7200,单位是秒,也就是2小时,代表2小时去检测一次tcp连接状态。
net.ipv4.tcp_keepalive_time=600
还有两个参数,默认是75和9,代表重试9次,每次间隔73,也就是11min,是不是发现和前面问题出现的时间能够对上了。
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 删除。