Laravel + Predis + Redis集群-已移动未连接到127.0.0.1:6379

Laravel + Predis + Redis集群-已移动未连接到127.0.0.1:6379,第1张

Laravel + Predis + Redis集群-已移动/未连接到127.0.0.1:6379 TL; DR:
  • 'cluster' => true
    创建一个处理多个节点的聚合客户端时应为true。
  • 'options' => ['cluster' => 'redis']
    需要作为
    default
    (而不是子)的同级添加到配置中,以告诉Predis处理Azure提供的服务器端群集
  • 如果将auth与服务器端群集一起使用,
    'options' => [ 'cluster' => 'redis', 'parameters' => ['password' => env('REDIS_PASSWORD', null)], ]
    则需要对新发现的群集节点进行身份验证。
全文

在redis配置中,您可以设置到多个redis实例的多个连接。该

cluster
选项告诉Laravel如何处理这些多个定义的连接。

如果

cluster
设置为
false
,Laravel将为
PredisClient
每个连接创建单独的实例。每个连接都可以单独访问,并且与另一个连接没有任何关系。

如果

cluster
设置为
true
,Laravel将
PredisClient
使用所有定义的连接创建一个聚合实例。如果没有其他配置,这就是一种“伪”集群。它使用客户端分片来分发密钥空间,并且可能需要外部监视和维护以确保适当的密钥负载平衡。

但是,您遇到的问题是,Azure实现了(大概是)真实的服务器端Redis群集,该群集处理密钥空间的自动分片。在这种情况下,节点相互了解并相互交谈,并且可能会上下波动。这是

MOVED
ASK
反应从何而来。

Predis
库可以自动处理这些响应,但是仅在您告知需要时才可以。在这种情况下,您需要告诉
Predis
客户端它需要处理集群,这是由Laravel通过配置中的
options
阵列完成的
redis

redis
配置上,
options
密钥应该是您的连接的同级(即
default
),而不是孩子。此外,选项应
key => value
成对指定。

因此,您的配置应如下所示:

'redis' => [    'cluster' => true,    'default' => [        'host' => env('REDIS_HOST', 'localhost'),        'password' => env('REDIS_PASSWORD', null),        'port' => env('REDIS_PORT', 6379),        'database' => 0,    ],    'options' => [        'cluster' => 'redis',    ],],

cluster
下键
redis
配置会告诉Laravel来创建聚合
PredisClient
可以处理多个节点的实例,而
cluster
下键
options
阵列会告诉实例它需要处理服务器端集群,而不是客户端集群。

验证码

原始连接参数(包括身份验证)不会与通过

-MOVED
-ASK
响应发现的新节点的连接共享。因此,您以前从
-MOVED
响应中得到的任何错误现在都将转换为
NOAUTH
错误。但是,服务器端
'cluster'
配置允许
'parameters'
同级,该同级定义了与新发现的节点一起使用的参数列表。在这里您可以将auth参数与新节点一起使用。

我相信这看起来像:

'redis' => [    'cluster' => true,    'default' => [        'host' => env('REDIS_HOST', 'localhost'),        'password' => env('REDIS_PASSWORD', null),        'port' => env('REDIS_PORT', 6379),        'database' => 0,    ],    'options' => [        'cluster' => 'redis',        'parameters' => ['password' => env('REDIS_PASSWORD', null)],    ],],

公平的警告,这就是我刚刚从研究和代码潜水中获得的所有信息。虽然我将Redis与Laravel结合使用,但尚未使用服务器端集群(因此),因此这可能仍然行不通。

我在研究时遇到了一些有用的信息:

Predis讨论连接到Redis集群的问题:https
//github.com/nrk/predis/issues/259#issuecomment-117339028

似乎您没有将Predis配置为使用redis-
cluster,而是将其与普通的旧客户端分片逻辑(这也是默认行为)一起使用。您应该配置客户端,将选项集群设置为值redis,以使客户端知道它必须与redis-
cluster一起使用。快速示例:

$client = new PredisClient([$node1, $node2, ...], ['cluster' =>'redis']);

这样做将使客户端可以自动处理来自Redis节点的-MOVED或-ASK响应。

MS文章讨论Redis缓存上的群集:https :
//docs.microsoft.com/zh-cn/azure/redis-cache/cache-how-to-premium-
clustering#how-do-i-connect-to-my-启用集群缓存

您可以使用与连接到未启用群集的缓存时使用的端点,端口和键相同的端点连接到缓存。Redis在后端管理集群,因此您不必从客户端进行管理。

用于创建
PredisClient
实例的Laravel代码:https
//github.com/laravel/framework/blob/v5.3.28/src/Illuminate/Redis/Database.php#L25-L66


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4973520.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-13
下一篇 2022-11-13

发表评论

登录后才能评论

评论列表(0条)

保存