2017-08-22 240 views
1

我的团队有一个使用Lumen(基于Laravel的微型框架)的项目。我们使用Predis连接我们的Redis集群并在其上运行一些队列作业。但有时(我们无法重新生产)系统将引发“中没有留在池中的连接为CLUSTER SLOTS ..”异常使用流明中的PRedis库时,池中没有任何连接留在池中用于Redis群集的群集插槽

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

任何一个有关于它的想法?非常感谢你!

回答

0

因为您只会间歇性地看到这些例外情况,所以'redis'配置中的超时值可能太低。我只能猜测,PHP和Redis服务器之间的网络流量突然减少,足以导致客户端连接超时(根据配置0.15秒后)。

的Predis客户端抛出留在池中没有连接的`CLUSTER SLOTS`当它无法获取槽从配置Redis的主机的所有映射(因为,据推测,他们都超时)。您可以通过设置一个非常小的超时值(如0.0001)来重现此行为。

尝试增加超时值并考虑监视网络中可能导致延迟的问题。