복붙노트

[REDIS] Laravel + predis + 레디 스 클러스터 - 127.0.0.1:6379로 이동 / 연결 없음

REDIS

Laravel + predis + 레디 스 클러스터 - 127.0.0.1:6379로 이동 / 연결 없음

나는 세션 (predis 사용)에 사용되는 레디 스와 laravel (5.3) 응용 프로그램이 있습니다. 모든 것은 한 내가 (설정 / database.php에서 기본 접근법을 사용하여) 하나의 레디 스 노드를 사용하여 작동합니다. 최대한 빨리 시간의 50 %와 같은 이동 오류가 발생하기 시작하고 있지만 나는 레디 스 클러스터로 전환로 (어떻게 든되지 나는이 predis에 의해 관리되어야한다는 것을 이해 인터넷 검색을 기반으로하지만).

나는 true로 클러스터 매개 변수를 변경 시도,하지만 난 이상한 오류

No connection could be made because the target machine actively refused it. [tcp://127.0.0.1:6379] 

내가 사용이 푸른에 배포 된 것을 클러스터 레디 스 (그리고 .env의 파일을 통해 구성) 및 단일 노드를 사용하는 경우 매개 변수는 아무 문제없이 사용할 수 있지만.

구성

여기에 내가 가지고 있다는 laravel 구성입니다 (언급 한 바와 같이 이전, 그것은 표준 기본입니다)

'redis' => [

        'client' => 'predis',
        'cluster' => false,

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

    ],

레디 스를 들어, 나는 푸른 레디 스 캐시 클러스터 프리미엄 P1,이 개 파편이 사용 (여기에 설명 된대로).

업데이트 2

지금까지 나는 또한 설정의 다음과 같은 변화를 시도했다 :

모든 시간은 내가 이전 오류를 얻고있다 ...

내 레디 스 버전은 3.2이며, predis / predis 1.1.1 패키지

predis에 대한 설정 작업 1.1 이상

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

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

큰 모든 도움을 주셔서 감사합니다 :)

해결법

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

    1.레디 스 구성에서 여러 레디 스 인스턴스에 여러 연결을 설정할 수 있습니다. 클러스터 옵션은 이러한 여러 정의 연결을 처리하는 방법을 Laravel을 알려줍니다.

    레디 스 구성에서 여러 레디 스 인스턴스에 여러 연결을 설정할 수 있습니다. 클러스터 옵션은 이러한 여러 정의 연결을 처리하는 방법을 Laravel을 알려줍니다.

    클러스터가 false로 설정되어있는 경우, Laravel 각 연결에 대한 개별 \ Predis \ 클라이언트 인스턴스를 생성합니다. 각 연결은 개별적으로 액세스 할 수 있으며, 다른 연결에 어떤 관계가 없습니다.

    클러스터가 true로 설정되어있는 경우, Laravel는 정의 된 모든 연결을 사용하여 집계 \ Predis \ 클라이언트 인스턴스를 생성합니다. 다른 구성으로, 이것은 "가짜"클러스터의 일종이다. 그것은 키 스페이스를 배포하는 클라이언트 측 샤딩을 사용하고 적절한 키로드 밸런싱을 보장하기 위해 외부 모니터링 및 유지 보수가 필요할 수 있습니다.

    당신이로 실행중인 문제는, 그러나,이다 그 키 스페이스의 자동 샤딩을 처리 푸른 구현 (아마도) 실제 서버 측 레디 스 클러스터. 이 경우, 노드는 서로에 대해 알고 서로 이야기하고 아래로 이동하고있다. 이동 응답에서 온 ASK 곳이다.

    Predis 라이브러리는 자동으로 이러한 응답을 처리 할 수 ​​있지만, 당신이 그것을 말할 때만은 필요가있다. 이 경우, 당신은 클러스터링을 처리해야하는 Predis 클라이언트에게 필요하고 이것은 레디 스 구성에 대한 옵션 배열을 통해 Laravel하여 수행됩니다.

    레디 스 설정에서 옵션 키는 연결 (즉, 기본값)이 아닌 아이의 형제해야한다. 또한, 옵션 키 => 값 쌍으로 지정한다.

    그래서, 구성은 다음과 같은 모양입니다 :

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

    레디 스의 설정에 따라 클러스터 키를 여러 노드를 처리 할 수 ​​집계 Predis \ 클라이언트 인스턴스를 생성 Laravel을 말할 것이다, 및 옵션 배열에서 클러스터 키는 핸들 서버 측 클러스터링이 아닌 클라이언트 측을 필요로하는 해당 인스턴스를 말할 것이다 클러스터링.

    (인증 포함) 원래 연결 매개 변수는 이사를하고 -ASK 응답을 통해 발견 된 새로운 노드에 연결을 공유되지 않습니다. 그래서, 당신은 이전에 이사를 응답에서 가져온 오류는 이제 단지 NOAUTH 오류로 변환됩니다. 그러나 서버 측 '클러스터'구성은 새로 발견 된 노드와 함께 사용하기에 매개 변수의 목록을 정의하는 '매개 변수'형제 자매 수 있습니다. 새로운 노드와 함께 사용하기에 인증 매개 변수를 넣을 수있는 곳입니다.

    나는이 같이 보일 것으로 예상 :

    'redis' => [
        'cluster' => true,
    
        'default' => [
            'host' => env('REDIS_HOST', 'localhost'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', 6379),
            'database' => 0,
        ],
    
        'options' => [
            'cluster' => 'redis',
            'parameters' => ['password' => env('REDIS_PASSWORD', null)],
        ],
    ],
    

    공정 경고, 이것은 그냥 연구와 코드 다이빙에서받은 모든 정보입니다. 내가 Laravel와 레디 스를 사용하는 동안, 나는 서버 측 클러스터링을 (아직) 사용하지 않은,이 상태이므로 여전히 작동하지 않을 수 있습니다.

    정보의 몇 가지 유용한 조각 나는이 보는 동안 가로 질러 온 :

    Predis의 발행 레디 스 클러스터에 연결 토론 : https://github.com/nrk/predis/issues/259#issuecomment-117339028

    레디 스 캐시에 클러스터링을 논의 MS 기사 : https://docs.microsoft.com/en-us/azure/redis-cache/cache-how-to-premium-clustering#how-do-i-connect-to-my-cache-when-clustering-is- 사용 가능

    Predis \ 클라이언트 인스턴스를 생성 Laravel 코드 : https://github.com/laravel/framework/blob/v5.3.28/src/Illuminate/Redis/Database.php#L25-L66

  2. ==============================

    2.AWS elasticcache 레디 스 클러스터를 들어 위의 구성은하지 작업,하지만 다음 날 위해 노력하고 있습니다 않았다. 또한 문서에 언급 된 : https://laravel.com/docs/5.4/redis#configuration

    AWS elasticcache 레디 스 클러스터를 들어 위의 구성은하지 작업,하지만 다음 날 위해 노력하고 있습니다 않았다. 또한 문서에 언급 된 : https://laravel.com/docs/5.4/redis#configuration

    'redis' => [
        'client' => 'predis',
        'options' => [
            'cluster' => 'redis',
        ],
        'clusters' => [
            'default' => [
                [
                    'host' => env('REDIS_HOST', 'localhost'),
                    'password' => env('REDIS_PASSWORD', null),
                    'port' => env('REDIS_PORT', 6379),
                    'database' => 0,
                ],
            ],
        ],
    ],
    
  3. ==============================

    3.관련 : Laravel + 레디 스 캐시 SSL을 통해?

    관련 : Laravel + 레디 스 캐시 SSL을 통해?

    어떤에 내가 여기에 대답했습니다 https://stackoverflow.com/a/48876398/663058

    관련 자세한 사항은 아래 :

    클러스터링 및 TLS가 있다면 당신은 (AWS Elasticache 테스트)는 다음과 같은 설정이 필요합니다 :

    'redis' => [
            'client' => 'predis',
            'cluster' => env('REDIS_CLUSTER', false),
    
            // Note! for single redis nodes, the default is defined here.
            // keeping it here for clusters will actually prevent the cluster config
            // from being used, it'll assume single node only.
            //'default' => [
            //    ...
            //],
    
            // #pro-tip, you can use the Cluster config even for single instances!
            'clusters' => [
                'default' => [
                    [
                        'scheme'   => env('REDIS_SCHEME', 'tcp'),
                        'host'     => env('REDIS_HOST', 'localhost'),
                        'password' => env('REDIS_PASSWORD', null),
                        'port'     => env('REDIS_PORT', 6379),
                        'database' => env('REDIS_DATABASE', 0),
                    ],
                ],
                'options' => [ // Clustering specific options
                    'cluster' => 'redis', // This tells Redis Client lib to follow redirects (from cluster)
                ]
            ],
            'options' => [
                'parameters' => [ // Parameters provide defaults for the Connection Factory
                    'password' => env('REDIS_PASSWORD', null), // Redirects need PW for the other nodes
                    'scheme'   => env('REDIS_SCHEME', 'tcp'),  // Redirects also must match scheme
                ],
                'ssl'    => ['verify_peer' => false], // Since we dont have TLS cert to verify
            ]
        ]
    

    위의 설명 :

  4. ==============================

    4.[https://laravel.com/docs/5.5/redis]를 참조하십시오.

    [https://laravel.com/docs/5.5/redis]를 참조하십시오.

    반드시 적절한 라이브러리가 있는지 확인

    composer require predis/predis
    

    에서 설정 / database.php뿐만 아니라 설정 / queue.php [당신의 큐는 reddis 클러스터 사용하는 경우]

    'redis' => [
    
        'client' => 'predis',
        'options' => [
            'cluster' => 'redis',
        ],
        'clusters' => [
            'default' => [
                [
                    'host' => env('REDIS_HOST', 'localhost'),
                    'password' => env('REDIS_PASSWORD', null),
                    'port' => env('REDIS_PORT', 6379),
                    'database' => 0,
                ],
            ],
        ],
    
    ]
    
  5. ==============================

    5.이것은 나를 위해 일한 :

    이것은 나를 위해 일한 :

    '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'
            ],
        ]
    ]
    

    내가 거기에 도착하는 방법을보고, 여기에 내 대답을 참조

  6. from https://stackoverflow.com/questions/41091103/laravel-predis-redis-cluster-moved-no-connection-to-127-0-0-16379 by cc-by-sa and MIT license