Post on 25-Sep-2020
transcript
EinführungCache-Hits
Cache-MaintenanceSummary
PostgreSQL und memcachedBuilding a generic Query Cache
Björn Häuser
imos GmbH
07.12.2010 / PGDays Stuttgart 2010
Björn Häuser PostgreSQL und memcached
EinführungCache-Hits
Cache-MaintenanceSummary
Outline
1 Einführung
2 Cache-Hits
3 Cache-Maintenance
Björn Häuser PostgreSQL und memcached
EinführungCache-Hits
Cache-MaintenanceSummary
Einteilung von Caches
Tradeoff zwischenMaintenanceKomplexität der AnfragenDirty-Cache-Hit / Cache-Miss
TransparenzBeeinflussung des Programmieraufwandes
Björn Häuser PostgreSQL und memcached
EinführungCache-Hits
Cache-MaintenanceSummary
Zielsetzung
Häufig auftretende Queries speichernSelbstständige MaintenanceCache-MissMinimaler Einfluss auf ApplikationJederzeit zu- und abschaltbar
Björn Häuser PostgreSQL und memcached
EinführungCache-Hits
Cache-MaintenanceSummary
Komplexität vs. Häufigkeit
Björn Häuser PostgreSQL und memcached
EinführungCache-Hits
Cache-MaintenanceSummary
Grundlegende Arbeitsweise
Tabellen werden nach Zugehörigkeit gruppiertJede 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ührungCache-Hits
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ührungCache-Hits
Cache-MaintenanceSummary
Aufbau der Schlüssel
Ein Handle speichert die aktuelle Revision$rev = "{$handle}_rev"
Cache-Key bestehend aus:QueryParameterRevision des Handles
Björn Häuser PostgreSQL und memcached
EinführungCache-Hits
Cache-MaintenanceSummary
Beispiel
Query:
SELECT user_id, login, firstname, lastnameFROM usersWHERE user_id = ?
Handle:users
Abfragen der Revision des Handles:$rev = memcache_get("{$handle}_rev");
Zusammenbauen des Keys:
$key = $handle . md5($query, implode(",", $params)) ."_rev_" . $rev;
Björn Häuser PostgreSQL und memcached
EinführungCache-Hits
Cache-MaintenanceSummary
Cache-Maintenance
Bei Änderungen an Tabellen müssen die zugeordnetenHandles inkrementiert werdenFolgen:
Alle zwischengespeicherten Queries werden automatischungültig
On-Commit-Event-Problematik
Björn Häuser PostgreSQL und memcached
EinführungCache-Hits
Cache-MaintenanceSummary
On-Commit-Problematik
Cache nur invalidieren wenn Transaktion COMMITedwurdeCache und Datenbank synchronisieren
Race-Conditions
Björn Häuser PostgreSQL und memcached
EinführungCache-Hits
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ührungCache-Hits
Cache-MaintenanceSummary
Maintenance per Trigger
FOR p_memcached_handle INSELECT mt . memcached_handleFROM memcached_tables mtWHERE mot . table_name = TG_RELNAME
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ührungCache-Hits
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ührungCache-Hits
Cache-MaintenanceSummary
Maintenance per LISTEN / NOTIFY
NOTIFYSeit PostgreSQL 9.0 mit PayloadWird erst beim COMMIT zugestellt
Handler übernimmt das Inkrementieren der HandlesNachricht vs. Event transportierenVorteile:
Keine Abhänigkeit 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ührungCache-Hits
Cache-MaintenanceSummary
Maintenance per LISTEN / NOFITY
NOTIFY:
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ührungCache-Hits
Cache-MaintenanceSummary
Maintenance per LISTEN / NOFITY
Wartezeiten bis NOTIFY die Destination erreichtWenig Kontrolle über die Nachricht
Björn Häuser PostgreSQL und memcached
EinführungCache-Hits
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ührungCache-Hits
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ührungCache-Hits
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ührungCache-Hits
Cache-MaintenanceSummary
Summary
Leicht integrierbare Lösung um Antwortzeiten zu erhöhenWenig Einfluss auf ProgrammierflussRace-Conditions
ZukunftRace-Conditions minimierenUmstellung auf Queueing-Lösung
Leave Feedback!http://2010.pgday.eu/feedback
Björn Häuser PostgreSQL und memcached