4

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

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

那么如何确保连接到 Nest 的任何可用机器?试着打开一个连接,如果 TryConnect 不起作用,试试另一个?

4

3 回答 3

6

您可以在您的应用程序服务器(例如您的 Web 服务器)上运行本地 ES 实例并将其配置为负载均衡器:

  • 为此本地 ES 配置设置node.client: true(或node.master: falsenode.data: false)以使其成为负载均衡器。这意味着 ES 不会成为 master 也不会包含数据
  • 配置它加入集群(你的3个节点不需要知道这个ES)
  • 将 NEST 配置为使用本地 ES 作为搜索服务器

然后这个 ES 成为你集群的一部分,并将你的请求分发到合适的节点

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

于 2013-09-28T15:11:03.287 回答
1

由于您有一小部分节点,因此可以使用StaticConnectionPool

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);

要记住的重要一点是ConnectionSetting在创建新的弹性客户端时重用相同的内容,因为弹性搜索缓存是 per ConnectionSetting. 请参阅此 GitHub 帖子

...无论如何,在您实例化的任何弹性客户端之间共享相同的 ConnectionSettings 实例很重要。ElasticClient 可以是单例,也可以不是单例,只要每个实例共享相同的 ConnectionSettings 实例即可。

我们所有的缓存都是每个 ConnectionSettings,这包括序列化缓存。

单个 ConnectionSettings 还包含一个 IConnectionPool 和 IConnection ,您肯定希望跨请求重用它们。

于 2019-05-28T03:47:07.407 回答
0

我会将其中一个节点设置为负载均衡器。这意味着您正在调用的 URL 应该始终可用。

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

于 2013-07-18T17:28:33.807 回答