标签(空格分隔): ES


Java 客户端

节点客户端(node client):

节点客户端本身也是一个ES节点(一般不保存数据,不能成为主节点),它能以无数据节点身份加入到集群中。因为它是集群环境中的一个节点,所以它知道整个集群状态(所有节点驻留,分片分布在哪些节点等等), 可以把需要执行的操作自动路由到节点上,而少一个网络跃点。

Node node =  NodeBuilder.nodeBuilder().local(true).node() ;
Client client = node.client();
GetResponse getResponse = client.prepareGet(index, type, "2").get();
System.out.println(JSONObject.toJSONString(getResponse));

当你启动node时,你可以在你的项目/src/main/resources/elasticsearch.yml文件中定义简单的设置cluster.name或者明确地使用clusterName方法来加入到指定的集群中。

  • 使用elasticsearch.yml的方式
cluster.name: yourclustername
  • 通过Java的方式
 Node node =  NodeBuilder.nodeBuilder().clusterName("elasticsearch").local(true).node() ;

使用节点客户端的好处是,操作可以自动地路由到这些操作被执行的节点,而不需要执行双跳(double hop)。例如,索引操作将会在该操作最终存在的分片上执行。

当你启动了一个节点,最重要的决定是它是否将保有数据。大多数情况下,我们仅仅需要用到clients,而不需要分片分配给它们。这可以通过设置node.data为false或者设置node.local为true来简单实现。

Node node =  NodeBuilder.nodeBuilder().local(true).node() ;
Client client = node.client();

传输客户端(Transport Client)

作为更轻量的传输客户端能够请求到远程集群。它自己不加入集群,只是简单的获得一个或者多个初始化的transport地址,并以轮询的方式与这些地址进行通信。比较像传统的CS程序的架构,比如数据库连接。

Settings settings = Settings.builder().put("cluster.name", "my-application").build();
TransportClient transportClient = TransportClient.builder()
.settings(settings)
.build()
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("XXX.XXX.XXX.XXX"), 9300));

传输客户端可以嗅到集群的其他部分,并将它们加入到机器列表。为了开启该功能,可以设置client.transport.sniff为true。

其他的transfersport客户端设置有如下几个:

Parameter Description
client.transport.ignore_cluster_name true:忽略连接节点的集群名验证
client.transport.ping_timeout ping一个节点的响应时间,默认是5s
client.transport.nodes_sampler_interval sample/ping 节点的时间间隔,默认是5s

节点客户端与传输客户端的区别

  1. 第一种方式,相当于额外启动了一个ES的node节点,这个节点和集群中的其他节点没有任何区别。只是这个node是由我们编码控制的,可以设置这个node是不存数据的节点(没有特殊原因你就应该这个设置)。

  2. 第二种方法,相当于获取了所有node节点的client,发送请求的时候遍历当前可用的client(这里可用指的是可以连接,但是node本身不一定可用,比如node正在恢复中,还没有加入到集群,这就会产生问题。)跟方法一相比,方法二会产生双跳(double hop),即当前遍历到node1,但访问的数据在node2,请求先转发到node1,又由node1转发到node2。

  3. 遍历方式:每次请求通过AtomicInteger进行原子加1(超过最大值后设置为0),按当前可用client数取模。

  4. 获取当前可用client的方法:使用线程池,遍历当前可用client,如果client未连接,尝试进行一次连接,连接成功加入可用client中,如果client已经连接直接加入可用client。

  5. 可以通过设置client.transport.sniff是否为true,来设置是使用SimpleNodeSampler还是SniffNOdesSampler,默认是false,就是使用SimpleNodeSampler。具体实现在org.elasticsearch.client.transport.TransportClientNodesService 中。

  6. 简单的说,SimpleNodeSampler会限制当前可用client一定是在配置中设置的节点。而SniffNodesSampler会使用所有发现的client,即使这个client的node,不在配置中。

  7. 当集群中某个node挂掉之后,重新加入的时候,因为是通过判断client是否可以连接,而不是node是否可用,这会导致这个时候使用这个client发送请求的时候产生异常。而方法一不会,因为还没加入集群的node,对于自己创建的node来说是不可见的。

使用情况

  • 如果要将应用程序和Elasticsearch集群进行解耦,传输客户端是一个理想的选择。例如 如果你的应用程序需要快速的创建和销毁到集群的链接,传输客户端比节点客户端更"轻",因为它不是集群的

参考文档

  1. Elasticsearch: 权威指南
  2. elasticsearch 2种客户端的区别
  3. 客户端

ES Java 客户端的更多相关文章

  1. elasticsearch系列七:ES Java客户端-Elasticsearch Java client(ES Client 简介、Java REST Client、Java Client、Spring Data Elasticsearch)

    一.ES Client 简介 1. ES是一个服务,采用C/S结构 2. 回顾 ES的架构 3. ES支持的客户端连接方式 3.1 REST API ,端口 9200 这种连接方式对应于架构图中的RE ...

  2. Elasticsearch及java客户端jest使用

    本文使用Github中的Elasticsearch-rtf,已经集成了众多的插件,例如必须使用的中文分词等,可以简单的通过配置来启用中文分词.本文主要分为以下几部分: 1.配置和启用中文分词: 2.定 ...

  3. elasticsearch 口水篇(4)java客户端 - 原生esClient

    上一篇(elasticsearch 口水篇(3)java客户端 - Jest)Jest是第三方客户端,基于REST Api进行调用(httpClient),本篇简单介绍下elasticsearch原生 ...

  4. 《ElasticSearch6.x实战教程》之简单搜索、Java客户端(上)

    第五章-简单搜索 众里寻他千百度 搜索是ES的核心,本节讲解一些基本的简单的搜索. 掌握ES搜索查询的RESTful的API犹如掌握关系型数据库的SQL语句,尽管Java客户端API为我们不需要我们去 ...

  5. 《ElasticSearch6.x实战教程》之复杂搜索、Java客户端(下)

    第八章-复杂搜索 黑夜给了我黑色的眼睛,我却用它寻找光明. 经过了解简单的API和简单搜索,已经基本上能应付大部分的使用场景.可是非关系型数据库数据的文档数据往往又多又杂,各种各样冗余的字段,组成了一 ...

  6. zookeeper生产最广泛使用java客户端curator介绍及其它客户端比较

    关于zookeeper的原理解析,可以参见zookeeper核心原理详解,本文所述大多数实践基于对zookeeper原理的首先理解. Curator是Netflix公司开源的一个Zookeeper客户 ...

  7. 由Memcached升级到 Couchbase的 Java 客户端的过程记录(一)

    背景: 在项目启动的选用了Memcached 作为缓存服务器,采用了Xmemcached作为客户端.在项目中使用了Shiro,为了给 Shiro 配置缓存的时候,采用了开源代码   https://g ...

  8. java 客户端链接不上redis解决方案

    原文地址:http://blog.csdn.net/yingxiake/article/details/51472810 出现问题描述: 1.Could not get a resource from ...

  9. Solr JAVA客户端SolrJ 4.9使用示例教程

    http://my.oschina.net/cloudcoder/blog/305024 简介 SolrJ是操作Solr的JAVA客户端,它提供了增加.修改.删除.查询Solr索引的JAVA接口.So ...

随机推荐

  1. openjudge666:放苹果—题解

    (测试这里的markdown,同时也有纪念意义吧--第一次写的题解) 当时刚学递推的时候做的一道题 oj上的666题 666:放苹果 总时间限制: 1000ms 内存限制: 65536kB 描述 把M ...

  2. BZOJ1027 [HNOI2004]打鼹鼠 【dp】

    1207: [HNOI2004]打鼹鼠 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 3647  Solved: 1746 [Submit][Sta ...

  3. BZOJ [Ctsc2002] Award 颁奖典礼 解题报告

    [Ctsc2002] Award 颁奖典礼 Description IOI2002的颁奖典礼将在YONG-IN Hall隆重举行.人们在经历了充满梦幻的世界杯之后变得更加富于情趣.为了使颁奖典礼更具魅 ...

  4. AOJ.865 青铜莲花池 (BFS)

    AOJ.865 青铜莲花池 (BFS) 题意分析 典型的BFS 没的说 代码总览 #include <iostream> #include <cstdio> #include ...

  5. [学习笔记]2-SAT 问题

    (本文语言不通,细节省略较多,不适合初学者学习) 解决一类简单的sat问题. 每个变量有0/1两种取值,m个限制条件都可以转化成形如:若x为0/1则y为0/1等等(x可以等于y) 具体: 每个变量拆成 ...

  6. LCD显示屏原理与应用

    1.什么是LCD? (1)LCD(Liquid Crystal Display)俗称液晶.(2)液晶是一种材料,液晶这种材料具有一种特点:可以在电信号的驱动下液晶分子进行旋转,旋转时会影响透光性,因此 ...

  7. android Handler post sendMessage

    Handler 为Android操作系统中的线程通信工具,包为android.os.Handler. 与Handler绑定的有两个队列,一个为消息队列,另一个为线程队列.Handler可以通过这两个队 ...

  8. 快速搭建rabbitmq单节点并配置使用

    安装erlang环境 wget http://erlang.org/download/otp_src_20.3.tar.gz tar xf otp_src_20.3.tar.gz && ...

  9. 51nod 1190 最小公倍数之和 V2

    给出2个数a, b,求LCM(a,b) + LCM(a+1,b) + .. + LCM(b,b). 例如:a = 1, b = 6,1,2,3,4,5,6 同6的最小公倍数分别为6,6,6,12,30 ...

  10. 【洛谷 P2042】 [NOI2005]维护数列(自闭记第一期)

    题目链接 首先,这题我是没A的..太毒瘤了 题目本身不难,都是\(Splay\)的基操,但是细节真的容易挂. 调了好久自闭了,果断放弃.. 希望本节目停更. 放上最终版本 #include <c ...