ElasticSearch(ES) Connection reset by peer解决方案

最近使用ElasticSearch遇到一个坑,每天早上第一次使用ES的时候会报错,后面就正常了,去网上查了下资料,发现是因为ES底层用的HttpClient,它的keepalive设置成-1也就是用不断开,但服务器也是有超时时间的,如果这个连接一直没请求进来服务器就会断开该连接,这是在用HttpClient发请求就会报错。

# 查看超时时间(单位秒)
cat /proc/sys/net/ipv4/tcp_keepalive_time

解决办法有两个,一是设置keepalive小于服务器的超时时间,这样HttpClient会自己断开连接,下次再重连,由于SpringBoot没有提供设置改属性的地方,配置起来有点小麻烦,可以参考以下链接

方案二是发送心跳,下面贴出代码

@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) {

    }
}
经验分享 程序员 微信小程序 职场和发展