公司网站做门户备案,网站怎么更换服务器,做投资的网站,企业融资方案一、背景
由于要安装分词器插件#xff0c;所以需要重启ElasticSearch集群以使得新安装的插件生效
但是在重启集群的过程中#xff0c;服务端代码却出现了大量错误#xff0c;如下所示 java.net.ConnectException: Connection refused at org.elasticsearch.client.R…一、背景
由于要安装分词器插件所以需要重启ElasticSearch集群以使得新安装的插件生效
但是在重启集群的过程中服务端代码却出现了大量错误如下所示 java.net.ConnectException: Connection refused at org.elasticsearch.client.RestClient.extractAndWrapCause(RestClient.java:823) at org.elasticsearch.client.RestClient.performRequest(RestClient.java:248) at org.elasticsearch.client.RestClient.performRequest(RestClient.java:235) ......
基于此也引出一个潜在的可用性问题即代码没有做到可以平稳支持ElasticSearch集群的重启不局限于可预知的升级导致的重启包括集群自身不稳定导致的集群节点变化如某节点的CPU和内容过高、所在机柜或机房故障等不可预期情况
二、引入Sniffer
为了提高服务的可用性和稳定性引入Sniffer嗅探器
Sniffer
允许从正在运行的 Elasticsearch 集群中自动发现节点并将它们设置为现有 RestClient 实例的最小库默认使用节点信息API检索所属集群的交节点并使用jackson解析得到json数据与ElasticSearch 2.X及之后版本兼容。
添加Maven依赖以引入Sniffer如下所示 dependency groupIdorg.elasticsearch.client/groupId artifactIdelasticsearch-rest-client-sniffer/artifactId version7.6.2/version /dependency
Sniffer相关的JavaDoc可参看elasticsearch-rest-client-sniffer代码如下所示 // 失败嗅探监听器可保证在RestClient出现失败时立即更新集群的节点 SniffOnFailureListener sniffOnFailureListener new SniffOnFailureListener(); HttpHost httpHost port ! null ? new HttpHost(host, port, scheme) : HttpHost.create(host); RestClient client RestClient.builder(httpHost) .setFailureListener(sniffOnFailureListener) .build(); Sniffer sniffer Sniffer.builder(client) // 3 minutes, default 5 minutes定时更新集群的节点 .setSniffIntervalMillis(3 * 60 * 1000) // 30 seconds, default 1 minutes 在失败立即更新集群的节点后额外再次执行一次主动的更新行为 // 因为这个时间段内之前出问题的节点可能已经恢复进而可以被再次更新到节点中被使用 .setSniffAfterFailureDelayMillis(30 * 1000) .build(); sniffOnFailureListener.setSniffer(sniffer);
需要注意的是需要保证Sniffer和RestClient要具有相同的生命周期并且应该先于RestClient关闭如下所示 sniffer.close(); client.close();
也可通过以下方式更改是通过HTTP还是HTTPS并且可以设置请求超时时间避免因为拉取节点时间过长影响服务恢复的速度或恢复失败尽管设置超时时间后可能获得的节点数少于集群中的节点数 NodesSniffer nodesSniffer new ElasticsearchNodesSniffer( restClient, TimeUnit.SECONDS.toMillis(5), // 默认ElasticsearchNodesSniffer.DEFAULT_SNIFF_REQUEST_TIMEOUT ElasticsearchNodesSniffer.Scheme.HTTPS); // 若是HTTP协议则ElasticsearchNodesSniffer.Scheme.HTTP Sniffer sniffer Sniffer.builder(client) .setNodesSniffer(nodesSniffer).build();
也可以自定义获取节点的方法进而可以获取其他ElasticSearch数据源或做一些其他的扩展如下所示 NodesSniffer nodesSniffer new NodesSniffer() { Override public ListNode sniff() throws IOException { // 自行按需实现获取节点的逻辑 return null; } }; Sniffer sniffer Sniffer.builder(client) .setNodesSniffer(nodesSniffer).build();