Java连接elasticsearch

本文介绍了通过Java连接Elasticsearch的两种主要方式:一种是创建一个node节点加入集群;另一种是通过TransportClient连接集群。文章详细解释了这两种方式的工作原理、优缺点,并探讨了在特定场景下可能出现的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java连接elasticsearch有两种方式

  1. 创建一个node来加入集群,通过node获取client。
  2. 通过TransportClient来连接集群。

通过第一种来连接elasticsearch相当于在自己本机上又启动了一个es的node节点,这个节点是我们通过代码来控制,我们没什么特殊原因的情况下就应该吧这个节点设置为不存在的,这个节点的配置也是通过elasticsearch.xml配置,也可以在创建的时候设置node参数。

    Setting setting = ImmutableSettings.settingBuilder().put("client.transport.ping_timeout",1000)
 .put("timeout",1)
.putArray("discovery.zen.ping.unicast.hosts", "l-flightdev18.f.dev.cn0.qunar.com:9300", "l-flightdev17.f.dev.cn0.qunar.com:9300")
.build();

通过第二种方法连接es的时候相当于得到了所有node节点的client,发送请求的时候就可以遍历当前可用的client。

会产生双跳,例如当前遍历到node1,但是要访问的数据在node2,这样请求会先发到node1,然后node1转发到node2.


遍历的方式:每次请求通过AtomicInteger进行原子加1(超出最大值设为0)。

获取当前可用client的方式:使用线程池来遍历所有的client,如果client没有连接,那么就尝试一次连接,连接成功就可加入可用的client中,如果client已连接那么直接加入可用的client。
可以通过设置蚕食clent.transport.sniff是否为true,来设置是用simpleNodeSample还是SniffNodesSamler(默认是false),即SimpleNodeSample。

SimpleNodeSampler会限制当前空client一定在配置中设置的节点中,而SniffNodesSampler会使用所有发现的client,即使这个client的node不在配置中也会去使用。

Settings settings = ImmutableSettings.settingsBuilder()                .put("client.transport.sniff", true)
.put("cluster.name", ES_CLUSTER_NAME).build();
TransportClient client= new TransportClient(settings);
for (String cluster : StringUtils.split(clusters,",")) {
    client.addTransportAddress(new InetSocketTransportAddress("host1", 9300))
    .addTransportAddress(new InetSocketTransportAddress("host2", 9300));
    }

方法二有个问题,就是当集群中某个node挂掉之后,重新加入的时候,因为是通过判断client是否可以连接,而不是node是否可用,这会导致这个时候使用这个client发送请求的时候产生异常。而方法一不会,因为还没加入集群的node,对于自己创建的node来说是不可见的。gitbub上有对这个问题的讨论:https://github.com/elastic/elasticsearch/issues/11202

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值