对于其他弹性搜索开发者来说可能是一个非常容易(和愚蠢)的问题,这两者之间的区别是什么?
我从Java webapp连接到远程弹性搜索服务器,到目前为止我一直在使用TransportClient,但我想知道是否可以使用NodeBuilder,或者NodeBuilder应该只用于嵌入式客户端?
如果两者中的任何一个都可用于连接远程ES服务器,哪一个在内存和性能方面应该更好?
如果有人能指出我连接到远程ES服务器的NodeBuilder示例会很棒,因为我没有任何幸运的发现。
感谢。
答案 0 :(得分:28)
NodeBuilder也可用于连接群集。
Node node = nodeBuilder().clusterName("yourcluster").client(true).node();
Client client = node.client();
它将作为另一个节点加入群集,并将了解整个拓扑。使用节点,您可以使用多播来发现其他正在运行的节点。
我的意见是我更喜欢使用TransportClient
而不是NodeClient
,因为其他群集节点在TransportClient停止时不会收到无用的信息。当NodeClient停止时,每个节点必须知道即使他们不必管理它,因为它不包含任何数据。
另外,我在调试模式中看到NodeClient比TransportCLient启动更多Threads
。所以我认为TransportClient的内存占用较少。
顺便说一句,如果你使用Spring,你可以使用spring-elasticsearch工厂。如果没有,您可以随时查看源代码,了解我如何管理NodeClient与TransportClient。
希望这有帮助。
编辑2016-03-09 :NodeClient
不应该使用。如果需要,人们应该创建一个客户端节点(使用node.data: false
和node.master: false
启动弹性搜索节点)并使用TransportClient
在本地连接它。
答案 1 :(得分:18)
如果我正确理解文档,那么使用节点客户端是有益的,至少如果你有分片:
使用[Node]客户端的好处是运营的事实 自动路由到需要执行操作的节点 在,没有执行“双跃点”。例如,索引 操作将自动在它将结束的分片上执行 现存于。
VS
它[传输客户端]不加入群集,只是获得一个或多个初始 传输地址并以循环方式与它们通信 在每个动作上(虽然大多数动作可能是“两跳” 操作)。
正如我所解释的那样,使用加入集群然后使用该节点上的客户端的节点(最好将客户端设置为true),您将直接将请求发送到集群中的正确节点。
使用TransportClient,您将连接到任何节点,然后该节点将请求重定向(或可能转发请求,不确定)到正确的节点(“两跳”)
使用Node Client在网络流量和节点负载方面应该更有效率。
答案 2 :(得分:0)
此外,人们应该知道Node客户端加入了整个网状集群,并且也成为了一个代理服务器,因此其他客户端也可以连接到它,并且能够服务器插件站点,这在锁定集群时需要考虑。
节点客户端可用于进行分散收集,因此可以减轻数据节点的某些处理。
不确定传输客户端是否也会分散聚集。