2015-10-08 4 views
8

Wir haben eine Redis-Konfiguration mit zwei Redis-Servern. Wir haben auch 3 Sentinels, um die beiden Instanzen zu überwachen und bei Bedarf ein Failover zu initiieren.Wie man einen FLUSHALL redisisert, ohne einen Sentinel-Failover auszulösen?

Wir haben derzeit einen Prozess, bei dem wir regelmäßig einen FLUSHALL auf dem Redis-Server ausführen müssen. Dies ist ein Blockiervorgang, der länger dauert als die Zeit, die wir den Sentinels für die Zeitüberschreitung zugewiesen haben. Mit anderen Worten, wir haben unsere Sentinel-Konfiguration mit:

sentinel down-after-milliseconds OurMasterName 5000

und auf dem Server ein redis-cli flushall tun nimmt> 5000 Millisekunden, so dass die Sentinels initiieren eine über fehlschlagen.

Wir bestätigen, dass die Ausführung einer FLUSHALL nicht großartig ist und wir wissen auch, dass wir die Down-after-Millisekunden erhöhen können, aber für die Zwecke dieser Frage angenommen, dass keine dieser Optionen sind.

Die Frage ist: Wie können wir einen FLUSHALL (oder eine äquivalente Operation) ausführen, OHNE dass unsere Sentinels einen Fail Over auslösen, weil die FLUSHALL-Blockierung länger als 5000 Millisekunden dauert? Hat jemand dieses Problem angetroffen und gelöst?

+0

Wenn Sie auf einer Cloud-Plattform sind, können Sie einfach eine neue Instanz erstellen: Entweder haben Sie Maschinenimages bereit oder mit einigen Devops-Tools –

+0

@LiviuCostea Ich denke, das ist wahrscheinlich die richtige Option. Wenn Sie auf etwas Bezug nehmen können, das etwas ausführlicher beschreibt, wie dies funktionieren könnte, würde ich gerne Ihre Antwort akzeptieren. – jakejgordon

+0

Wenn Sie etwas wie AWS oder Azure verwenden, haben Sie eine API zum Erstellen eines neuen Redis-Clusters. Starten Sie es, laden Sie es mit Daten und sobald Sie fertig sind, ändern Sie einfach das DNS, wieder mit API-Aufruf -so alle diese können von einem Teil Ihrer Anwendung behandelt werden. Aber auf dem Gelände können die Dinge komplexer werden, weil es etwas Automatisierung mit ansible/Koch/Puppet erfordert. –

Antwort

1

Sie könnten einfach neue Instanzen erstellen: Wenn Sie etwas wie AWS oder Azure verwenden, haben Sie eine API zum Erstellen eines neuen Redis-Clusters. Starten Sie es, laden Sie es mit Daten und sobald Sie fertig sind, ändern Sie einfach das DNS, wieder mit API-Aufruf -so alle diese können von einem Teil Ihrer Anwendung behandelt werden. Aber auf dem Gelände können die Dinge komplexer werden, weil es etwas Automatisierung mit ansible/Koch/Puppet erfordert.

0

Die nächste beste Option, die Sie derzeit haben, ist es, Schlüssel in Stapeln zu löschen, um den Arbeitsaufwand auf einmal zu reduzieren. Sie können eine Liste erstellen, vorausgesetzt Sie haben keine. Verwenden Sie dazu scan. Löschen Sie dann in jeder Stapelgröße, die für Sie arbeitet.

Bearbeiten: Da Sie nicht daran interessiert sind, Daten zu halten, Persistenz deaktivieren, löschen Sie die RDB-Datei, dann starten Sie die Instanz einfach neu. Auf diese Weise müssen Sie Sentinel nicht wie bei der Bereitstellung neuer Hosts aktualisieren.

Aus Neugier, wenn Sie nur die ganze Zeit spülen werden und sich nicht um die Daten kümmern, wie Sie es abwischen werden, warum mit Sentinel kümmern?

+0

Ich denke, das Problem hier ist, dass es keine Konsistenz garantieren würde. In diesem Fall ist es wahrscheinlich besser, den Timeout auf> 5000 ms zu erhöhen (was wir tatsächlich getan haben - und unser Problem vorübergehend löst - aber keine wirklich akzeptable Lösung). – jakejgordon

Verwandte Themen