节点池
编辑节点池
编辑节点池是 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();
使用自定义 NodePool、Selector 和 Resurrect
编辑如果需要,您可以实现自己的自定义节点池算法。我们提供了 NodePoolInterface
您还可以自定义节点池的 Selector 和 Resurrect 组件。您可以使用以下接口进行实现
有关节点池的更多信息,您可以阅读 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);