节点池编辑

节点池是 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);