[REDIS] AWS에 레디 스 클러스터와 Laravel 작동하게하는 방법
REDISAWS에 레디 스 클러스터와 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.검색 및 디버깅 후,이 작동 만들어진 것입니다 :
검색 및 디버깅 후,이 작동 만들어진 것입니다 :
'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 오류 메시지 같은 몇 가지 비밀 라이브러리 래퍼 이후) 오류 메시지를 인터넷 검색의 문제였다 .. 나는이 대답을 발견, 매우 쉬웠다.
나머지는 쉬웠다.
from https://stackoverflow.com/questions/56497809/how-to-make-laravel-work-with-redis-cluster-on-aws by cc-by-sa and MIT license
'REDIS' 카테고리의 다른 글
[REDIS] 레디 스 지연에서 루프 가져 오기 항목의 경우 (0) | 2020.01.03 |
---|---|
[REDIS] 효율적인 방법은 세트 구성원 업데이트를 레디 스 (0) | 2020.01.03 |
[REDIS] 클러스터 장애 조치 (0) | 2020.01.03 |
[REDIS] 사용자 매칭 알고리즘 (0) | 2020.01.03 |
[REDIS] ENV 통행하지 않도록 곳 ENV 변수의 잘못된 URI를 넣어 URL 변수를 레디 스 레디 스 (URI하지?) : (URI :: InvalidURIError) (0) | 2020.01.03 |