elasticsearch 连接到NEST中的elasticsearch群集,elasticsearch,nest,elasticsearch,Nest" /> elasticsearch 连接到NEST中的elasticsearch群集,elasticsearch,nest,elasticsearch,Nest" />

elasticsearch 连接到NEST中的elasticsearch群集

elasticsearch 连接到NEST中的elasticsearch群集,elasticsearch,nest,elasticsearch,Nest,假设集群中有几个elasticsearch机器:192.168.1.1、192.168.1.2和192.168.1.3 任何一台机器都可能出故障。看起来NEST不支持提供一系列IP来尝试连接 那么,如何确保从Nest连接到任何可用的机器呢?只需尝试打开一个节点的连接,如果TryConnect不起作用,请尝试另一个?我会将其中一个节点设置为负载平衡器。这意味着你正在调用的URL应该一直处于打开状态 但是,如果增加副本的数量,则可以通过URL调用任何节点,并且仍然可以访问相同的数据。ElasticS

假设集群中有几个elasticsearch机器:192.168.1.1、192.168.1.2和192.168.1.3

任何一台机器都可能出故障。看起来NEST不支持提供一系列IP来尝试连接


那么,如何确保从Nest连接到任何可用的机器呢?只需尝试打开一个节点的连接,如果TryConnect不起作用,请尝试另一个?

我会将其中一个节点设置为负载平衡器。这意味着你正在调用的URL应该一直处于打开状态


但是,如果增加副本的数量,则可以通过URL调用任何节点,并且仍然可以访问相同的数据。ElasticSearch不关心您在集群中访问哪一个。因此,您可以在应用程序中构建自己的IP范围

您可以在应用服务器(如web服务器)上运行本地ES实例,并将其配置为负载平衡器:

  • 为此本地ES配置设置
    node.client:true
    (或
    node.master:false
    node.data:false
    ),使其成为负载平衡器。这意味着ES不会成为主数据,也不会包含数据
  • 配置它以加入集群(您的3个节点不需要知道这一点)
  • 配置NEST以使用本地ES作为搜索服务器
然后,这将成为集群的一部分,并将请求分发到合适的节点


如果您不需要“负载平衡器”,则必须在客户端手动检查以确定哪个节点处于活动状态。

由于您有一小组节点,因此可以使用:

var-uri1=新Uri(“192.168.1.1”);
var uri2=新Uri(“192.168.1.2”);
var uri3=新Uri(“192.168.1.3”);
var uris=新列表{uri1,uri2,uri3};
var connectionPool=新的静态连接池(URI);

var connectionSettings=新的connectionSettings(connectionPool);//如果起作用的“负载平衡器”发生故障怎么办?它在云中,所以云可以决定在没有任何警告的情况下重新启动任何机器。使用url,我希望避免公开公共url,并将所有内容保留在内部虚拟网络上。希望避免设置DNS服务器。例如,我可以有.1-.3台机器。我保证3个中有2个是正确的。但我不知道他们中的哪一个什么时候倒下。对我来说,客户端连接库需要处理这个问题(顺便说一句,我很确定Java客户端可以处理这个问题)。这肯定是一个不错的功能。如果不在云中,则不必公开URL。只需在服务器上进行内部绑定。但在您的情况下,我认为您必须手动构建一些可以做您想做的事情。对不起,我帮不上更多的忙:)那是个好主意!您认为如果我这样做,与尝试直接连接到服务器相比,在Web服务器上会有很多开销吗?有人知道这是否是NEST的作者批准的方法吗?@Sumrak这将消耗Web服务器上的一些内存,因为客户机节点负责收集数据节点的响应,并在其他节点之间进行排序。总之,这种方法与ES体系结构相关,而不是与嵌套相关,因此不会产生“大量开销”。NEST只是一个连接到节点并查询/索引数据的库。此处的节点可以是ES集群中的任何节点
var uri1 = new Uri("192.168.1.1");
var uri2 = new Uri("192.168.1.2");
var uri3 = new Uri("192.168.1.3");
var uris = new List<Uri> { uri1, uri2, uri3 };
var connectionPool = new StaticConnectionPool(uris);
var connectionSettings = new ConnectionSettings(connectionPool); // <-- need to be reused
var client = new ElasticClient(connectionSettings);