23

对于其他弹性搜索开发人员来说,这可能是一个非常简单(而且很愚蠢)的问题,这两者有什么区别?

我正在从 Java webapp 连接到远程弹性搜索服务器,到目前为止我一直在使用 TransportClient,但我想知道 NodeBuilder 是否可以用于,或者 NodeBuilder 是否应该仅用于嵌入式客户端?

如果两者中的任何一个都可以用来连接远程ES服务器,那么从内存和性能上来说,哪一个应该更好呢?

如果有人可以向我指出连接到远程 ES 服务器示例的 NodeBuilder,那就太好了,因为我没有幸运地找到一个。

谢谢。

4

3 回答 3

30

NodeBuilder 也可以用来连接集群。

Node node = nodeBuilder().clusterName("yourcluster").client(true).node();
Client client = node.client();

它将作为另一个节点加入集群,并将了解整个拓扑。使用节点,您可以使用多播来发现其他正在运行的节点。

我的观点是我更喜欢使用TransportClient而不是NodeClient因为当 TransportClient 停止时其他集群节点不会收到无用的信息。当 NodeClient 停止时,每个节点都必须知道这一点,即使他们不必管理它,因为它不保存任何数据。此外,我在调试模式下看到 NodeClientThreads比 TransportCLient 启动更多。所以我认为 TransportClient 的内存占用更少。

顺便说一句,如果您使用的是 Spring,则可以使用spring-elasticsearch工厂。如果没有,您可以随时查看源代码以了解我如何管理 NodeClient 与 TransportClient。

希望这可以帮助。

编辑 2016-03-09NodeClient不应使用。如果需要,人们应该创建一个客户端节点(使用node.data: falseand启动一个 elasticsearch 节点node.master: false)并使用 aTransportClient在本地连接到它。

于 2013-03-14T08:47:33.677 回答
18

如果我正确理解了文档,那么使用 Node Client 是有好处的,至少在你有分片的情况下:

使用 [Node] 客户端的好处是操作会自动路由到需要执行操作的节点,而无需执行“双跳”。例如,索引操作将在最终存在的分片上自动执行。

对比

它 [传输客户端] 不加入集群,而只是获取一个或多个初始传输地址并在每个操作上以循环方式与它们通信(尽管大多数操作可能是“两跳”操作)。

正如我所解释的那样,使用加入集群的节点(最好将客户端设置为 true)然后在该节点上使用客户端,您将直接向集群中的正确节点发送请求。

使用 TransportClient,您将连接到任何节点,然后该节点会将请求重定向(或可能转发请求,不确定)到正确的节点(“两跳”)

就网络流量和节点负载而言,使用 Node Client 应该更有效。

于 2013-05-22T12:11:39.613 回答
0

人们还应该知道 Node 客户端加入全网状集群并成为代理,因此其他客户端也可以连接到它并且还能够服务器插件站点,这在锁定集群时需要考虑。

节点客户端可用于进行分散收集,因此可以减轻数据节点的一些处理。

不确定传输客户端是否也分散收集。

于 2014-08-28T13:25:26.210 回答