Memcached in eStudy

Aus THM-Wiki
Wechseln zu: Navigation, Suche

Vorstellung Memcached

Was ist Memcached überhaupt?

Memcached ist ein (verteiltes) Caching-System, um Daten und Objekte im Hauptspeicher zu speichern. Dies wird zur Performace-Steigerung bei zeitaufwändigen Datenbank-Zugriffen genutzt. Daten aus der Datenbank, die seit dem letzten Zugriff nicht modifiziert worden sind, brauchen somit nicht neu aus der Datenbank geladen zu werden, womit Rechenzeit eingespart werden kann. Dieses System wird von einigen bekannten Web-Anwendungen benutzt, darunter YouTube, Slashdot, Wikipedia, SourceForge, Facebook, Twitter und LiveJournal.

Wie wird Memcached eingesetzt?

Die zu speichernden Daten werden in ein Objekt abgelegt, welches mit einem eindeutigen Schlüssel identifizierbar ist. Das Objekt und die Daten, welche es beinhaltet, sind durch den Schlüssel zugänglich. Nachfolgend ein Beispiel aus der englischen Wikipedia, welches die Funktionsweise von Memcached verdeutlicht:

function get_foo (int userid) {
   result = db_select("SELECT * FROM users WHERE userid = ?", userid);
   return result;
}

In dieser Methode werden alle User mit der übergebenen userid in der Variable result gespeichert, welche dann zurückgegeben wird. Die DB-Abfrage wir bei jedem Methodenaufruf ausgeführt, was bei einer großen Datenbank und vielen, gleichzeitigen Benutzerzugriffen zu Performance-Einbußungen führen kann.

Mit Einsatz von Memcached würde die Methode folgendermaßen aussehen:

function get_foo (int userid) {
    result = memcached_fetch("userrow:" + userid);
    if (!result) {
        result = db_select("SELECT * FROM users WHERE userid = ?", userid);
        memcached_add("userrow:" + userid,  result);
    }
    return result;
}

In der ersten Zeile wird das Objekt mit dem Schlüssel "userrow:" konkateniert mit der userid in die Variable result gespeichert. Sollte das Objekt nicht existieren (result == false), werden die Daten - analog zur obigen Methode - aus der Datenbank geholt. Zusätzlich wird ein Objekt erzeugt mit einem neuen Schlüssel erzeugt, welches die Daten beinhaltet. Im Gegensatz zu ersten Methode werden in dieser Methode die Daten nur dann aus der Datenbank geholt, wenn sie nicht bereits schon einmal geholt worden sind. Dadurch lässt sich viel Zeit sparen, was ich letztendlich durch eine Performacesteigerung für den User und eine Entlastung für die Datenbank niederlegt.

Installation

Windows

XAMPP liefert bereits die Memcache-Erweiterung mit. Diese muss nur noch in der php.ini unter xampp/apache/bin eingeschaltet werden. Eine Suche in der Datei nach "php_memcache.dll" führt direkt zur entsprechenden Zeile. Dort muss in der Regel nur das ";" am Anfang der Zeile entfernt werden und anschließend Apache neugestartet werden.

Mac

Wer XAMPP installiert hat und einen Intel-basierten Mac sein Eigen nennt, der kann eine kompilierte Memcache-Erweiterung direkt einbinden. Ansonsten muss die Erweiterung erst eigenständig kompiliert werden. Beides wird sehr gut in dem Artikel Setup a Memcached-Enabled MAMP Sandbox Envirnoment beschrieben.

Verwendung von Memcached in eStudy

Initialisierung auf dem Server

Um Memcached in PHP verwenden zu können, muss Memcached in der php.ini als Erweiterung registriert werden. Dies geschieht durch Hinzufügen der Zeile "memcache.so" bei den extensions. Auf dem Server wird ein Memcached-Daemon gestartet (zum Beispiel durch memcached -d -u memcached -m 128 127.0.0.1 -p 11211 ).

Memcached wird PHP-seitig in der init.inc.php im Ordner common initialisiert:

$memcache = null;
try {
    if($settings['memcached_enabled']) {
        $memcache = new Memcache;
        if( ! $memcache->connect($settings['memcached'], $settings['memcached_port']) ) {
            throw new Exception("Memcached not available");
        }
        $memcache->setCompressThreshold(50000, 0.2);
    }
} catch(Exception $e) {
    $memcache = null;
}

In den Einstellungen wir unter "memcached_enabled" nachgeschaut, ob Memcached aktiviert ist. Falls ja, wird Memcached mit einem Threshold (minimale Anzahl von Bytes, ab denen die Daten komprimiert werden) und min_saving von 0,2 (mind. 20 % der gespeicherten Daten sind komprimiert) initalisiert, ansonsten nicht.

Die Verfügbarkeit von Memcached wird direkt über die MemcachedWrapper-Klasee durchgeführt. Beispielhaft dazu der Einsatz von Memcached in der eModeration:

if ( $MemcachedWrapper::active ) {
    $this->webservice = new WebserviceCache($webservice);
} else {
    $this->webservice = $webservice;
}

Hier wird auch gleich deutlich, wie Memcached am effektivsten eingesetzt werden kann: Als Write-Through-Cache für die eigentliche Datenbank. Dabei werden Daten synchron in die Datenbank und den Cache geschrieben. Der Einsatz des Stellvertreter-Entwurfsmusters bietet sich daher an.

Es gibt allerdings auch Fälle, wo ein direkter Write-Through-Cache nicht möglich ist. Beispielsweise bei Modulen, deren Daten nicht über die eigene API manipuliert werden. Der Programmierer muss daher genau untersuchen, ob dies bei den Daten seines Moduls der Fall ist. Falls ja, ist es am Einfachsten, wenn an die entsprechenden Stellen im Portal die jeweiligen Memcache-Einträge direkt gelöscht werden. Der Cache wird dann beim nächsten regulären Aufruf des Moduls mit den neuen Daten wieder neu aufgebaut.

Konventionen der Zugriffsweise auf Memcached

Der Zugriff auf Memcached erfolgt über die MemcachedWrapper-Klasse, welche sich im web/common-Ordner befindet. Der Memcached-Wrapper ist eine vereinfachte (in diesem Fall aber ausreichende Implementierung) des Stellvertreter-Musters. Die Kapselung ist deswegen sinnvoll, um alle Zugriffe an einer Stelle kontrollieren und ggf. an Veränderungen anpassen zu können. Nachteilig ist allerdings der leichte Performance-Verlust, der im Vergleich zu einem direkten Aufruf entsteht.

Wahl des Schlüsselnamens

Die Syntax für den Schlüsselname ist <ID des Kurses><modul(optional)><frei wählbarer text>). Beispiel: Bei der Mitgliederübersicht im Kurs "iPhone 3G" wird Memcached für die ausgegebene Tabelle verwendet. Der Schlüssel könnte dann "243Mitgliederselect..." heißen. Die ID des Kurses ist Voraussetzung, damit der Dozent später die zu seinem Kurs zugehörigen Schlüssel löschen kann. (Die ID vom Foyer ist übrigens "0".)

Zurücksetzen von Memcached

Bei auftretenden Problemen mit Memcached gibt es mehrere Möglichkeiten des globalen Zurücksetzens von Memcache bzw. des Löschens von einzelnen Schlüsseln.

Auf Datenbank-Ebene

Auf der untersten, der Datenbank-Ebene, kann die Deaktivierung von Memcached einfach durch das Setzen von "memcached_enabled" auf "0" erreicht werden.Memcached Deaktivierung Datenbank.png

Als Admin in eStudy

Als angemeldeter Root bzw. User mit Administratorrechten kann man über Wartung->Einstellungen->Memcached->Memcached deaktivieren.Admim Memcached Deaktivierung.png

Als Dozent in eStudy

Dozenten können die globale Verwendung von Memcached nicht unterbinden. Allerdings können sie die Memcached-Schlüssel, die ihren Kurs betreffen, löschen ("flushen") unter Kurs/eCom organisieren->Memcached->Memcached-Schlüssel zurücksetzen.

Literatur