sql >> Databáze >  >> NoSQL >> Redis

Laravel + predis + Redis cluster - PŘESUNOUT / žádné připojení k 127.0.0.1:6379

TL;DR:

  • 'cluster' => true by měl být pravdivý pro vytvoření jednoho agregovaného klienta, který zpracovává více uzlů.
  • 'options' => ['cluster' => 'redis'] musí být přidán do konfigurace jako sourozenec default (nikoli dítě), aby bylo Predisu sděleno, aby zpracovával clusterování na straně serveru poskytované Azure.
  • při použití auth s clusteringem na straně serveru, 'options' => [ 'cluster' => 'redis', 'parameters' => ['password' => env('REDIS_PASSWORD', null)], ] bude potřeba k ověření nově objevených uzlů clusteru.

Celý text

V konfiguraci redis můžete nastavit více připojení k více instancím redis. cluster Tato volba říká Laravelu, jak zacházet s těmito více definovanými připojeními.

Pokud cluster je nastaveno na false , Laravel vytvoří individuální \Predis\Client instance pro každé připojení. Ke každému připojení lze přistupovat samostatně a nebude mít žádný vztah k jinému připojení.

Pokud cluster je nastaveno na true , Laravel vytvoří agregovaný \Predis\Client instance pomocí všech definovaných připojení. Bez jiné konfigurace se jedná o jakýsi „falešný“ cluster. K distribuci klíčového prostoru používá sharding na straně klienta a může vyžadovat externí monitorování a údržbu, aby bylo zajištěno správné vyvážení zatížení klíčů.

Problém, na který narazíte, je však ten, že Azure implementuje (pravděpodobně) skutečný cluster Redis na straně serveru, který se stará o automatické sdílení prostoru klíčů. V tomto případě o sobě uzly vědí a mluví spolu a mohou se pohybovat nahoru a dolů. Toto je místo, kde se MOVED a ASK odpovědi pocházejí z.

Predis knihovna může automaticky zpracovat tyto odpovědi, ale pouze tehdy, když jí řeknete, že to potřebuje. V tomto případě musíte sdělit Predis klienta, který potřebuje zvládnout shlukování, a to Laravel provádí pomocí options pole na redis konfigurace.

Na redis konfigurace, options klíč by měl být sourozencem vašich připojení (tj. default ), ne dítě. Navíc by tyto možnosti měly být specifikovány jako key => value párů.

Vaše konfigurace by tedy měla vypadat takto:

'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 klíč pod redis config řekne Laravelu, aby vytvořil souhrnný Predis\Client instance, která může zpracovávat více uzlů, a cluster pod options pole této instanci sdělí, že potřebuje zpracovat clusterování na straně serveru, nikoli clusterování na straně klienta.

Ověření

Původní parametry připojení (včetně ověřování) nejsou sdíleny s připojeními k novým uzlům objeveným prostřednictvím -MOVED a -ASK odpovědi. Takže všechny chyby, které jste dříve dostali z -MOVED odpovědi se nyní převedou na NOAUTH chyby. Nicméně 'cluster' na straně serveru konfigurace umožňuje 'parameters' sourozenec, který definuje seznam parametrů pro použití s ​​nově objevenými uzly. Zde můžete vložit své auth parametry pro použití s ​​novými uzly.

Věřím, že to bude vypadat nějak takto:

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

Spravedlivé varování, to jsou všechny informace, které jsem právě získal z výzkumu a kódového potápění. Zatímco jsem používal Redis s Laravelem, nepoužil jsem (zatím) clustering na straně serveru, takže to stále nemusí fungovat.

Několik užitečných informací, na které jsem narazil, když jsem se tím zabýval:

Problém Predis diskutující o připojení ke clusteru redis:
https://github.com/nrk/predis/issues/259#issuecomment-117339028

Zdá se, že jste nenakonfigurovali Predis pro použití redis-cluster, ale místo toho jej používáte s jednoduchou starou logikou shardingu na straně klienta (což je také výchozí chování). Měli byste nakonfigurovat klienta nastavením clusteru voleb na hodnotu redis, aby klient věděl, že musí hrát spolu s redis-cluster. Rychlý příklad:

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

Pokud tak učiníte, umožníte klientovi automaticky zpracovávat odpovědi -MOVED nebo -ASK přicházející z uzlů Redis.

Článek MS pojednávající o clusteringu na mezipaměti 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

Ke své mezipaměti se můžete připojit pomocí stejných koncových bodů, portů a klíčů, jaké používáte při připojování k mezipaměti, která nemá povoleno klastrování. Redis spravuje clustering na backendu, takže je nemusíte spravovat ze svého klienta.

Laravel kód pro vytvoření Predis\Client instance:
https://github.com/laravel/framework/blob/v5.3.28/src/Illuminate/Redis/Database.php#L25-L66



  1. Je bezpečné odstranit soubor deníku mongodb?

  2. Kontingenční řádky do sloupců v MongoDB

  3. MongoDB SSL s certifikáty s vlastním podpisem v C#

  4. HBase:5 tipů pro běh s nízkou pamětí EC2