节点池

编辑

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