我已经建立了一个由三个 flex 搜索节点组成的集群,所有这些节点都符合资格,最低要求为2个。我已经配置了一个客户端,然后使用下面的代码使用具有静态连接池的低级客户端批量上传。
我要测试的是实时故障转移方案,即以三个可用节点启动客户端,然后随机删除一个(关闭虚拟机),但保持两个正常。但是我没有看到我期望的行为,它一直在尝试死节点。实际上,它似乎需要大约60秒才能移至下一个节点。
我希望它能做的是一次失败的尝试,并将该节点标记为可能已死,但至少要移至下一个节点。奇怪的是,如果我仅使用列表中三个可用节点中的两个来启动应用程序,或者只是在测试过程中停止了 flex 搜索服务而不是断电时,就会得到这种行为。
是否有正确的方法来处理这种情况并使它尽快移至下一个可用节点?还是在重新发布之前我需要在代码中退后长达60秒?
var nodes = new[]
{
new Node(new Uri("http://172.16.2.10:9200")),
new Node(new Uri("http://172.16.2.11:9200")),
new Node(new Uri("http://172.16.2.12:9200"))
};
var connectionPool = new StaticConnectionPool(nodes);
var settings = new ConnectionConfiguration(connectionPool)
.PingTimeout(TimeSpan.FromSeconds(10))
.RequestTimeout(TimeSpan.FromSeconds(20))
.ThrowExceptions()
.MaximumRetries(3);
_lowLevelClient = new ElasticLowLevelClient(settings);
接下来,我将以下内容包装在try catch中,在我认为尝试失败并恢复为错误策略之前,我最多重试3次。
ElasticsearchResponse<Stream> indexResponse = _lowLevelClient.Bulk<Stream>(data);
任何输入表示赞赏,
谢谢。
最佳答案
客户端的测试包括the API conventions documentation is generated从故障转移方案的测试。具体来说,请看retry和failover文档
使用StaticConnectionPool
,可以向其发出请求的节点是静态的,并且从不刷新以反射(reflect)可能会加入并离开集群的节点,但是,如果返回错误响应,它们将被标记为死亡,并将被取出用于在可配置的死区上执行请求的旋转 Angular ,由连接设置上的DeadTimeout
和MaxDeadTimeout
控制。
响应上的审核跟踪应提供给定请求发生的时间线,这最容易通过response.DebugInformation
看到。作为Tests项目的一部分的Virtual Clustering测试工具(an example)可能有助于确定所遵循行为的正确设置。
关于elasticsearch - 如何使用低级.net Elasticsearch客户端处理群集节点的突然丢失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46732833/