节点池
编辑节点池编辑
节点池是 elasticsearch-php 使用的 elastic-transport-php 库的组件。
该组件负责维护当前节点列表。理论上,节点要么是死,要么是活。然而,在现实世界中,事情永远不会那么清晰。节点有时会处于一个“可能已死但未确认”,“超时但原因不明”或“最近已死但现在又活了”的灰色地带。节点池的工作就是管理这组难以管理的连接,并尝试为客户端提供最佳行为。
如果节点池无法找到可用的活节点来查询,它将返回一个 NoNodeAvailableException
。
默认情况下,重试次数等于集群中的节点数量。例如,您的集群可能包含 10 个节点。您执行一个请求,10 个节点中有 9 个由于连接超时而失败。第十个节点成功,查询执行。前九个节点被标记为已死,它们的“已死”计时器开始计时。
当下一个请求发送到客户端时,节点 1-9 仍然被认为是“已死”,因此它们被跳过。请求被发送到唯一已知的活节点(#10),如果该节点失败,则返回 NoNodesAvailableException
。
SimpleNodePool
是默认的节点池算法。它使用以下默认值:RoundRobin 作为 SelectorInterface
和 NoResurrect 作为 ResurrectInterface
。
循环算法按顺序选择节点,从数组中的第一个节点到最后一个节点。当到达最后一个节点时,它将从第一个节点重新开始。
节点的顺序在运行时随机化,以最大限度地利用所有主机。
NoResurrect
选项不会尝试恢复已标记为已死的节点。如果您愿意,您可以指定 ElasticsearchResurrect
类来检查已死的节点是否再次在线(恢复)。
您可以使用以下配置来启用 ElasticsearchResurrect
类
use Elastic\Transport\NodePool\Resurrect\ElasticsearchResurrect; use Elastic\Transport\NodePool\Selector\RoundRobin; use Elastic\Transport\NodePool\SimpleNodePool; $nodePool = new SimpleNodePool( new RoundRobin(), new ElasticsearchResurrect() ); $transport = TransportBuilder::create() ->setHosts(['localhost:9200']) ->setNodePool($nodePool) ->build();
使用自定义节点池、选择器和恢复编辑
如果您愿意,您可以实现自己的自定义节点池算法。我们提供了一个 NodePoolInterface
您还可以自定义节点池的选择器和恢复组件。您可以使用以下接口进行实现
有关节点池的更多信息,您可以阅读 elastic-transport-php 文档。
从配置哈希构建客户端编辑
为了帮助简化客户端的自动构建,所有配置都可以在设置哈希中提供,而不是直接调用各个方法。此功能通过 ClientBuilder::fromConfig()
静态方法公开,该方法接受配置数组并返回一个完全构建的客户端。
数组键对应于方法名称,例如 retries
键对应于 setRetries()
方法。
$params = [ 'hosts' => [ 'localhost:9200' ], 'retries' => 2 ]; $client = ClientBuilder::fromConfig($params);
未知参数会抛出异常,以帮助用户找到潜在的问题。如果不需要此行为(例如,您将哈希用于其他目的),您可以在 fromConfig() 中设置 $quiet = true
来静默异常。
$params = [ 'hosts' => [ 'localhost:9200' ], 'retries' => 2, 'imNotReal' => 5 ]; // Set $quiet to true to ignore the unknown `imNotReal` key $client = ClientBuilder::fromConfig($params, true);