假设我在群集中有几个弹性搜索机器:192.168.1.1,192.168.1.2和192.168.1.3
任何机器都可能宕机。看起来NEST不支持提供一系列IP来尝试连接。
那么我如何确保连接到Nest的任何可用机器?只是尝试打开一个连接,如果TryConnect不起作用,请尝试另一个?
答案 0 :(得分:7)
您可以在应用程序服务器(例如Web服务器)上运行本地ES实例,并将其配置为负载均衡器:
node.client: true
(或node.master: false
和node.data: false
),使其成为负载均衡器。这意味着ES不会成为主数据库,也不会包含数据然后,此ES将成为您的群集的一部分,并将您的请求分发到合适的节点
如果您不想要“负载均衡器”,则必须在客户端手动检查以确定哪个节点处于活动状态。
答案 1 :(得分:0)
我会将其中一个节点设置为负载均衡器。这意味着您正在调用的URL应始终正常运行。
虽然如果增加副本数量,您可以通过URL调用任何节点,但仍然可以访问相同的数据。 ElasticSearch不关心您在群集中访问哪一个。因此,您可以在应用程序中构建自己的ips范围。
答案 2 :(得分:0)
由于节点数量很少,因此可以使用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
,因为elasticsearch缓存是基于ConnectionSetting
的。 See this GitHub post:
...在任何情况下,共享相同的ConnectionSettings都很重要 您实例化的任何弹性客户端上的实例。 ElasticClient可以 是单身人士,还是没有,只要每个实例共享相同 ConnectionSettings实例。
我们所有的缓存均基于ConnectionSettings,包括 序列化缓存。
还有一个ConnectionSettings拥有一个IConnectionPool和 您肯定要在请求之间重用IConnection。