2016-05-23 20 views
3

Sagen wir, ich habe ein Array von Memcache-Server, der Memcache-Client wird sicherstellen, dass der Cache-Eintrag nur auf einem einzigen Memcache-Server ist und alle Clients diesen Server immer nach dem Cache fragen Eintrag ... richtig?Verteilter Cache mit doppelten Cache-Einträgen auf verschiedenen Hosts

Nun sind zwei Szenarien vor:
[1] Web-Servers werden immer viele verschiedene Anfrage (verschiedene URLs), dann wird der Cache-Eintrag unter dem memcache Server und Anforderung wird auffächern zu memcache Cluster verteilt werden.
In diesem Fall funktioniert die Memcache-Strategie, um den einzelnen Cache-Eintrag auf einem einzelnen Server zu halten.

[2] Web-Server bekommen viele Anfragen für dieselbe Ressource, dann werden alle Anfragen vom Webserver auf einem einzelnen Memcache-Server landen, was nicht erwünscht ist.

Was ich suche ist die verteilte Cache, in dem:
[1] Jeder Web-Server kann die Cache-Knoten zu verwenden, um Cache-Material angeben.
[2] Wenn ein Webserver einen Cache ungültig macht, sollte der Cache-Server ihn von allen Caching-Knoten ungültig machen.
Kann Memcache diesen Anwendungsfall erfüllen?

PS: Ich habe nicht Tonnen von Ressourcen zu cachen, aber ich habe kleine Anzahl von Ressourcen mit viel Verkehr für eine einzelne Ressource auf einmal.

Antwort

1

Memcache ist ein großer verteilter Cache. Um zu verstehen, wo der Wert gespeichert ist, ist es eine gute Idee, den Memcache-Cluster als Hashmap zu betrachten, wobei jeder Memcached-Prozess genau ein Schlagloch in der Hashmap ist (natürlich ist jeder Memcached auch ein "innerer" Hashmaps), aber das ist nicht wichtig für diesen Punkt). Zum Beispiel bestimmt die memcache Client den memcache Knoten mit diesem Pseudo-Code:

index = hash(key) mod len(servers) 
value = servers[index].get(key) 

Dies ist, wie der Kunde immer den richtigen Server finden. Es hebt auch hervor, wie wichtig die Hash-Funktion ist und wie Schlüssel generiert werden - eine schlechte Hash-Funktion verteilt möglicherweise Schlüssel nicht gleichmäßig auf die verschiedenen Server .... Die Standard-Hash-Funktion sollte jedoch in fast jeder praktischen Situation gut funktionieren.

Jetzt zeigen Sie in Problem [2] die Bedingung, wo die Anforderungen für Ressourcen nicht zufällig sind, speziell zugunsten eines oder einiger Server. Wenn dies der Fall ist, ist es wahr, dass die jeweiligen Knoten wahrscheinlich viel mehr Anfragen erhalten werden, aber das ist relativ. Nach meiner Erfahrung wird Memcache in der Lage sein, eine höhere Anzahl von Anfragen pro Sekunde als Ihr Webserver zu handhaben. It easily handles 100's of thousands of requests per second on old hardware. Also, es sei denn, Sie haben 10-100x mehr Webserver als Memcache-Server, so dass Sie wahrscheinlich keine Probleme haben. Selbst dann könnten Sie das Problem möglicherweise lösen, indem Sie die einzelnen Knoten aktualisieren, um mehr CPUs oder leistungsfähigere CPUs zu haben.

Aber lassen Sie uns den schlimmsten Fall annehmen - Sie noch dies mit memcache erreichen können:

  • Installieren Sie jedes memcache wie ein einzelner Server (dnicht als verteiltes Cache)
  • In Ihrem Web-Server verantwortlich sind Sie jetzt die Verbindungen zu jedem dieses Server verwalten
  • Sie sind auch verantwortlich für den Memcached Prozess der Bestimmung jeden Schlüssel/Wert zu übergeben, zu erreichen haben 2

ich persönlich Vorbehalte gegen dieses Ziel 1

  • Wenn ein Web-Server einen Cache-Annullierungs erkennt, sollte es den Servern Schleife über den Cache auf jedem ungültig zu machen, wodurch Ziel zu erreichen - Sie sind, durch die Angabe, deaktivieren der verteilte Aspekt Ihres Caches und die Verteilung ist a Hauptmerkmal und Nutzen des Dienstes. Außerdem müsste Ihr Anwendungscode über die einzelnen Cache-Server informiert werden, damit sie alle anders behandeln können, was architektonisch unerwünscht ist und eine große Anzahl neuer Konfigurationspunkte einführt.

    Die Idee eines verteilten Caches besteht darin, den Besitz des Standorts (*) vom Client zu entfernen. Aus diesem Grund erlauben es verteilte Caches und DB dem Client nicht, den Server anzugeben, auf dem die Daten geschrieben werden.

    Zusammengefasst, es sei denn, Ihr System erwartet 100.000k oder mehr Anfragen pro Sekunde, es ist zweifelhaft, dass Sie dieses spezifische Problem in der Praxis haben. Wenn Sie dies tun, skalieren Sie die Hardware. Wenn das nicht funktioniert, werden Sie Ihre eigene Verteilungslogik, Duplizierung, Flushing und Management-Schicht über Memcache schreiben. Und das würde ich nur tun, wenn es wirklich, wirklich notwendig ist. Es gibt eine old saying in software development:

    Es gibt nur zwei harte Dinge in Informatik: Cache-Annullierungs und Namensgebung Dinge.

    --Phil Karlton


    (*) Einige verteilten Caches doppelte Einträge Leistung und (zusätzlich) Widerstandsfähigkeit zu verbessern, wenn ein Server ausfällt, so dass die Daten auf mehreren Servern gleichzeitig sein kann