Elasticsearch Java API 客户端连接,有三种方式:一个是TransportClient,一个是NodeClient,还有一个XPackTransportClient。
-
TransportClient:
作为一个外部访问者,请求ES的集群,对于集群而言,它是一个外部因素。 -
NodeClient
作为ES集群的一个节点,它是ES中的一环,其他的节点对它是感知的。 -
XPackTransportClient:
服务安装了 x-pack 插件,ElasticsearchXPackClient中已经集成了TransportClient。
WARNING:
- 客户端版本应该和服务端版本保持一致
- TransportClient旨在被Java高级REST客户端取代,该客户端执行HTTP请求而不是序列化的Java请求。 在即将到来的Elasticsearch版本中将不赞成使用TransportClient,建议使用Java高级REST客户端。
- 上面的警告比较尴尬,但是在 5xx版本中使用还是没有问题的,可能使用rest 客户端兼容性更好做一些。
TransportClient和NodeClient两者的区别为:
- TransportClient作为一个外部访问者,通过HTTP去请求ES的集群,对于集群而言,它是一个外部因素。 NodeClient顾名思义,是作为ES集群的一个节点,它是ES中的一环,其他的节点对它是感知的,不像TransportClient那样,ES集群对它一无所知。
- NodeClient通信的性能会更好,但是因为是ES的一环,所以它出问题,也会给ES集群带来问题。
NodeClient可以设置不作为数据节点,在elasticsearch.yml中设置,这样就不会在此节点上分配数据。
TransportClient利用transport模块远程连接一个elasticsearch集群。它并不加入到集群中,只是简单的获得一个或者多个初始化的transport地址,并以轮询的方式与这些地址进行通信。
// on startup
Client client = new TransportClient()
.addTransportAddress(new InetSocketTransportAddress("host1", 9300))
.addTransportAddress(new InetSocketTransportAddress("host2", 9300));
// on shutdown
client.close();
注意,如果你有一个与elasticsearch集群不同的集群,你可以设置机器的名字。
Settings settings = ImmutableSettings.settingsBuilder()
.put("cluster.name", "myClusterName").build();
Client client = new TransportClient(settings);
//Add transport addresses and do something with the client...
你也可以用elasticsearch.yml文件来设置。
这个客户端可以嗅到集群的其它部分,并将它们加入到机器列表。为了开启该功能,设置client.transport.sniff为true。
Settings settings = ImmutableSettings.settingsBuilder()
.put("client.transport.sniff", true).build();
TransportClient client = new TransportClient(settings);
其它的transport客户端设置有如下几个:
// Parameter Description
client.transport.ignore_cluster_name:true代表忽略连接节点的集群名验证
client.transport.ping_timeout:ping一个节点的响应时间,默认是5s
client.transport.nodes_sampler_interval:sample/ping 节点的时间间隔,默认是5s
Reference
https://endymecy.gitbooks.io/elasticsearch-guide-chinese/content/java-api/client.html
https://elasticsearch.cn/article/380