假设我在一个集群中有几台 elasticsearch 机器:192.168.1.1、192.168.1.2 和 192.168.1.3
任何机器都可能停机。看起来 NEST 不支持提供一系列 IP 来尝试连接。
那么如何确保连接到 Nest 的任何可用机器?试着打开一个连接,如果 TryConnect 不起作用,试试另一个?
假设我在一个集群中有几台 elasticsearch 机器:192.168.1.1、192.168.1.2 和 192.168.1.3
任何机器都可能停机。看起来 NEST 不支持提供一系列 IP 来尝试连接。
那么如何确保连接到 Nest 的任何可用机器?试着打开一个连接,如果 TryConnect 不起作用,试试另一个?
您可以在您的应用程序服务器(例如您的 Web 服务器)上运行本地 ES 实例并将其配置为负载均衡器:
node.client: true
(或node.master: false
和node.data: false
)以使其成为负载均衡器。这意味着 ES 不会成为 master 也不会包含数据然后这个 ES 成为你集群的一部分,并将你的请求分发到合适的节点
如果您不想要“负载均衡器”,那么您必须在客户端手动检查以确定哪个节点处于活动状态。
由于您有一小部分节点,因此可以使用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 ,您肯定希望跨请求重用它们。
我会将其中一个节点设置为负载均衡器。这意味着您正在调用的 URL 应该始终可用。
虽然如果您增加副本的数量,您可以通过 URL 调用任何节点并仍然访问相同的数据。ElasticSearch 不关心您在集群中访问哪一个。因此,您可以在应用程序中构建自己的 ips 范围。