Zum Inhalt springen

Memcached

aus Wikipedia, der freien Enzyklopädie
Memcached

[[Datei:Lua-Fehler in Modul:Wikidata, Zeile 1703: attempt to index field 'wikibase' (a nil value)|150px]]
Basisdaten

Maintainer Lua-Fehler in Modul:Wikidata, Zeile 1703: attempt to index field 'wikibase' (a nil value)
Entwickler Lua-Fehler in Modul:Wikidata, Zeile 1703: attempt to index field 'wikibase' (a nil value)
Erscheinungsjahr Lua-Fehler in Modul:Wikidata, Zeile 1703: attempt to index field 'wikibase' (a nil value)
Aktuelle Version Lua-Fehler in Modul:Wikidata, Zeile 1703: attempt to index field 'wikibase' (a nil value)
(Lua-Fehler in Modul:Wikidata, Zeile 1703: attempt to index field 'wikibase' (a nil value))
Aktuelle Vorabversion Lua-Fehler in Modul:Wikidata, Zeile 1703: attempt to index field 'wikibase' (a nil value)
(Lua-Fehler in Modul:Wikidata, Zeile 1703: attempt to index field 'wikibase' (a nil value))
Betriebssystem Unix-Derivate, Windows
Programmier­sprache Lua-Fehler in Modul:Wikidata, Zeile 1703: attempt to index field 'wikibase' (a nil value)
Kategorie Cache-Server
Lizenz Lua-Fehler in Modul:Wikidata, Zeile 1703: attempt to index field 'wikibase' (a nil value)
deutschsprachig ja
Lua-Fehler in Modul:Wikidata, Zeile 1703: attempt to index field 'wikibase' (a nil value)

Memcached [<templatestyles src="IPA/styles.css" />ˈmɛm.kæʃ.tː] ist ein verteiltes Cache-System zum Hinterlegen und Abholen von Daten im Arbeitsspeicher als Schlüssel-Werte-Datenbank. Die Software findet hauptsächlich Verwendung für dynamische Websites, die Daten aus Datenbanksystemen zeitweise auf einem oder mehreren memcached-Servern hinterlegen. Dies dient der Leistungs-Verbesserung, indem durch die Vorhaltung von wichtigen Daten im Arbeitsspeicher beispielsweise Festplattenzugriffe vermieden werden beziehungsweise der Aufruf von aufwändigen und häufig verwendeten Datenbankabfragen – insbesondere SELECT-Anweisungen – minimiert wird. Memcached ist quelloffene Software und frei verwendbar durch Veröffentlichung unter der 3-Klausel-BSD-Lizenz.

Geschichte[Bearbeiten]

Memcached wurde ursprünglich von der Firma Danga Interactive für das Internetportal LiveJournal entwickelt. Bis zum 15. Juni 2003 stand die Software unter der GPL, als die Lizenzierung zur BSD-Lizenz geändert wurde. Mittlerweile ist der Einsatz der Software weit verbreitet und dient beispielsweise allein bei Facebook und der Wikipedia zur Bedienung von Milliarden von Nutzern im Monat.

Funktionsweise[Bearbeiten]

Die Verbindung zu einem solchen Server findet über die Protokolle TCP und IP statt. Daten werden mit einem eindeutigen Schlüsselwert versehen (vergleichbar mit dem Namen einer Variablen) und als Zeichenketten im Arbeitsspeicher abgelegt. Um das Abspeichern von Datentypen wie Ganz- oder Fließkommazahlen sowie Objekten zu ermöglichen, werden diese Daten durch die meisten Programmbibliotheken im Vorfeld serialisiert.

Daten können entweder dauerhaft oder zeitweise abgespeichert werden. Für den letzteren Fall übernimmt memcached das Löschen automatisch.

Beispiele[Bearbeiten]

PHP[Bearbeiten]

<syntaxhighlight lang="php"> // Verbindung herstellen $memcached = @memcache_connect('localhost', 11211)

            or die('FEHLER! Die Verbindung zum Server ist fehlgeschlagen!');

// Die Zeichenkette 'Hallo' unter der Bezeichnung 'wert1' // für 1800 Sekunden abspeichern $memcached->add('wert1', 'Hallo', false, 1800);

// Die Zeichenkette 'Hallo, nochmal' unter der Bezeichnung 'wert2' // dauerhaft (Wert 0) in komprimierter Form abspeichern $memcached->add('wert2', 'Hallo, nochmal', MEMCACHE_COMPRESSED, 0);

// 'wert1' löschen $memcached->delete('wert1');

// 'wert2' mit dem Ganzzahlenwert 5979 ersetzen und für 23979 Sekunden // unkomprimiert abspeichern. Vorhandene Werte müssen mit replace() überschrieben // werden. Eine Verwendung von add() würde in einem solchen Fall zu einem // Fehler führen! $memcached->replace('wert2', 5979, false, 23979);

// 'wertObjekt' für 10 Sekunden mit dem Wert einer Instanz der PHP-Klasse // stdClass anlegen $memcached->add('wertObjekt', new stdClass(), false, 10);

// das gespeicherte Objekt von 'wertObjekt' ausgeben echo var_export($memcached->get('wertObjekt'), true);

// sämtliche Statistiken, die der Server zur Verfügung stellt, ausgeben var_dump($memcached->getStats());

// alle Werte löschen $memcached->flush();

// Verbindung wieder schließen $memcached->close();

</syntaxhighlight>

Perl[Bearbeiten]

<syntaxhighlight lang="perl"> use Modern::Perl; use Cache::Memcached::Fast;

  1. neues memcached-Objekt erzeugen

my $cache = Cache::Memcached::Fast->new({ servers => [ '127.0.0.1:11211', '192.168.50.55:11211' ] });

  1. ein einfaches key/value Paar speichern

$cache->set( 'key', 'value' );

  1. komplexe Datenstrukturen speichern

$cache->set( 'key', { name => 'John', age => 22 } );

  1. gespeicherte Daten abfragen

my $data = $cache->get( 'key' );

  1. einen Datensatz löschen

$cache->delete( 'key' );

  1. alle Werte löschen

$cache->flush_all;

  1. Verbindung schließen

$cache->disconnect_all; </syntaxhighlight>

Java[Bearbeiten]

<syntaxhighlight lang="java"> // Liste für die Server erstellen List<InetSocketAddress> memcachedServers = new ArrayList<InetSocketAddress>(); memcachedServers.add( new InetSocketAddress("localhost",11211) );

// Verbindung herstellen MemcachedClient memcachedClient = new MemcachedClient(memcachedServers);

// Die Zeichenkette "Hallo" für eine Stunde (3600 Sekunden) unter der Bezeichnung "wert1" abspeichern memcachedClient.add("wert1", 3600, "Hallo");

// "wert1" löschen memcachedClient.delete("wert1");

// alle Werte löschen memcachedClient.flush()

</syntaxhighlight>

Missbrauch als DDoS-Werkzeug[Bearbeiten]

Aus dem öffentlichen Internet per UDP-Protokoll erreichbare memcached-Server können von Angreifern verwendet werden, um Denial-of-Service-Angriffe zu verstärken.<ref>Sam Kottler: Skriptfehler: Ein solches Modul „Vorlage:Internetquelle“ ist nicht vorhanden. In: Skriptfehler: Ein solches Modul „Vorlage:Internetquelle“ ist nicht vorhanden. 1. März 2018; ehemals im Vorlage:Referrer (nicht mehr online verfügbar); (Skriptfehler: Ein solches Modul „Multilingual“ ist nicht vorhanden.).@1@2Vorlage:Toter Link/github.blog (Seite nicht mehr abrufbar. Suche im Internet Archive)</ref> Da die Antwort auf eine memcached-Anfrage in der Regel bedeutend größer als die Anfrage ist, kann der Angreifer, wie bei einer DNS Amplification Attack, die Menge der an das Angriffsziel geschickten Daten erhöhen. Diese Angriffstechnik wurde bei einer Attacke auf github.com Ende Februar 2018 genutzt, um die bis dahin höchste bei einem DDoS-Angriff beobachtete Datenrate zu erreichen.<ref>Skriptfehler: Ein solches Modul „Vorlage:Internetquelle“ ist nicht vorhanden. In: Skriptfehler: Ein solches Modul „Vorlage:Internetquelle“ ist nicht vorhanden. Ehemals im Vorlage:Referrer (nicht mehr online verfügbar); (Skriptfehler: Ein solches Modul „Multilingual“ ist nicht vorhanden.).@1@2Vorlage:Toter Link/www.heise.de (Seite nicht mehr abrufbar. Suche im Internet Archive)</ref>

Eine Firewall vor einem memcached-Server kann verhindern, dass er auf diese Weise missbraucht wird. Seit Update 1.5.6 wird UDP zudem nicht mehr als Standardprotokoll in memcached genutzt, um der Verbreitung des Angriffsvektors entgegenzuwirken.<ref>Diese DDoS-Attacken brechen alle Rekorde. Spiegel Online, 8. März 2018; abgerufen am 9. März 2018</ref><ref>Skriptfehler: Ein solches Modul „Vorlage:Internetquelle“ ist nicht vorhanden. 27. Februar 2018; ehemals im Vorlage:Referrer (nicht mehr online verfügbar); (Skriptfehler: Ein solches Modul „Multilingual“ ist nicht vorhanden.).@1@2Vorlage:Toter Link/github.com (Seite nicht mehr abrufbar. Suche im Internet Archive)</ref>

Weblinks[Bearbeiten]

  • Offizielle Webpräsenz
  • Tim Schürmann: Skriptfehler: Ein solches Modul „Vorlage:Internetquelle“ ist nicht vorhanden. In: Skriptfehler: Ein solches Modul „Vorlage:Internetquelle“ ist nicht vorhanden. Ehemals im Vorlage:Referrer (nicht mehr online verfügbar);

Programmbibliotheken[Bearbeiten]

Software, die memcached verwendet[Bearbeiten]

Einzelnachweise[Bearbeiten]

<references />