TL;DR:
'cluster' => true
harus benar untuk membuat satu klien agregat yang menangani banyak node.'options' => ['cluster' => 'redis']
perlu ditambahkan ke konfigurasi sebagai saudara daridefault
(bukan anak-anak) untuk memberi tahu Predis agar menangani pengelompokan sisi server yang disediakan oleh Azure.- jika menggunakan auth dengan pengelompokan sisi server,
'options' => [ 'cluster' => 'redis', 'parameters' => ['password' => env('REDIS_PASSWORD', null)], ]
akan diperlukan untuk mengautentikasi node cluster yang baru ditemukan.
Teks Lengkap
Dalam konfigurasi redis, Anda dapat mengatur beberapa koneksi ke beberapa instance redis. cluster
option memberi tahu Laravel cara menangani beberapa koneksi yang ditentukan.
Jika cluster
disetel ke false
, Laravel akan membuat \Predis\Client
individu contoh untuk setiap koneksi. Setiap koneksi dapat diakses secara individual, dan tidak akan memiliki hubungan dengan koneksi lain.
Jika cluster
disetel ke true
, Laravel akan membuat \Predis\Client
agregat instance menggunakan semua koneksi yang ditentukan. Tanpa konfigurasi lain, ini semacam cluster "palsu". Ini menggunakan sharding sisi klien untuk mendistribusikan ruang kunci dan mungkin memerlukan pemantauan dan pemeliharaan eksternal untuk memastikan keseimbangan beban kunci yang tepat.
Masalah yang Anda hadapi, bagaimanapun, adalah bahwa Azure mengimplementasikan (mungkin) cluster Redis sisi server nyata, yang menangani sharding otomatis dari keyspace. Dalam hal ini, node tahu tentang satu sama lain dan berbicara satu sama lain, dan mungkin naik dan turun. Di sinilah MOVED
dan ASK
tanggapan datang dari.
Predis
perpustakaan dapat secara otomatis menangani respons ini, tetapi hanya jika Anda memberi tahu bahwa itu perlu. Dalam hal ini, Anda perlu memberi tahu Predis
klien yang diperlukan untuk menangani pengelompokan, dan ini dilakukan oleh Laravel melalui options
array pada redis
konfigurasi.
Pada redis
konfigurasi, options
key harus saudara dari koneksi Anda (yaitu default
), bukan anak-anak. Selain itu, opsi harus ditentukan sebagai key => value
berpasangan.
Jadi, konfigurasi Anda akan terlihat seperti:
'redis' => [
'cluster' => true,
'default' => [
'host' => env('REDIS_HOST', 'localhost'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => 0,
],
'options' => [
'cluster' => 'redis',
],
],
cluster
kunci di bawah redis
config akan memberi tahu Laravel untuk membuat Predis\Client
agregat instance yang dapat menangani banyak node, dan cluster
kunci di bawah options
array akan memberi tahu instance itu bahwa ia perlu menangani pengelompokan sisi server, bukan pengelompokan sisi klien.
Autentikasi
Parameter koneksi asli (termasuk otentikasi) tidak dibagikan dengan koneksi ke node baru yang ditemukan melalui -MOVED
dan -ASK
tanggapan. Jadi, kesalahan apa pun yang sebelumnya Anda dapatkan dari -MOVED
tanggapan sekarang hanya akan dikonversi ke NOAUTH
kesalahan. Namun, 'cluster'
sisi server konfigurasi memungkinkan untuk 'parameters'
saudara kandung yang mendefinisikan daftar parameter untuk digunakan dengan node yang baru ditemukan. Di sinilah Anda dapat menempatkan parameter autentikasi untuk digunakan dengan node baru.
Saya yakin ini akan terlihat seperti:
'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)],
],
],
Peringatan yang adil, ini semua informasi yang saya dapatkan dari penelitian dan penyelaman kode. Meskipun saya telah menggunakan Redis dengan Laravel, saya belum menggunakan pengelompokan sisi server (belum), jadi ini mungkin masih tidak berfungsi.
Beberapa informasi berguna yang saya temukan saat melihat ini:
Masalah predis yang membahas cara menyambungkan ke redis-cluster:
https://github.com/nrk/predis/issues/259#issuecomment-117339028
Sepertinya Anda tidak mengonfigurasi Predis untuk menggunakan redis-cluster tetapi Anda menggunakannya dengan logika sharding sisi klien yang lama (yang juga merupakan perilaku default). Anda harus mengonfigurasi klien yang mengatur cluster opsi dengan nilai redis untuk memberi tahu klien bahwa itu harus dimainkan bersama dengan redis-cluster. Contoh cepat:
$client = new Predis\Client([$node1, $node2, ...], ['cluster' => 'redis']);
Melakukannya akan memungkinkan klien untuk secara otomatis menangani respons -MOVED atau -ASK yang berasal dari node Redis.
Artikel MS membahas pengelompokan pada cache 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-enabled
Anda dapat menyambungkan ke cache menggunakan titik akhir, port, dan kunci yang sama yang Anda gunakan saat menyambungkan ke cache yang tidak mengaktifkan pengelompokan. Redis mengelola pengelompokan di backend sehingga Anda tidak perlu mengelolanya dari klien Anda.
Kode Laravel untuk membuat Predis\Client
contoh:
https://github.com/laravel/framework/blob/v5.3.28/src/Illuminate/Redis/Database.php#L25-L66