Verteiltes Caching

Mit memcached lassen sich in wenigen Handgriffen verteilte Objekt-Caches und Session-Pools auf RAM-Basis in Betrieb nehmen.

Artikel erschienen in Swiss IT Magazine 2006/14

     

Eine äusserst effiziente Methode zur Beschleunigung von Webseiten und Webapplikationen ist das Cachen von Seitenbestandteilen oder ganzen Seiten. Doch auch beim Caching lässt sich noch mehr Leistung herauskitzeln, wenn man nicht auf die verhältnismässig langsame Festplatte setzt.


Jedem seinen Cache

Mittlerweile bringen die meisten Frameworks und Template-Engines Caching-Funktionalität mit. Als Zwischenspeicher wird meistens die Festplatte verwendet, da ihre Verwendung sehr einfach ist. Doch sind Festplatten im Vergleich zum Arbeitsspeicher sehr langsam, so dass man mit der Nutzung von Arbeitsspeicher als Cache viel Leistung gewinnen kann. Die direkte Nutzung des Arbeitsspeichers ist zwar oftmals möglich, macht allerdings nicht viel Sinn. Dies, da die meisten Scriptsprachen, welche zur Webseiten-Erzeugung verwendet werden, einen Prozess pro Request benötigen, so dass oftmals Dutzende von parallelen Prozessen pro Maschine vorhanden sind, die alle ihren eigenen Cache vorhalten müssten. Die Chance eines sogenannten Cache-Hit, bei dem ein Objekt im Cache gefunden wird, ist also deutlich tiefer als bei der Festplatte, bei der sich alle Prozesse einen Cache teilen können. Umgehen lässt sich das Prozess-Problem mit System V Shared Memory, speziellen Arbeitsspeicher-Segmenten, die der Interprozesskommunikation vorbehalten sind. Beide Methoden haben aber das Problem, dass die Caches nur auf eine einzelne Maschine beschränkt sind, was bei grösseren Installationen mit 20 und mehr Servern mit fast identischen Caches wieder viele Ressourcen vergeudet.


Alles für alle

Dieses Manko lasst sich mit memcached beheben, einer von Danga Interactive für die Social-Networking-Plattform LiveJournal.com entwickelte Software, die unter einer BSD-Lizenz steht. Memcached ist ein Object-Caching-Werkzeug, das ähnlich zu System V Shared Memory den RAM als Datenspeicher verwendet, sich aber gleichzeitig über mehrere Maschinen hinweg verwenden lässt. Es gleicht dabei einer Hash Table, die beliebige Objekte wie Sessions oder Seitenfragmente anhand eines Key speichert. Die Software ist Bestandteil der meisten Paketsammlungen und lässt sich äusserst einfach in Betrieb nehmen:



# memcached -d -u andreas -m 512 -p 11211




Dieser simple Befehl reicht bereits, um memcached als Daemon an Port 11211 zu starten und ihm 512 MB RAM als Objektspeicher zuzuweisen. Memcached lässt sich nun von jedem Prozess und fast jeder Programmiersprache (Interfaces existieren unter anderem für Perl, PHP, Lua, Ruby und Python) aus ansteuern und zum Speichern respektive zum Abfragen von zwischengespeicherten Objekten verwenden.


Mehr Möglichkeiten

Abgefragt werden können aber nicht nur der lokale memcached, sondern auch entfernte Instanzen. Zu diesem Zweck bieten die Interfaces einen Connection Pool an, zu dem beliebig viele memcached-Instanzen hinzugefügt werden können. Ist man nun auf der Suche nach einem bestimmten Objekt, werden so nicht nur die lokale Instanz, sondern auch die entfernten abgefragt. Dies ermög­licht sämtlichen Webservern den Zugriff auf die gleiche Datenbasis. So lassen sich neben dem Caching auch noch andere Probleme wie Session-Persistenz lösen. Beim Load Balancing werden normalerweise die Besucher von Seitenabruf zu Seitenabruf anderen Servern zugeteilt. Dies führt aber dazu, dass jedes Mal eine neue Session eröffnet werden muss. Normalerweise wird dies gelöst, indem der Load Balancer so konfiguriert wird, dass ein Besucher immer zum gleichen Server geschickt wird. Dies kann aber für eine schlechtere Auslastung der Server sorgen. Eine Alternative ist nun die Erzeugung eines globalen Session-Pools mit Hilfe von memcached.
Auch bietet memcached bei der Prüfung auf Cache-Hits mehr Flexibilität. Normalerweise wird erst innerhalb der Webapplikation geprüft, ob ein Cache-Hit vorliegt oder nicht. Doch kostet dies wertvolle CPU-Zyklen, wenn man diese Prüfung bereits innerhalb des Webservers vornehmen kann. So bietet lighttpd mit seinem mod_cml schon zu einem sehr frühen Zeitpunkt die Prüfung auf Cache-Hits, ohne dass die Webapplikation belästigt werden muss.


Nichts geteilt

Da bei memcached die Objekte einer Maschine nur auf derselben lagern, wächst mit jeder memcached-Instanz der verfügbare Cache-Speicher. Hat man beispielsweise 10 Maschinen mit je 512 MB Objekt-Speicher, kann man gesamthaft auf 5 GB Cache zurückgreifen. Dies ist zwar kostengünstig und dank der grösseren Flexibilität praktisch - so können beispielsweise Maschinen mit wenig RAM nur mit einem kleinen Cache ausgestattet werden - allerdings muss man auch damit leben, dass man beim Ausfall einer Maschine auch deren Speicherkapazität und Daten verliert. Dies ist bei reinem Caching nicht allzu tragisch, kann aber bereits bei einem Session-Pool für unerwünschte Nebeneffekte sorgen. Entsprechend gilt es, bei der Auswahl der Anwendungsgebiete für memcached etwas Vorsicht walten zu lassen.




Artikel kommentieren
Kommentare werden vor der Freischaltung durch die Redaktion geprüft.

Anti-Spam-Frage: Aus welcher Stadt stammten die Bremer Stadtmusikanten?
GOLD SPONSOREN
SPONSOREN & PARTNER