【问题标题】:Why do I get an exception when using Laravel redis cluster?为什么我在使用 Laravel redis 集群时会出现异常?
【发布时间】:2020-02-26 16:37:23
【问题描述】:

我正在尝试将我的 Laravel 应用程序配置为接受多个 redis 节点,但出现异常:

exception: "Predis\Response\ServerException"
file: "/home/vagrant/code/gryphon-laravel/vendor/predis/predis/src/Client.php"
line: 370
message: "MOVED 9576 10.225.25.33:6380"

产生异常的代码:

$user = Redis::get('anything');

.env

REDIS_CLUSTER=redis
REDIS_CLIENT=predis
CACHE_DRIVER=redis
QUEUE_DRIVER=redis
BROADCAST_DRIVER=redis

配置:database.php

[...]
'redis' => [
        'cluster' => true,
        'client' => env('REDIS_CLIENT', 'predis'),
        'clusters' => [
            'first' => [
                [
                    'host' => env('REDIS_HOST', 'localhost'),
                    'port' => env('REDIS_PORT', 6379),
                    'database' => 0,
                ]
            ],
            'second'=> [
                [
                    'host' => env('REDIS_HOST_2', 'localhost'),
                    'port' => env('REDIS_PORT_2', 6379),
                    'database' => 0,
                ]
            ],
            'third'=> [
                [
                    'host' => env('REDIS_HOST_3', 'localhost'),
                    'port' => env('REDIS_PORT_3', 6379),
                    'database' => 0,
                ],
            ]
        ],
        'options' => [
            'cluster' => env('REDIS_CLUSTER', 'predis'),
            'prefix' => Str::slug(env('APP_NAME', 'laravel'), '_').'_database_',
            'parameters' => [
                'password' => env('REDIS_PASSWORD', null),
            ],
        ],
        'default' => [
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'port' => env('REDIS_PORT', 6379),
            'database' => env('REDIS_DB', 0),
        ],
        'cache' => [
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'port' => env('REDIS_PORT', 6379),
            'database' => env('REDIS_CACHE_DB', 1),
        ]
    ],
[...]

我找了又找,但一无所获……

Docs这边有点含糊:

如果您的应用程序正在使用 Redis 服务器集群,您 应该在 Redis 的 clusters 键中定义这些集群 配置:

'redis' => [

'client' => env('REDIS_CLIENT', 'phpredis'),

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

],

【问题讨论】:

    标签: php laravel redis redis-cluster


    【解决方案1】:

    Predis 已被包的原作者放弃,可能会在未来的版本中从 Laravel 中删除。

    所以,我推荐安装php-ext phpredis

    .env:

    REDIS_CLIENT=phpredis
    

    【讨论】:

    • 切换到 phpredis 并进行多项更改以某种方式解决了问题。
    • @ka_lin 我有同样的问题,我使用 phpredis 作为客户端,我的 redis 数据库配置看起来像这样'redis' => [ 'client' => env('REDIS_CLIENT', 'phpredis'), 'clusters' => [ 'default' => [ [ 'host' => env('REDIS_HOST', 'localhost'), 'password' => env('REDIS_PASSWORD', null), 'port' => env('REDIS_PORT', 6379), 'database' => 0, ], ], ], 我正在使用 AWS Elasticache redis 集群模式,你能分享一下更改吗你在database.php中做了什么?
    • 'redis'=>['cluster'=>true,'client'=>env('R_CLIENT','predis'),'clusters'=>['default'=>[['host'=>env('R_H1','localhost'),'port'=>env('R_P',6379)],['host'=>env('R_H2','localhost'),'port'=>env('R_P2',6379)],['host'=>env('R_H3','localhost'),'port'=>env('R_P3',6379)]]],'options'=>['cluster'=>env('R_CLUSTER','redis'),'prefix'=>env('MIX_PREFIX','la_db_'),'parameters'=>['password'=>env('R_PW')],],'default'=>['host'=>env('R_HOST','127.0.0.1'),'port'=>env('R_PORT',6379),'password'=>env('R_PW',null)],'cache'=>'host'=>env('R_HOST','127.0.0.1'),'port'=>env('R_PORT',6379),'database'=>env('R_CACHE_DB',1)]]
    • @Akki 尽力缩小配置
    • @ka_lin 非常感谢,我昨天确实解决了这个问题,不幸的是,horizon does not support Cluster Redis 的队列有点违背了我建立集群的目标。不过非常感谢您的回复。
    【解决方案2】:

    文件配置/database.php

    $redisConnStr = env('REDIS_CONNECTION', '127.0.0.1:6379');
    
    $redis = [
        'client' => 'predis',
    ];
    
    $redisConnections = explode(',', $redisConnStr);
    if (count($redisConnections) === 1) {
    
        $params = explode(':', $redisConnections[0]);
    
        $redis = array_merge(
            $redis,
            [
                'cluster' => env('REDIS_CLUSTER', false),
    
                'default' => [
                    'host'     => $params[0] ?? '127.0.0.1',
                    'password' => env('REDIS_PASSWORD', null),
                    'port'     => (int)($params[1] ?? 6379),
                    'database' => env('REDIS_DATABASE', 0),
                ]
            ]
        );
    }
    else {
        $redisCacheCluster = [];
    
        foreach ($redisConnections as $conn){
            $params = explode(':', $conn);
            $redisCacheCluster[] = [
                'host'     => $params[0] ?? '127.0.0.1',
                'password' => env('REDIS_PASSWORD', null),
                'port'     => (int)($params[1] ?? 6379),
            ];
        }
    
        $redis             = array_merge(
            $redis,
            [
                'options'  => ['cluster' => 'redis'],
                'clusters' => [
                    'default' => $redisCacheCluster,
                ]
            ]
        );
    }
    
    'redis' => $redis,
    

    文件配置/cache.php

    'redis' => [
                'driver' => 'redis',
                'connection' => 'default',
            ],
    

    文件 .env

    REDIS_CONNECTION=127.0.0.1:6379, //all ips redis clusters
    

    【讨论】:

    • 基本上这意味着每个节点都应该在clusters.default中定义,不幸的是我得到了同样的错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 2019-10-08
    • 2020-06-29
    • 1970-01-01
    • 2013-03-20
    • 2021-08-18
    • 1970-01-01
    相关资源
    最近更新 更多