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ủadefault
(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 MOVED
và ASK
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
và -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