最近使用ElasticSearch遇到一个坑,每天早上第一次使用ES的时候会报错,后面就正常了,去网上查了下资料,发现是因为ES底层用的HttpClient,它的keepalive设置成-1也就是永不断开,但服务器也是有超时时间的,如果这个连接一直没请求进来服务器就会断开该连接,这时再用HttpClient发请求就会报错。
# 查看超时时间(单位秒)
cat /proc/sys/net/ipv4/tcp_keepalive_time
解决办法有两个,一是设置keepalive小于服务器的超时时间,这样HttpClient会自己断开连接,下次再重连,由于SpringBoot没有提供设置改属性的地方,配置起来有点小麻烦,可以参考以下链接
ES ElasticSearch Connection reset by peer问题解决_阿里巴巴首席技术官的博客-CSDN博客
方案二是发送心跳,下面贴出代码
@Scheduled(fixedRate = 60 * 1000 * 5)
public void heartbeatToES() {
try {
RequestOptions requestOptions = RequestOptions.DEFAULT.toBuilder().build();
boolean result = restTemplate.getClient().ping(requestOptions);
log.info("es状态: {}", result);
} catch (Exception e) {
}
}