it-swarm.com.de

Probleme mit der Latenz der MySQL-Replikation auf den Seiten von wp-admin

Ich habe eine Umgebung mit WP 3.0.1 mit einer Master-Datenbank und zwei Slaves. Ich verwende HyperDB, um zu erzwingen, dass alle Schreibvorgänge an den Master gehen und alle Lesevorgänge von den beiden Slaves.

Auf den Seiten von wp-admin treten verschiedene Probleme auf, bei denen Daten in den Master geschrieben werden und WordPress versucht, von einem Slave zu lesen, und die Daten den Slave noch nicht erreicht haben. Ein Beispiel hierfür ist, wenn ich 'dbx_post_advanced' einhänge, um neue Posts mit Begriffen für Kategorien und benutzerdefinierte Taxonomien zu versehen. Ich habe überprüft, ob der Hook 'dbx_post_advanced' einwandfrei funktioniert, wenn ich HyperDB so konfiguriere, dass nur vom Master gelesen und geschrieben wird.

Ich suche derzeit nach folgenden Optionen, um dieses Problem zu beheben:

  • Nur einen Webserver für den gesamten wp-admin-Verkehr reservieren
    • Konfigurieren Sie diesen Server so, dass er nur in die/aus der Master-Datenbank liest und schreibt
    • Konfigurieren Sie den Lastenausgleich so, dass alle/wp-admin-URLs an diesen Webserver weitergeleitet werden
  • Konfigurieren Sie HyperDB so, dass nur für wp-admin-Seiten Lese-/Schreibzugriffe auf den Master ausgeführt werden
  • Einrichten der semisynchronen MySQL-Replikation

Lassen Sie mich wissen, wenn Sie zu diesem Thema einen Rat haben.

Danke, Dave

5
Dave Morris

Sie haben keine HyperDB-Revision erwähnt, also gehe ich von trunk @ 337290 aus.

Die SRTM-Funktion von HyperDB (Reads an Master senden) funktioniert auf zwei Arten. Zunächst wird verfolgt, welche Tabellen während des aktuellen Skripts Schreibvorgänge erhalten haben, und alle nachfolgenden Lesevorgänge für diese Tabellen werden an den Master gesendet. Zweitens haben Sie die Möglichkeit, alle Lesevorgänge an den Master zu senden.

Im ersten Fall ist es weiterhin möglich, dass ein Lesevorgang den Slave trifft, nachdem in dieselbe Tabelle geschrieben wurde. Wenn es sich bei dem Lesevorgang um eine Verknüpfungsabfrage oder eine andere Art von Abfrage handelt, bei der Tabellennamen weit vom Beginn der Abfrage entfernt platziert werden können, kann dies passieren. Wenn Sie die Abfrage überprüfen können, die nicht ordnungsgemäß an den Slave weitergeleitet wird, prüfen Sie, ob dies der Fall ist. Wenn ja, versuchen Sie, die Länge von substr hier zu erhöhen:

if ( preg_match($pattern, substr($query, 0, 1000)) )

Es ist wichtig zu verstehen, dass die SRTM-Funktion nur während eines Skripts den Überblick behält. Wenn Sie also einen Datensatz schreiben (im ersten Skript) und dann umgeleitet werden (jetzt im zweiten Skript) und dann versuchen, diesen Datensatz wieder aus der Datenbank zu lesen, werden Sie wahrscheinlich in diesem zweiten Skript vom Slave lesen.

Lassen Sie mich zum Schluss auf die Idee einer is_admin() eingehen. Es ist eine gute Idee, einfach und effektiv. Fügen Sie Ihrer db-config-Datei Folgendes hinzu:

if ( is_admin() )
    $wpdb->send_reads_to_masters();
3
Andy

Haben Sie sich mit der Tungsten Replicator-basierten MySQL-Replikation befasst http://code.google.com/p/tungsten-replicator/ , verbessert sie die native MySQL-Replikation und verbessert die Slave-Verzögerung usw. http://vbtechsupport.com/1318/ .

Wundervolles Kochbuch mit Beispiel-Setups für den Einstieg unter http://code.google.com/p/tungsten-replicator/wiki/TungstenReplicatorCookbook

0
p4guru

Ich würde empfehlen, dass Sie eine weitere Kopie Ihrer Site mit anderen Verbindungsdetails unter http://admin.example.com/ bereitstellen. In diesem Administratorbereich werden die Master-Verbindungsdetails verwendet und Lese- und Schreibvorgänge für den Master ausgeführt Sie leiden unter Problemen, wenn Daten nicht verfügbar sind. Sie können erzwingen, dass die Admin-URL unterschiedlich ist, indem Sie Flags in der WP-Konfiguration setzen.

    define('WP_SITEURL', 'http://admin.example.com');
    define('WP_CONTENT_URL', 'http://admin.example.com');

Die Frontend-Site http://example.com/ würde so funktionieren wie derzeit.

0
Tom