Redis
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> Redis

Cụm Laravel + predis + Redis - ĐÃ CHUYỂN / không có kết nối đến 127.0.0.1:6379

TL; DR:

  • 'cluster' => true phải đúng khi tạo một ứng dụng khách tổng hợp xử lý nhiều nút.
  • 'options' => ['cluster' => 'redis'] cần được thêm vào cấu hình dưới dạng anh em của default (không phải trẻ em) để yêu cầu Predis xử lý phân cụm phía máy chủ do Azure cung cấp.
  • nếu sử dụng xác thực với phân nhóm phía máy chủ, 'options' => [ 'cluster' => 'redis', 'parameters' => ['password' => env('REDIS_PASSWORD', null)], ] sẽ cần thiết để xác thực các nút cụm mới được phát hiện.

Toàn văn

Trong cấu hình redis, bạn có thể thiết lập nhiều kết nối với nhiều phiên bản redis. Cụm cluster tùy chọn cho Laravel biết cách xử lý nhiều kết nối đã xác định đó.

If cluster được đặt thành false , Laravel sẽ tạo \Predis\Client riêng lẻ phiên bản cho mỗi kết nối. Mỗi kết nối có thể được truy cập riêng lẻ và sẽ không có bất kỳ liên quan nào đến kết nối khác.

If cluster được đặt thành true , Laravel sẽ tạo một \Predis\Client tổng hợp ví dụ bằng cách sử dụng tất cả các kết nối đã xác định. Không có cấu hình nào khác, đây là một loại cụm "giả". Nó sử dụng sharding phía máy khách để phân phối không gian khóa và có thể yêu cầu giám sát và bảo trì bên ngoài để đảm bảo cân bằng tải trọng phù hợp.

Tuy nhiên, vấn đề bạn đang gặp phải là Azure triển khai (có lẽ là) một cụm Redis phía máy chủ thực, xử lý việc phân tách tự động không gian phím. Trong trường hợp này, các nút biết về nhau và nói chuyện với nhau, và có thể lên xuống. Đây là nơi MOVEDASK phản hồi đến từ.

Predis thư viện có thể tự động xử lý những phản hồi này, nhưng chỉ khi bạn nói với nó rằng nó cần. Trong trường hợp này, bạn cần thông báo cho Predis ứng dụng khách mà nó cần để xử lý phân cụm và điều này được thực hiện bởi Laravel thông qua các tùy chọn cluster mảng trên redis cấu hình.

Trên redis cấu hình, các options khóa phải là anh chị em của các kết nối của bạn (tức là default ), không phải là một đứa trẻ. Ngoài ra, các tùy chọn phải được chỉ định là key => value các cặp.

Vì vậy, cấu hình của bạn sẽ giống như sau:

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

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

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

Cụm cluster dưới redis config sẽ yêu cầu Laravel tạo một Predis\Client tổng hợp phiên bản có thể xử lý nhiều nút và cụm cluster dưới options mảng sẽ cho trường hợp đó biết rằng nó cần xử lý phân cụm phía máy chủ, không phải phân nhóm phía máy khách.

Auth

Các thông số kết nối ban đầu (bao gồm xác thực) không được chia sẻ với các kết nối đến các nút mới được phát hiện qua -MOVED-ASK phản hồi. Vì vậy, bất kỳ lỗi nào bạn gặp phải trước đây từ -MOVED câu trả lời bây giờ sẽ chỉ chuyển đổi thành NOAUTH các lỗi. Tuy nhiên, 'cluster' phía máy chủ cấu hình cho phép một 'parameters' anh chị em trong đó xác định danh sách các tham số để sử dụng với các nút mới được phát hiện. Đây là nơi bạn có thể đặt các thông số xác thực của mình để sử dụng với các nút mới.

Tôi tin rằng nó sẽ trông giống như sau:

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

Cảnh báo công bằng, đây là tất cả thông tin tôi vừa nhận được từ quá trình nghiên cứu và tìm hiểu mã. Trong khi tôi đã sử dụng Redis với Laravel, tôi chưa sử dụng (chưa) phân cụm phía máy chủ, vì vậy điều này vẫn có thể không hoạt động.

Một số thông tin hữu ích mà tôi đã xem qua khi xem xét vấn đề này:

Sự cố dự đoán thảo luận về việc kết nối với redis-cluster:
https://github.com/nrk/predis/issues/259#issuecomment-117339028

Có vẻ như bạn đã không định cấu hình Predis để sử dụng redis-cluster mà thay vào đó bạn đang sử dụng nó với logic sharding phía máy khách cũ đơn giản (cũng là hành vi mặc định). Bạn nên cấu hình máy khách thiết lập cụm tùy chọn với giá trị redis để cho máy khách biết nó phải chạy cùng với redis-cluster. Ví dụ nhanh:

$client = new Predis\Client([$node1, $node2, ...], ['cluster' => 'redis']);

Làm như vậy sẽ giúp ứng dụng khách có thể tự động xử lý các phản hồi -MOVED hoặc -ASK đến từ các nút Redis.

Bài viết MS thảo luận về phân cụm trên bộ đệm redis:
https://docs.microsoft.com/en-us/azure/redis-cache/cache-how-to-premium-clustering#how-do-i-connect- to-my-cache-when-clustering-is-enable

Bạn có thể kết nối với bộ đệm ẩn của mình bằng cách sử dụng cùng một điểm cuối, cổng và khóa mà bạn sử dụng khi kết nối với bộ đệm chưa bật tính năng phân cụm. Redis quản lý việc phân cụm trên chương trình phụ trợ, do đó bạn không phải quản lý nó từ ứng dụng khách của mình.

Mã Laravel để tạo Predis\Client phiên bản:
https://github.com/laravel/framework/blob/v5.3.28/src/Illuminate/Redis/Database.php#L25-L66



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Redis - Cách định cấu hình chuyển đổi tùy chỉnh

  2. Node.js - Phiên không tồn tại thông qua res.redirect ()

  3. Kiểm soát sự cố luồng với nút / redis và gọi lại?

  4. Truy vấn phạm vi trong Redis - Spring Data Redis

  5. Quét Laravel và redis