php - 在 Lumen 中使用 PRedis 库时,Redis 集群的集群槽池中没有连接

标签 php laravel redis lumen predis

我的团队有一个项目使用 Lumen(这是一个基于 Laravel 的微框架)。我们使用 Predis 连接我们的 Redis 集群并在其上运行一些队列作业。但有时(我们无法重现)系统会抛出“CLUSTER SLOTS in ..”异常中的池中没有剩余连接

[2017-08-17 14:05:35] bookmark.ALERT: Predis\ClientException: No connections 
left in the pool for `CLUSTER SLOTS` in 
....../vendor/predis/predis/src/Connection/Aggregate/RedisCluster.php:232 
Stack trace: 
#0 ....../vendor/predis/predis/src/Connection/Aggregate/RedisCluster.php(260): 
Predis\Connection\Aggregate\RedisCluster->queryClusterNodeForSlotsMap(NULL) 
#1 ....../vendor/predis/predis/src/Connection/Aggregate/RedisCluster.php(560): 
Predis\Connection\Aggregate\RedisCluster->askSlotsMap() 
...

我们调查了很长时间。我们认为问题可能出在 Laravel 的 Predis 库,以及它维护连接池的方式。这可能是因为 Redis 集群由于某种原因关闭了连接,但是 Predis 库在尝试建立连接时没有重新打开连接。

这是我们的集群设置结构:

'redis' => [
'client' => 'predis',

'clusters' => [
    // Setting for Queue
    'default' => [
        'options' => [ 'cluster' => 'redis' ],
        [
            'host' => 'xxx',
            'password' => 'xxx',
            'port' => 'xxx',
            'timeout' => 0.15,
            'read_write_timeout' => 0.15
        ],
        [
            'host' => 'xxx',
            'password' => 'xxx',
            'port' => 'xxx',
            'timeout' => 0.15,
            'read_write_timeout' => 0.15
        ],
        ...
    ]
]
]

有人知道吗?非常感谢!

最佳答案

因为您只是间歇性地看到这些异常,所以您的 'redis' 配置中的超时值可能太低了。我只能猜测 PHP 和 Redis 服务器之间网络上的流量突发会减慢通信速度,足以导致客户端连接超时(在 0.15 秒后,如配置的那样)。

Predis 客户端在无法从所有配置的 Redis 主机(大概是因为它们都超时了)。您可以通过设置非常小的超时值(例如 0.0001)来重现此行为。

尝试增加超时值并考虑监控网络是否存在导致延迟的问题。

关于php - 在 Lumen 中使用 PRedis 库时,Redis 集群的集群槽池中没有连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45807401/

相关文章:

php - 为什么这个 PDO 语句会默默地失败?

php - 如何更改socialengine4中的核心模块文件

Laravel: SQLSTATE[28000] [1045] 用户 'homestead' @'localhost' 拒绝访问

laravel - 如何在 Inertia.js 中操作浏览器 url?

php - 查询不起作用或有任何连接问题

c - 无法连接到redis服务器

azure - azure 上的 redis 跨部署是否持久?

PHP 删除数组键

neo4j - 如何缓存可为每个用户自定义的 channel 聚合提要?

php - Laravel - 使用一对多关系插入多个项目