복붙노트

[REDIS] AWS에 레디 스 클러스터와 Laravel 작동하게하는 방법

REDIS

AWS에 레디 스 클러스터와 Laravel 작동하게하는 방법

나는 레디 스의 클러스터 버전 (5.4) Laravel를 사용하는 것을 시도하고있다. 나는 지침과 같이이 게시물을 형성 다음 :

/*
|--------------------------------------------------------------------------
| Redis Databases
|--------------------------------------------------------------------------
|
| Redis is an open source, fast, and advanced key-value store that also
| provides a richer set of commands than a typical key-value systems
| such as APC or Memcached. Laravel makes it easy to dig right in.
|
 */

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

     'default' => [
            'host' => env('REDIS_HOST_1', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => 6379,
            'database' => 0,
     ],


    'clusters' => [
         'default' => [
            'host' => env('REDIS_HOST_1', '127.0.01'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => 6379,
            'database' => 0,
        ],
        'jobs' => [
            'host' => env('REDIS_HOST_2', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port'     => 6379,
            'database' => 0,
        ],
        'content' => [
            'host' => env('REDIS_HOST_3', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port'     => 6379,
            'database' => 0,
        ]
   ],

    'options' => [
        'cluster' => 'redis'
    ],
]

하지만 난이 오류가 계속

[2019-06-07 15:53:37] local.ERROR: Predis\Response\ServerException: MOVED 5873 127.0.0.1:7001 in /Users/Shared/dev/php/toters-api/vendor/predis/predis/src/Client.php:370 Stack trace: 
0 /Users/Shared/dev/php/toters-api/vendor/predis/predis/src/Client.php(335): Predis\Client->onErrorResponse(Object(Predis\Command\StringGet), Object(Predis\Response\Error)) 
1 /Users/Shared/dev/php/toters-api/vendor/predis/predis/src/Client.php(314): Predis\Client->executeCommand(Object(Predis\Command\StringGet)) 
2 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Redis/Connections/Connection.php(72): Predis\Client->__call('get', Array) 
3 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Redis/Connections/Connection.php(84): Illuminate\Redis\Connections\Connection->command('get', Array) 
4 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Cache/RedisStore.php(54): Illuminate\Redis\Connections\Connection->__call('get', Array) 
5 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Cache/Repository.php(84): Illuminate\Cache\RedisStore->get('cbwvtr3cxYIFP4H...') 
6 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Cache/Repository.php(68): Illuminate\Cache\Repository->get('cbwvtr3cxYIFP4H...') 
7 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Cache/CacheManager.php(305): Illuminate\Cache\Repository->has('cbwvtr3cxYIFP4H...') 
8 /Users/Shared/dev/php/toters-api/vendor/tymon/jwt-auth/src/Providers/Storage/IlluminateCacheAdapter.php(57): Illuminate\Cache\CacheManager->__call('has', Array) 
9 /Users/Shared/dev/php/toters-api/vendor/tymon/jwt-auth/src/Blacklist.php(74): Tymon\JWTAuth\Providers\Storage\IlluminateCacheAdapter->has('cbwvtr3cxYIFP4H...') 
10 /Users/Shared/dev/php/toters-api/vendor/tymon/jwt-auth/src/JWTManager.php(83): Tymon\JWTAuth\Blacklist->has(Object(Tymon\JWTAuth\Payload)) 
11 /Users/Shared/dev/php/toters-api/vendor/tymon/jwt-auth/src/JWTAuth.php(190): Tymon\JWTAuth\JWTManager->decode(Object(Tymon\JWTAuth\Token)) 
12 /Users/Shared/dev/php/toters-api/vendor/tymon/jwt-auth/src/JWTAuth.php(124): Tymon\JWTAuth\JWTAuth->getPayload('eyJ0eXAiOiJKV1Q...') 
13 /Users/Shared/dev/php/toters-api/app/Http/Middleware/TokenAuthentication.php(25): Tymon\JWTAuth\JWTAuth->authenticate('eyJ0eXAiOiJKV1Q...') 
14 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(148): App\Http\Middleware\TokenAuthentication->handle(Object(Illuminate\Http\Request), Object(Closure)) 
15 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) 
16 /Users/Shared/dev/php/toters-api/app/Http/Middleware/WeakEtagMiddleware.php(22): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) 
17 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(148): App\Http\Middleware\WeakEtagMiddleware->handle(Object(Illuminate\Http\Request), Object(Closure)) 

내 레디 스 코드는 여전히 다음과 같습니다 그래서 나는 모든 응용 프로그램 데이터를 변경하지 않은 참고 :

use Illuminate\Support\Facades\Redis;
..

Redis::set('key', 'val');

나는 위의 설정에서 기본을 제거하는 경우 또한, 다음처럼 보이도록 :

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

    'clusters' => [
         'default' => [
            'host' => env('REDIS_HOST_1', '127.0.01'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => 6379,
            'database' => 0,
        ],
        'jobs' => [
            'host' => env('REDIS_HOST_2', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port'     => 6379,
            'database' => 0,
        ],
        'content' => [
            'host' => env('REDIS_HOST_3', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port'     => 6379,
            'database' => 0,
        ]
   ],

    'options' => [
        'cluster' => 'redis'
    ],
]

나는이 오류

[2019-06-07 16:00:02] local.ERROR: Symfony\Component\Debug\Exception\FatalThrowableError: Type error: Argument 1 passed to Predis\Connection\Parameters::__construct() must be of the type array, integer given, called in /Users/Shared/dev/php/toters-api/vendor/predis/predis/src/Connection/Factory.php on line 164 in /Users/Shared/dev/php/toters-api/vendor/predis/predis/src/Connection/Parameters.php:34 Stack trace: 
0 /Users/Shared/dev/php/toters-api/vendor/predis/predis/src/Connection/Factory.php(164): Predis\Connection\Parameters->__construct(6379) 
1 /Users/Shared/dev/php/toters-api/vendor/predis/predis/src/Connection/Factory.php(84): Predis\Connection\Factory->createParameters(6379) 
2 /Users/Shared/dev/php/toters-api/vendor/predis/predis/src/Connection/Factory.php(118): Predis\Connection\Factory->create(6379) 
3 /Users/Shared/dev/php/toters-api/vendor/predis/predis/src/Client.php(135): Predis\Connection\Factory->aggregate(Object(Predis\Connection\Aggregate\RedisCluster), Array) 
4 /Users/Shared/dev/php/toters-api/vendor/predis/predis/src/Client.php(56): Predis\Client->createConnection(Array) 
5 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Redis/Connectors/PredisConnector.php(41): Predis\Client->__construct(Array, Array) 
6 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Redis/RedisManager.php(102): Illuminate\Redis\Connectors\PredisConnector->connectToCluster(Array, Array, Array) 
7 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Redis/RedisManager.php(83): Illuminate\Redis\RedisManager->resolveCluster('default') 
8 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Redis/RedisManager.php(61): Illuminate\Redis\RedisManager->resolve('default') 
9 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Cache/RedisStore.php(211): Illuminate\Redis\RedisManager->connection('default') 
10 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Cache/RedisStore.php(54): Illuminate\Cache\RedisStore->connection() 
11 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Cache/Repository.php(84): Illuminate\Cache\RedisStore->get('cbwvtr3cxYIFP4H...') 
12 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Cache/Repository.php(68): Illuminate\Cache\Repository->get('cbwvtr3cxYIFP4H...') 
13 /Users/Shared/dev/php/toters-api/vendor/laravel/framework/src/Illuminate/Cache/CacheManager.php(305): Illuminate\Cache\Repository->has('cbwvtr3cxYIFP4H...') 
14 /Users/Shared/dev/php/toters-api/vendor/tymon/jwt-auth/src/Providers/Storage/IlluminateCacheAdapter.php(57): Illuminate\Cache\CacheManager->__call('has', Array) 
15 /Users/Shared/dev/php/toters-api/vendor/tymon/jwt-auth/src/Blacklist.php(74): Tymon\JWTAuth\Providers\Storage\IlluminateCacheAdapter->has('cbwvtr3cxYIFP4H...') 
16 /Users/Shared/dev/php/toters-api/vendor/tymon/jwt-auth/src/JWTManager.php(83): Tymon\JWTAuth\Blacklist->has(Object(Tymon\JWTAuth\Payload)) 
17 /Users/Shared/dev/php/toters-api/vendor/tymon/jwt-auth/src/JWTAuth.php(190): Tymon\JWTAuth\JWTManager->decode(Object(Tymon\JWTAuth\Token)) 

따라서 오류 메시지에서이 Predis 단순히 내 클러스터 구성을 무시하고 기본에서 바로 읽기, 기본 내 클러스터 레디 스 데이터 저장소를 처리하는 방법을 알고하지 않는 것 같다. 아이디어?

해결법

  1. ==============================

    1.검색 및 디버깅 후,이 작동 만들어진 것입니다 :

    검색 및 디버깅 후,이 작동 만들어진 것입니다 :

    'redis' => [
        'client' => 'predis',
        'cluster' => true,
        'options' => [
            'cluster' => 'redis',
            'parameters' => [
                'host' => env('REDIS_DEFAULT_HOST', '127.0.01'),
                'password' => env('REDIS_PASSWORD', null),
                'port' => env('REDIS_DEFAULT_PORT', 6379),
                'database' => 0,
                ],
            ],
        'clusters' => [
             'default' => [
                'host' => env('REDIS_DEFAULT_HOST', '127.0.01'),
                'password' => env('REDIS_PASSWORD', null),
                'port' => env('REDIS_DEFAULT_PORT', 6379),
                'database' => 0,
            ],
            'jobs' => [
                'host' => env('REDIS_JOBS_HOST', '127.0.01'),
                'password' => env('REDIS_PASSWORD', null),
                'port' => env('REDIS_JOBS_PORT', 6379),
                'database' => 0,
            ],
            'content' => [
                'host' => env('REDIS_CONTENT_HOST', '127.0.01'),
                'password' => env('REDIS_PASSWORD', null),
                'port' => env('REDIS_CONTENT_PORT', 6379),
                'database' => 0,
            ],
            'options' => [
                'cluster' => 'redis'
            ],
        ]
    ]
    

    참고 : 위의 질문에 내 설정에서 하나의 명백한 실수는 내가 여기에 고정 호스트와 포트를 결합이었다. 이것은 무엇을 내 .env의 파일 외모와 같은 :

    REDIS_DEFAULT_HOST=127.0.0.1
    REDIS_JOBS_HOST=127.0.0.1
    REDIS_CONTENT_HOST=127.0.0.1
    
    REDIS_DEFAULT_PORT=7000
    REDIS_JOBS_PORT=7001
    REDIS_CONTENT_PORT=7002
    

    참고 : 여기의 지침을 사용하여 클러스터를 만들어 : https://redis.io/topics/cluster-tutorial#creating-the-cluster

    사실 그것 때문에 : 1. laravel는 /이에 대한 문서가 부족 predis 2. 스택 오버 플로우에 대한 답변의 대부분은 이러한 라인을 따라 있습니다 : 인터넷 검색 및 검색 후 ..이 무슨 일이 일어나고 있는지 많은 설명없이 날 위해 일 것입니다

    난 내가 위의 내 대답을 발견하는 방법을 보여 조금 도울 수 생각.

    이 버그를 해결하기 위해

    내 설정은 / database.php 형식이 단순히 잘못된 것을 깨달았다. 내가 코드에 Xdebug는 다이빙을 사용하기로 결정, 그래서 모든 것을 인터넷 검색을하는 것은 나에게 어떤 명확한 그림을 포기하지 않았다. 참고 : 항상 출력을 인쇄하는 동안 즉, 등 출력 /로 / 이상 스테핑 (I 한 문서 인쇄 (질문 위 참조) 오류 스택 추적을했고, 나는 디버그 단계를 통해 나를 안내 조감도로 그 사용 별도의 문서와 전성 검사 / 디버그 나침반과 같은 내 설정 / database.php)와 비교.

    파고 및 인쇄 한 후,이 건너 온 :

    [ *Locals ] [ Superglobals ] [ User defined constants ]
    
    - Locals at /Users/Shared/dev/php/toters-api/vendor/predis/predis/src/Client.php:55
    
     ▾ $options = (array [1])
      \
       ⬦ $options["cluster"] = (string [5]) `redis`
      /
     ▾ $parameters = (array [4])
      \
       ⬦ $parameters[0] = (string [14]) `127.0.0.1:7000`
       |
       ⬦ $parameters[1] = (null)
       |
       ⬦ $parameters[2] = (int) 6379
       |
       ⬦ $parameters[3] = (int) 0
      /
     ▾ $this = (Predis\Client [3])
      \
       ⬦ $this->connection = (null)
       |
       ⬦ $this->options = (null)
       |
       ⬦ $this->profile = (null)
      /
    

    내 .env의 파일의 내용으로이 비교 :

    REDIS_DEFAULT_HOST=127.0.0.1:7000
    REDIS_JOBS_HOST=127.0.0.1:7001
    REDIS_CONTENT_HOST=127.0.0.1:7002
    

    나는 형식이 내가 그렇게 대신에 같이 넣어 그래서 .. 나도 같은 ENV 변수의 호스트 및 포트를 넣으면 안됩니다, 잘못된 것을 깨달았다 :

    REDIS_DEFAULT_HOST=127.0.0.1
    REDIS_JOBS_HOST=127.0.0.1
    REDIS_CONTENT_HOST=127.0.0.1
    
    REDIS_DEFAULT_PORT=7000
    REDIS_JOBS_PORT=7001
    REDIS_CONTENT_PORT=7002
    

    그게 내 첫 번째 문제를 해결했다.

    위의 고정 된 후 나는이있어

    이 있었다 그것은 (오류 메시지가 명확하게 네이티브 레디 스 오류 메시지보다는 predis 오류 메시지 같은 몇 가지 비밀 라이브러리 래퍼 이후) 오류 메시지를 인터넷 검색의 문제였다 .. 나는이 대답을 발견, 매우 쉬웠다.

    나머지는 쉬웠다.

  2. from https://stackoverflow.com/questions/56497809/how-to-make-laravel-work-with-redis-cluster-on-aws by cc-by-sa and MIT license