Mit Memcache lassen sich Teile eines Programms in den Hauptspeicher verlagern, für die z.B. Datenbankzugriffe oder Dateizugriffe notwendig wären. Grenzen hierfür sind nur der physikalische Speicher im Rechner. Da aber beliebig viele Nodes angebunden werden können, ist dadurch die Größe des Caches beliebig skalierbar machen. Die Größe des Hauptspeichers ist bei den Nodes entscheidend, wobei eine schwache CPU Leistung kein Problem darstellt, da diese nur geringfügig beansprucht wird. Am einfachsten kann man sich memcached als eine riesige Hash Tabelle vorstellen, die über mehrere Nodes verteilt werden kann.

Wann sollte man memcached einsetzen?

  • große Datenbank mit Millionen von Einträgen
  • hoher Traffic mit mehreren Millionen PageImpressions

memcached bringt wirklich nur bei großen Projekten etwas, bei kleinen oder mittleren Projekten lohnt sich der Einsatz nicht. Wer jetzt überlegt, ob sein Projekt “groß” ist, kann es hier mit einigen Webseiten vergleichen, die memcached einsetzen: Livejournal, YouTube, Digg, Facebook, Wikipedia, Gamespot, Slashdot, SourceForge, Bloglines, Kayak. Um auf das Beispiel Facebook näher einzugehen: Facebook setzt 200 dezidierte memcached Server mit jeweils 16 GB Hauptspeicher ein, was eine ungefähre Größe von 3TB memcache ergibt!

Die gute Verbreitung von memcached liegt wohl auch daran, dass sehr viele Clients unterstützt werden. Hierzu gehören PHP, Perl, Python, Ruby, Java, C, C# und wahrscheinlich noch viele mehr.

Vorteile für den Einsatz von memcached sind:

  • Distributed memory caching system, was bedeutet, dass als Speichersystem auch mehrere Rechner verwendet werden können (und nicht nur ein Rechner). Für diese Verwendung wurde memcache ursprünglich für Livejournal entwickelt.
  • Skalierbarkeit Zum einen ist memcached selbst schon durch seine Netzwerkfähigkeit skalierbar und zum anderen macht der Einsatz an sich ein Projekt skalierbarer, da von der Datenbank Last und Traffic genommen wird.
  • sehr schnelles Speichersystem Für temporäre Daten ist es oft erforderlich, dass diese sehr schnell wieder abgerufen werden können.
  • Datentraffic verringern Wenn man für ein Projekt einen getrennten Webserver und Datenbankserver einsetzt (was bei größeren Projekten meist der Fall ist), kann ein sehr hohes Traffic-Aufkommen zwischen den beiden Systemen entstehen. Wenn man nun Daten von der Datenbank in den Memcache auslagert, und dieser auf dem Webserver aktiv ist, wird dadurch ein Zugriff auf die Datenbank verhindert und der Traffic sinkt.

Nachteile, die durch den Einsatz von memcached entstehen:

  • nur für temporäre Daten nutzbar (nicht persistent)
  • nicht redundant
  • Fehlende Sicherheitsmechanismen Ich empfehle deswegen unbedingt den Zugriff durch eine Firewall zu schützen, z.B. mit iptables.
  • Fehlende Authentifizierungsmöglichkeiten
  • wird in den meisten Linux Distributionen standardmäßig noch nicht mitgeliefert - das erfordert Handarbeit, wobei dieser Artikel helfen soll.
  • Anpassung der Anwendung ist erforderlich Ohne eine Anpassung der Anwendung wird memcache nicht verwendet und ist daher nutzlos.
  • Fehlersuche ist schwerer Da man den aktuellen Inhalt, der sich im Cache befindet, nicht einsehen kann, ist das Debuggen schwieriger im Vergleich zu einer Datenbank.
  • Einschränkung bzgl. der Key und Value Werte Die Schlüssellänge ist auf 250 Zeichen und der Speicher für einen Wert ist auf 1 MB begrenzt.

Wie funktioniert memcache

  • Memcache besteht aus zwei Teile: memcached, der Server, und einen Client, der z.B. das PECL PHP Modul darstellt.
  • Wenn drei Webserver im Einsatz sind, dann werden alle drei memcached Server von jedem beteiligten Server angesprochen. Alle memcached Server bilden eine grosse Hash Tabelle.
  • Ein einzelner memcached Server verwaltet nur einen Teil des Caches, was bedeutet das der Cache zwischen den einzelnen memcached Instanzen nicht repliziert wird.
  • Um den richtigen Server bei einer Anfrage aber beim Speichervorgang zu adressieren, wird ein Hash-Algorithmus eingesetzt / berechnet, um den Server identifizieren zu können. Dadurch ist bekannt, auf welchem der Server die angeforderten Daten liegen.
  • Jeder memcached Server hat eine begrenzte Größe an Speicher. Wenn mehr Speicher als vorhanden allokiert wird, wird der älteste Inhalt automatisch gelöscht. Das bedeutet, dass kein permanentes Speichern möglich ist!

memcached Architecture

Installation und Konfiguration von memcache

memcached benötigt libevent für den Betrieb. Es muss also sicher gestellt werden, dass diese Bibliothek/Paket installiert ist.

  • memcached herunterladen ``` cd /tmp && wget https://www.danga.com/memcached/dist/memcached-1.2.2.tar.gz ```
  • Kompilieren und Installieren ``` cd memcached-1.2.2 ./configure --prefix=/usr --sysconfdir=/etc make && make install ``` Falls libevent nicht während der Konfiguration gefunden wird, sollte mit dem Parameter die zu verwendende Bibliothek angegeben werden: --with-libevent
  • Starten des Dienstes ``` /usr/bin/memcached -d -m 2048 -l 127.0.01 -p 11211 ``` Erklärung zu den verwendeten Parametern:
    • -d Startet memcached als Dienst
    • -m Gibt an, wieviel Hauptspeicher memcached benutzen kann. Diese Angabe wird in MB angegeben.
    • -l Unter welcher IP der Daemon angesprochen wird
    • -p Unter welchem Port der Daemon angesprochen wird. Falls der Port nicht spezifiziert wird, wird standardmäßig Port 11211 verwendet.

Falls die verwendete Linux Distribution ein Paket liefert, sollte man anstelle der manuellen Installation dieses Paket verwenden. Der Vorteil liegt darin, dass diese Pakete mit Startup Skripten geliefert werden, die auch im Bootprozess mit eingeschlossen werden können. Falls man auf die manuelle Installation zurückgreifen muss, kann man den Start des Dienstes auch in der /etc/init.d/rc.local (der Name dieser Datei kann von Distribution zu Distribution abweichen) initiieren.

Memcached mit PHP nutzen

Um memcached mit PHP nutzen zu können, muss das PECL Modul memcache verwendet werden.

Am einfachsten lässt sich das PECL Modul mit dem PECL Installer-Skript installieren:

pecl install memcache

Falls das fehlschlägt, nicht zur Verfügung steht oder man benutzerdefinierte Parameter bei der Installation verwenden will, ist das Modul wie folgt zu installieren:

  1. Laden Sie die aktuelle Version von memcached herunter (hier sollte man sich auf stabile Versionen beschränken) ``` cd /tmp && wget http://pecl.php.net/get/memcache-2.2.1.tgz ```
  2. Entpacken Sie die Archivdatei ``` tar xvfz memcache-2.2.1.tgz ```
  3. Kompilieren und Installieren des Moduls ``` cd memcache-2.2.1 phpize ./configure --with-apxs2 --with-php-config=/usr/bin/php-config make && make install ``` phpize ist meist im devel Paket einer RPM basierten Distribution zu finden, z.B. php-devel oder php5-devel.
  4. PHP Konfiguration Füge dazu in die php.ini folgende Zeilen ein: ``` extension=memcache.so memcache.allow_failover=1 memcache.max_failover_attempts=3 ``` Wenn nur ein memcached Server im Einsatz ist, sollte man allow_failover=0 setzen.
  5. Aktivierung und Validierung Um die Änderungen zu aktivieren, muss der Webserver neu gestartet werden. Danach kann über die phpinfo validiert werden, ob memcache unter PHP verfügbar ist.

memcached zusammen mit APC oder eAccelerator

Die Nutzung von memcached schließt den gleichzeitigen Einsatz von APC oder eAccelerator nicht aus. APC / eAccelerator ist sehr gut für leichte Pages, die sehr häufig aufgerufen werden, wobei memcached für mehr speicherintensive Zwecke verwendet werden kann (wie z.B. Datenobjekte oder Suchergebnisse aus langsamen DB Anfragen). Da beide Caching Mechanismen in unterschiedlichen Bereichen greifen, spricht also nichts gegen einen parallelen Einsatz.

Memcache unter Windows

Auch mit Windows kann man memcached verwenden. Danga bietet auf seiner Webseite memcached für Windows zum Herunterladen an, welches unter Windows NT / XP / Vista mit folgenden Befehl aus der Kommando-Zeile als Dienst installiert werden kann:

c:\memcached\memcached.exe -d install

(vorausgesetzt wird hier, dass memcached im Verzeichnis c:\memcached zu finden ist)

Ein vorkompiliertes PECL PHP Modul kann man auf pecl4win.php.net herunterladen. PECL Module lassen sich zwar auch unter Windows selbst kompilieren, aber dazu muss auch ein Compiler auf dem System vorhanden sein (und das ist in den meisten Fällen wohl nicht der Fall).

Status / Monitoring

Wenn einmal der memcached läuft, stellt sich als nächstes die Frage, wie dieser benutzt/belegt ist. Mit memcached wird leider kein Skript mitgeliefert, welches den Status ausgibt. Man kann aber z.B. über die PHP Schnittstelle leicht die aktuellen Werte auslesen und daraus eine Statistik erzeugen. Hierfür gibt es für cacti schon ein fertiges Template, welches man unter http://dealnews.com/developers/cacti/memcached.html herunterladen kann.

cacti memcached Netwerk Statistik

Anwendung

memcached eignet sich hervorragend um Objekte abzulegen, die zwischengespeichert werden müssen, die z.B. auf einer anderen Page wieder hergestellt werden sollen. Desweiteren kann man langsam die Ergebnisse langsamer Datenbank Anfragen ablegen (z.B. von Suchanfragen) oder Seitenfragmente cachen, um aufwendige Berechnungen zu reduzieren. Ein weiterer denkbarer Einsatzzweck wäre der RSS Feed!

Wenn man memcached mit mehreren Projekten auf dem gleichen Server einsetzen will, hat man zwei Möglichkeiten. Entweder man arbeitet mit einem Präfix, welches man direkt nach der Anbindung setzt, oder man lässt parallel mehrere Dienste auf unterschiedlichen Ports für die einzelnen Projekte laufen. Der Vorteil paralleler Dienste liegt auch darin, dass man sie getrennt zurücksetzen kann.

Häufige Probleme, die mit memcached auftreten können

  • Unit Tests liefern falsche Ergebnisse => memcached sollte beim Testen deaktiviert werden.
  • die 1 MB Grenze reicht nicht aus
  • es wird kein Whitespace im Schlüssel (Key) unterstützt
  • seltsame Dinge ereignen sich -> einfach mal den Daemon neu starten!

Weitere interessante Projekte zu memcached

  • MySQL Storage engine: memcache_engine Ab MySQL 5.1 bietet MySQL "Pluggable Storage Engine Architecture" an, mit der man flexibel weitere Storage-Engines einhängen kann. Über die Storage-Engine memcache_engine steht dann auch Memcache zur Verfügung, welcher als Alternative zu HEAP verwendet werden kann. Der große Vorteil dabei ist, dass man Queries wie SELECT/UPDATE/INSERTE/DELETE direkt mit memcache verwenden kann, und die Daten distributed über memcached gespeichert werden.
  • memcachefs memcachefs ist ein Dateisystem, welches FUSE nutzt. Über dieses Dateisystem lässt sich der Speicher von memcached als ganz "normales" Verzeichnis ansprechen. Jeder Key innerhalb des memcache wir als einzelne Datei abgebildet, der Inhalt dieser Datei gibt den Inhalt des dazugehörigen Wertes wieder.

memcachefs

Ressourcen

Aktualisiert: