Redis
 sql >> Teknologi Basis Data >  >> NoSQL >> Redis

Laravel + predis + Redis cluster - PINDAH / tidak ada koneksi ke 127.0.0.1:6379

TL;DR:

  • 'cluster' => true harus benar untuk membuat satu klien agregat yang menangani banyak node.
  • 'options' => ['cluster' => 'redis'] perlu ditambahkan ke konfigurasi sebagai saudara dari default (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



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cara menginstal Redis

  2. Bagaimana socket.io mengirim pesan ke beberapa server?

  3. Bagaimana cara mengubah tanggal Redis di R

  4. Performa SCAN vs KEYS di Redis

  5. Antrian redis Laravel 5.5 terlalu lambat