Wie kann ich Tausende von Knoten pro Stunde auf eine Live-Drupal-7-Site hochladen und Deadlocks vermeiden?

9

Vor nicht allzu langer Zeit habe ich hier über Deadlock geschrieben: PDOException: SQLSTATE [40001]: Serialisierungsfehler: 1213 Deadlock beim Versuch, eine Sperre zu erhalten;

Trotz allem, was mein Entwicklungsteam versucht, erhalten wir immer noch folgende Fehler:

PDOException: SQLSTATE [40001]: Serialisierungsfehler: 1213 Deadlock beim Versuch, eine Sperre zu erhalten; Versuchen Sie, die Transaktion neu zu starten: INSERT INTO {location_instance} (nid, vid, uid, genid, lid) VALUES (: db_insert_placeholder_0 ,: db_insert_placeholder_1 ,: db_insert_placeholder_2 ,: db_insert_placeholder_3 ,: db_insert_placeholder_4); Array ([: db_insert_placeholder_0] => 1059 [: db_insert_placeholder_1] => 1059 [: db_insert_placeholder_2] => 0 [: db_insert_placeholder_3] => cck: field_item_location: 1059 [: db_insert_placeholder_4] (>) /var/www/website.com/sites/all/modules/location/location.module).

Trotz der spezifischen Tabelle in diesem Beispiel wird dieser Fehler in anderen Tabellen angezeigt.

Hier ist meine Situation. Ich habe ein großes Universitätsprojekt gemacht. Zu jeder Zeit nutzen täglich 50.000 Campusbewohner das System. Darüber hinaus migriere ich Hunderte von Tausenden von Inhalten sowohl manuell als auch über benutzerdefinierten Modulcode (Migration von den alten Universitätsdaten) auf diese neue Drupal 7-Site.

Dieser Fehler bringt uns um, bis zu dem Punkt, an dem wir fast bereit sind, die Arbeit der letzten Jahre zu verschrotten und uns für etwas anderes zu entscheiden, wenn Drupal diese Art von Last nicht bewältigen kann.

Aber das ist mehr oder weniger meine Frage: Wie kann Drupal mit dieser Art von Last umgehen? Wie kann ich meinen Arbeitsablauf organisieren, um so viele Aktivitäten bewältigen zu können? Ist das ein Drupal-Problem? Ein Datenbankproblem?

Insbesondere verwende ich Ubuntu, LAMP Stack 16 GB RAM. Ich bin offen für Vorschläge, ob es sich um Drupal, Datenbank, Serverkonfiguration oder einen anderen Arbeitsablauf handelt, um innerhalb der Funktionen von Drupal zu arbeiten. Wenn Sie Erfahrung mit so vielen Aktivitäten haben, können Sie also gerne Vorschläge machen.

blue928
quelle
Es gibt einen Artikel über das Importieren eines großen Datensatzes, der sich entwickelt.
Web.ca/story/…
Danke für das. Es ist sehr ermutigend zu sehen, dass Datenmengen tatsächlich fast sofort importiert werden können. Was ist jedoch mit dem Problem, dass einzelne Benutzer über ihre eigenen Konten über die Knotenformulare posten? Während ich mich mehr mit diesem Problem befasse, wachsen die rhetorischen Fragen in meinem Kopf: "Kann Drupal mit so viel Live-Verkehr umgehen? Wenn nicht, worum geht es dann?" Abgesehen von den Importen haben wir ein Team von ungefähr 20 Mitarbeitern, die normalerweise Inhalte über ihre Konten hinzufügen. Kann Drupal 'Node Save' wirklich nur 20 gleichzeitige Benutzer verarbeiten, die gleichzeitig Daten hinzufügen?
blue928
Wir haben unsere Drupal-Site mit Apache JMeter unter Verwendung von MySQL und PostgreSQL getestet. Für MySQL waren unsere Ergebnisse ungefähr 20 Knoten. Für PostgreSQL waren die Ergebnisse viel besser.
Kalabro

Antworten:

5

Ich arbeite für die Stanford University und habe ähnliche Dinge getan. Wir müssen ständig über 100.000 Knoten regelmäßig laden. Wir arbeiten seit 2 Jahren an unserem eigenen benutzerdefinierten Ladecode. Mit pcntl_fork konnten wir den Prozess erheblich beschleunigen. Das einzige, woran Sie denken müssen, ist, alle Socket-Verbindungen zu schließen, bevor Sie die Gabel aufrufen. Zum Beispiel müssen Sie Ihre MySQL-Verbindung, Memcache-Verbindung und sogar Mongo-Verbindung schließen. Drupal erstellt automatisch neue Verbindungen, wenn keine vorhanden ist. Was das Deadlock-Problem angeht, konnten wir dieses Problem durch Putten beheben innodb_locks_unsafe_for_binlog = 1.

Patrick
quelle
Laden Sie diese im Batch mit benutzerdefiniertem Code oder verwenden Sie einige der API-Funktionen von drupal wie node_save? Oder ein Migrationsmodul? Ist der von Ihnen erwähnte Code auch öffentlich zugänglich? Es wäre schön zu sehen, wie pcntl_fork in drupal integriert ist, um zu sehen, dass ihr dieses Hindernis überwunden habt. Danke für den binlog Tipp!
blue928
2

Die Antwort lautet: Konfigurieren Sie Ihre MySQL my.cnf-Datei korrekt.

Nach etwas mehr als einer Woche Recherche habe ich festgestellt, dass Drupal 7 tatsächlich so viel gleichzeitigen Eingabeverkehr verarbeiten kann.

Diese Deadlock-PDOExceptions waren darauf zurückzuführen, dass die MySQL-Datei my.cnf nicht richtig optimiert wurde. Mit Hilfe der Drupal High Performance-Gruppe und anderer Quellen konnte seit der Implementierung der neuen Konfigurationseinstellungen für MySQL in unserem Team kein einziger Deadlock auftreten. Wir haben unsere Batch-Skripte getestet, um bis zu 500 aktuelle Benutzer zu simulieren, die problemlos Inhalte speichern. Schauen Sie sich den Thread hier an.

http://groups.drupal.org/node/260938

Insbesondere schlug Dalin vor, einen Assistenten zu verwenden, um eine Basiskonfigurationsdatei basierend auf den Serverspezifikationen und Tabellentypen abzurufen. Nachdem dies verwendet wurde, wurden die Deadlocks auch ohne weitere Anpassungen gestoppt. Hier ist ein Link zum Assistenten, wenn Sie ihn ausprobieren möchten: https://tools.percona.com/wizard

Gerne poste ich die Datei my.cnf, wenn jemand sie hilfreich findet.

Obwohl das Deadlock-Problem kein Problem mehr darstellt, wird dieser Fehler jetzt sehr häufig angezeigt:

PDOException: SQLSTATE[42000]: Syntax error or access violation: 
1305 SAVEPOINT savepoint_1 does not exist: ROLLBACK TO SAVEPOINT savepoint_1; 
Array ( ) in file_usage_add() (line 661 of /var/www/website.com/includes/file.inc).

Könnte dies auch ein MySQL-Konfigurationsproblem sein?

blue928
quelle
Wir beginnen diesen Fehler selbst zu erkennen. Haben Sie jemals eine Antwort auf Ihre Frage gefunden?
trimbletodd