EinführungHitting
Cache-MaintenanceSummary
PostgreSQL und memcachedBuilding a Query Cache
Björn Häuser
imos GmbH
11.11.2011 / PGconf.DE
Björn Häuser PostgreSQL und memcached
EinführungHitting
Cache-MaintenanceSummary
Outline
1 Einführung
2 Hitting
3 Cache-Maintenance
Björn Häuser PostgreSQL und memcached
EinführungHitting
Cache-MaintenanceSummary
Szenario
WebapplikationPro Request viele, größtenteils einfache, Queries
Björn Häuser PostgreSQL und memcached
EinführungHitting
Cache-MaintenanceSummary
Einteilung von Caches
Tradeoff zwischenMaintenanceKomplexität der AnfragenDirty-Cache-Hit / Cache-Miss
TransparenzBeeinflussung des Programmierflusses
Björn Häuser PostgreSQL und memcached
EinführungHitting
Cache-MaintenanceSummary
Zielsetzung
Häufig auftretende Queries speichernSelbstständige MaintenanceCache-Miss anstatt Dirty-Cache-HitMinimaler Einfluss auf ApplikationJederzeit zu- und abschaltbar
Björn Häuser PostgreSQL und memcached
EinführungHitting
Cache-MaintenanceSummary
Cache
In-Memory-Key-Value-StoreMemcached
Björn Häuser PostgreSQL und memcached
EinführungHitting
Cache-MaintenanceSummary
Komplexität vs. Häufigkeit
Björn Häuser PostgreSQL und memcached
EinführungHitting
Cache-MaintenanceSummary
Aufbau
Björn Häuser PostgreSQL und memcached
EinführungHitting
Cache-MaintenanceSummary
Grundlegende Arbeitsweise
Tabellen werden in logische Gruppen unterteiltJede Gruppe bekommt einen eindeutigen Bezeichner:Handle
Beziehung zwischen Tabellen und Handle wird gespeichert
Query wird mindestens einem Handle zugeordnet
Björn Häuser PostgreSQL und memcached
EinführungHitting
Cache-MaintenanceSummary
Schema
memcache_tables
Row
0R
ow
1
memcache_handle table_name
users
users
users_data
memcache_handles
Row
0R
ow
1
memcache_handle
users users
Björn Häuser PostgreSQL und memcached
EinführungHitting
Cache-MaintenanceSummary
Aufbau der Schlüssel
Ein Handle speichert die aktuelle Revision$handleRevision = "{$handle}_rev"
Key zusammengesetzt aus:QueryParameterRevision des Handles
Björn Häuser PostgreSQL und memcached
EinführungHitting
Cache-MaintenanceSummary
Beispiel
Query:
SELECT user_id, login, firstname, lastnameFROM usersWHERE user_id = ?
Handle:users
Abfragen der Revision des Handles:$handleRevision = memcache_get("{$handle}_rev");
Zusammenbauen des Keys:
$key = $handle . "_" . md5($query . implode(",",$params)) . "_rev_" . $handleRevision;
Björn Häuser PostgreSQL und memcached
EinführungHitting
Cache-MaintenanceSummary
Ergebnisse
Memcache-Key:
"users_e5c18e041e700d90717a634fb9751207_rev_1"
Björn Häuser PostgreSQL und memcached
EinführungHitting
Cache-MaintenanceSummary
Cache-Maintenance
Bei Änderungen an Tabellen müssen die zugeordnetenHandles inkrementiert werdenFolgen:
Alle zwischengespeicherten Queries werden automatischungültigVorher:users_e5c18e041e700d90717a634fb9751207_rev_1Nachher:users_e5c18e041e700d90717a634fb9751207_rev_2
On-Commit-Event-Problematik
Björn Häuser PostgreSQL und memcached
EinführungHitting
Cache-MaintenanceSummary
On-Commit-Event-Problematik
Cache nur invalidieren wenn Transaktion COMMITedwurdeCache und Datenbank synchronisieren
Race-Conditions
Björn Häuser PostgreSQL und memcached
EinführungHitting
Cache-MaintenanceSummary
Maintenance per Trigger
Reagiert auf Veränderungen der Tabelle (INSERT,UPDATE und DELETE)Zugeordnete Handles auslesen und inkrementierenVorteile:
Einfach umzusetzenNur Abhänigkeit auf pg_memcache
Nachteile:Reset auch bei ROLLBACKRace-Conditions
Björn Häuser PostgreSQL und memcached
EinführungHitting
Cache-MaintenanceSummary
Maintenance per Trigger
FOR p_memcached_handle INSELECT mt . memcached_handleFROM memcached_tables mtWHERE mt . table_name = TG_TABLE_NAME
LOOPp_rev_name = p_memcached_handle .
memcached_handle | | ’ _rev ’ ;p_rev = memcache_get ( p_rev_name ) ;IF p_rev IS NOT NULL THEN
PERFORM memcache_incr ( p_rev_name ) ;END IF ;
END LOOP;
Björn Häuser PostgreSQL und memcached
EinführungHitting
Cache-MaintenanceSummary
Maintenance per Trigger
Race-Condition 1:Transaktion A resettet HandlesTransaktion B hinterlegt alte Daten unter neuer RevisionTransaktion A COMMITed seine DatenFolge: Alte Daten liegen im Cache
Race-Condition 2:Transaktion A resettet HandlesTransaktion B hinterlegt alte Daten unter neuer RevisionTransaktion A zerstört die Transaktion und ROLLBACKedFolge: Richtige Daten im Cache, aber unnötigerCache-Miss
Björn Häuser PostgreSQL und memcached
EinführungHitting
Cache-MaintenanceSummary
Maintenance per LISTEN / NOTIFY
NOTIFYSeit PostgreSQL 9.0 mit PayloadWird erst beim COMMIT zugestellt
Handler übernimmt das Inkrementieren der HandlesVorteile:
Keine Abhängigkeit in der DatenbankEine Nachricht kann mehreren Destinationen zugestelltwerdenGleiche Nachrichten werden zusammengefasst
Nachteile:Client muss entweder POLLen oder SELECTenKein Two-Phase-Commit möglich
Poor-Mans-Queue?
Björn Häuser PostgreSQL und memcached
EinführungHitting
Cache-MaintenanceSummary
Maintenance per LISTEN / NOFITY
NOTIFY (innerhalb eines Triggers):
EXECUTE pg_notify(TG_TABLE_SCHEMA,(SELECT string_agg(memcached_handle, ’,’)FROM memcached_tables
WHERE table_name = TG_TABLE_NAME));
LISTEN:http://rhodiumtoad.org.uk/junk/listen-min.pl.txt
Björn Häuser PostgreSQL und memcached
EinführungHitting
Cache-MaintenanceSummary
Maintenance per LISTEN / NOFITY
Wartezeiten bis NOTIFY die Destination erreichtWenig Kontrolle über die Nachricht
Björn Häuser PostgreSQL und memcached
EinführungHitting
Cache-MaintenanceSummary
Maintenance per Queue
Eleganteste LösungPgQ
Nachricht vs. Event transportierenConsumer übernimmt das Inkrementieren der Handles
Björn Häuser PostgreSQL und memcached
EinführungHitting
Cache-MaintenanceSummary
Maintenance per Queue
Vorteile:Volle Kontrolle über NachrichtenEine Nachricht kann mehreren Destinationen zugestelltwerdenPgQ übernimmt die Verteilung
Nachteile:Externer Dienst (Ticker)
Links:http://www.pgcon.org/2008/schedule/events/79.en.htmlhttp://wiki.postgresql.org/wiki/PGQ_Tutorial
Björn Häuser PostgreSQL und memcached
EinführungHitting
Cache-MaintenanceSummary
Allgemein
ProblemeVerdecken von langsamen Queries
MemcachedMonitoring
http://code.google.com/p/memcached/wiki/NewProgrammingFAQ
Tuninghttp://code.google.com/p/memcached/wiki/NewUserInternals
Expire setzen
Björn Häuser PostgreSQL und memcached
EinführungHitting
Cache-MaintenanceSummary
Summary
Leicht integrierbare Lösung um Antwortzeiten zuverbessernWenig Einfluss auf ProgrammierflussRace-Conditions
ZukunftRace-Conditions minimierenCache wärmen / vorbefüllen
Leave Feedbackhttps://www.postgresql.eu/events/feedback/pgconfde2011/
Björn Häuser PostgreSQL und memcached