Frage

Wie gehen Sie ersetzen / hinzufügen / Memcached Knoten in Ihren Produktionsanwendungen zu entfernen? Ich werde eine Reihe von Anwendungen, die angepasst und aufgrund jeden Kunden geklont werden muß laufen auf einem und denselben Webserver, so dass ich, dass es einen Tag erraten würde sein wird, wenn einige der Knoten geändert werden.

Hier ist, wie Memcached durch normale bevölkert ist:

$m = new Memcached();

$servers = array(
    array('mem1.domain.com', 11211, 33),
    array('mem2.domain.com', 11211, 67)
);
$m->addServers($servers);

Meine Idee ist der $ Server Array zu machen aus der Datenbank gefüllt werden, auch zwischengespeichert, sondern dateibasierte, einmal täglich oder etwas getan, mit der Option, ein Update auf nächstem Laufe der Funktion zu erzwingen, dass hält den $ addservers Anruf. Aber ich vermute, dass dies möglicherweise einige zusätzliche Aufwand hinzufügen, da Platten ziemlich langsam Lagerung sind ...

Was denken Sie?

War es hilfreich?

Lösung

Es ist immer besser, Dinge wie das in der Quelle zu definieren. Zugegeben, könnte man parse_ini_file() oder etwas ähnliches verwenden, um eine Konfigurationsdatei zu lesen. Wirklich obwohl, gehört es in der Quelle. Aber wenn in einer INI-Datei definiert ist, gibt es nicht viele Sicherheitsprobleme wie Code-Injektion und die Gleichen im Gegensatz zu definieren Sie Ihre Eingaben in PHP.

Da gibt es einige Anwendungen, die die gleiche INI-Datei lesen werden können, können Sie es in einer gemeinsamen Stelle setzen, dass alle Anwendungen haben Zugriff auf (Gruppenberechtigungen verwenden, zum Beispiel). Eigentlich, das zu tun ist nicht wirklich zu empfehlen.

Andere Tipps

Verwenden Sie eine Konfigurationsdatei - ob die von parse_ini_file oder einem anderen Konfigurations Parsing Schema. Wenn Sie sich über das Parsen Zeit besorgt sind, können Sie diese Konfigurationen in der php.ini Lastpfad setzen http://brian.moonspot.net/using-ini-files-for-php-application-settings - das vorge parst alle vars Sie brauchen, aber Sie müssen starten Sie apache Änderungen zu laden.

Sobald die Dateien genug (so lange, wie Sie zu viel Dresche auf Ihrem Rechner nicht haben) gelesen werden, die Config-Datei trotzdem im Speicher abgebildeter Cache sein wird, so dass es sehr schnell sein wird. Sie können unter Verwendung der PHP-serialisiert Form der Lasten schnell optimieren und noch weiter optimieren, indem Sie den APC Benutzer-Cache verwendet wird.

Schließlich verwenden die neuesten memcache Client-Bibliotheken -. Sie die konsistente Hashing-Algorithmen verwenden jetzt, und es wird dazu beitragen, das Hinzufügen / Entfernen einzelner Server

Je nach Bedarf würde ich eine Liste verwenden, das unterstützt auto-Räumung nach einigen TTL (Passiv-Modus) oder irgendeine Art von Hörer Mustern, wenn Sie wollen, dass diese sofort aktualisiert werden (aktiven Modus). Wo auch immer Sie halten Ihre primäre Quelle (Properties-Datei, Datenbank, etc.) ist nicht wirklich wichtig, solange es erreichbar ist, wenn notwendig, und Ihre TTL ist groß genug (wie Sie in Ihrem Kommentar erwähnt).

Für passiven Ansatz Sie Wiederverwendung einig anderen lokalen Caching-Bibliothek verwenden könnten, dass Träger TTL (z EHCache in Java), indem Sie Ihre Liste der Server in den Cache unter einigen bekannten Schlüsseln setzen. Für aktiven Ansatz, zum Beispiel, hat Java java.util.EventListener. Es ist (un) glücklicherweise viele Jahre her, seit ich etwas getan, in PHP haben kann so nicht auf dem beraten.

würde ich dringend abraten Konfigurationsdaten in den Code setzen. In der Welt ist, ich bin der lebende Hardcoding eine schwere Sünde.

Sie können auch einen Blick auf haben wollen wie last.fm konsistenten Hashing-Algorithmus verwendet in der Lage, hinzufügen / Entfernen-Server zum / vom memcached Pool, ohne eine komplette remap aller Schlüssel verursacht.

Soweit ich udnerstood, hier das Hauptanliegen ist, wie die Konfiguration cachen es meist up-to-date zu halten, wenn sie sich ändert.

Nun, die beste Option ist hier zu speichern offensichtlich in einer Datenbank und Auffrischen von DB, sagen wir, alle 15 Sekunden. Nachdem große Last auf die Anwendung, die DB einmal pro 15 Sekunden Abfrage wird überhaupt nichts ändern. die Daten von DB Laden selbst ist recht schnell, wie Sie brauchen nur ein paar Felder aus.

Eine weitere Option, die funktionieren könnte hier - eine separate Memcached verwenden :) Im Ernst, nur die von der DB geladen Konfiguration cachen dort, dass die Cache-Schlüssel auf Konfigurations-Update Spülen.

Um es zusammenzufassen: ein zeitbezogenes Ablaufschema funktionieren würde. Die einfachste Lösung - halten Sie es auf Ihrer eigenen (Speicher letzte Aktualisierungszeit und überprüfen Sie sie auf jedem Funktionsaufruf); ein bisschen weiter fortgeschritten -. Verwendung so etwas wie Memcached

Update : DB ist die beste Lösung, da es ziemlich gut skaliert. Sie müssen nicht configs auf jedem Konfigurations-Update über 20 Server kopieren

  • Verwenden Sie einen Service Locator wie - https://www.consul.io/ . Hinzufügen oder Entfernen von Dienstleistungen und Verbraucher erhalten die Serviceinfos von Konsul Echtzeit.
  • Wenn Konsul macht mehr Aufwand für ein neues Stück Software verwalten, bewegen Sie die Informationen in einer zentralen Konfigurations. Auf Update laden Sie die Konfiguration oder Trigger-Update-Ereignisse. Die Verbraucher hören für Veranstaltungen und die Informationen aktualisieren.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top