在Lumen

时间:2017-08-22 00:50:16

标签: php laravel redis lumen predis

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

[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
        ],
        ...
    ]
]
]

有人对此有所了解吗?非常感谢你!

1 个答案:

答案 0 :(得分:0)

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

当无法从所有获取插槽映射时,Predis客户端会抛出 池中没有“CLUSTER SLOTS” 的连接配置的Redis主机(因为,大概是它们都超时了)。您可以通过设置一个非常小的超时值(如0.0001

来重现此行为

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