Come posso caricare migliaia di nodi all'ora su un sito live drupal 7 ed evitare deadlock?


9

Non molto tempo fa ho scritto di deadlock qui: PDOException: SQLSTATE [40001]: errore di serializzazione: 1213 deadlock trovato durante il tentativo di ottenere il blocco;

Nonostante tutto ciò che il mio team di sviluppo tenta di fare, otteniamo ancora errori come questo:

PDOException: SQLSTATE [40001]: errore di serializzazione: 1213 deadlock trovato durante il tentativo di ottenere il blocco; prova a riavviare la transazione: 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_))> 1000)> 1000 /var/www/website.com/sites/all/modules/location/location.module).

Nonostante la tabella specifica in quell'esempio, otteniamo questo errore su altre tabelle.

Ecco la mia situazione Ho preso un grande progetto universitario. In qualsiasi momento ci sono 50.000 residenti nel campus che usano il sistema quotidianamente. Inoltre, sto migrando centinaia di migliaia di contenuti sia manualmente che tramite il codice del modulo personalizzato (migrazione dai vecchi dati universitari) a questo nuovo sito Drupal 7.

Questo errore ci sta uccidendo, al punto che siamo quasi pronti a scartare il lavoro degli ultimi anni e andare con qualcos'altro se Drupal non è in grado di gestire questo tipo di carico.

Ma questa è più o meno la mia domanda: come può Drupal gestire questo tipo di carico? Come posso organizzare il mio flusso di lavoro per essere in grado di gestire questa attività? È un problema di Drupal? Un problema con il database?

In particolare, sto eseguendo Ubuntu, stack LAMP da 16 GB di RAM. Sono aperto a qualsiasi suggerimento che si tratti di Drupal, di database, di configurazione del server o di un diverso flusso di lavoro per funzionare all'interno delle capacità di Drupal, quindi sentiti libero di suggerire qualsiasi cosa se hai esperienza con questa attività.


C'è un articolo sull'importazione di grandi set di dati evolvingweb.ca/story/…
kalabro,

Grazie per questo. È molto incoraggiante vedere che volumi di dati possono davvero essere importati quasi istantaneamente. Tuttavia, che dire del problema dei singoli utenti che pubblicano tramite i propri account tramite i moduli del nodo? Mentre scavo e approfondisco di più questo problema, le domande retoriche nella mia testa crescono: "Può Drupal gestire questo traffico dal vivo? In caso contrario, qual è il punto?" Oltre alle importazioni, abbiamo un team di circa 20 persone che sta aggiungendo contenuti normalmente attraverso i loro account. Drupal 'salva nodo' può davvero gestire solo 20 utenti simultanei che aggiungono dati alla volta?
blue928

Abbiamo testato il nostro sito Drupal con Apache JMeter usando MySQL e PostgreSQL. Per MySQL i nostri risultati sono stati di circa 20 nodi. Per PostgreSQL i risultati sono stati molto migliori.
Kalabro,

Risposte:


5

Lavoro all'università di Stanford e ho fatto cose simili. Dobbiamo costantemente caricare oltre 100.000 + nodi su base regolare. Abbiamo lavorato sul nostro codice di caricamento personalizzato per 2 anni e ora sono stato in grado di velocizzare il processo piuttosto grande usando pcntl_fork. L'unica cosa che devi ricordare è chiudere tutte le connessioni socket prima di invocare il fork. Ad esempio, devi chiudere la tua connessione mysql, la connessione memcache e persino la connessione mongo. Drupal creerà automaticamente nuove connessioni quando non ne esiste una. Per quanto riguarda il problema del deadlock, siamo riusciti a risolvere il problema inserendo innodb_locks_unsafe_for_binlog = 1.


stai caricando quelli in batch con codice personalizzato o usando alcune delle funzioni API di drupal come node_save? O un modulo del tipo di migrazione? Inoltre il codice che hai citato è disponibile per la visualizzazione pubblica? Sarebbe bello vedere come pcntl_fork è integrato con Drupal per vederti che voi ragazzi avete superato questo ostacolo. Grazie per il suggerimento binlog!
blue928

2

La risposta è: configura correttamente il tuo file my.cnf MySQL.

Dopo poco più di una settimana di ricerche, ho scoperto che Drupal 7 può davvero gestire questo traffico di input molto simultaneo.

Queste eccezioni PDO Deadlock erano correlate al file my.cnf di MySQL che non veniva ottimizzato correttamente. Con l'aiuto del gruppo Drupal High Performance e di altre fonti, il nostro team non ha avuto un singolo deadlock dall'implementazione delle nuove impostazioni di configurazione per MySQL. Abbiamo testato i nostri script batch per simulare fino a 500 utenti attuali salvando i contenuti senza problemi. Dai un'occhiata al thread qui.

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

In particolare, Dalin ha suggerito di utilizzare una procedura guidata per ottenere un file di configurazione di base basato sulle specifiche del server e sui tipi di tabella. Dopo averlo usato, anche senza ulteriori modifiche, i deadlock si sono fermati. Ecco un link alla procedura guidata se desideri provarlo: https://tools.percona.com/wizard

Sarò felice di pubblicare il file my.cnf se qualcuno lo troverà utile.

Sebbene il problema Deadlock non sia più un problema, ora stiamo riscontrando questo errore molto frequentemente:

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).

Potrebbe trattarsi anche di un problema di configurazione mysql?


Stiamo iniziando a vedere questo errore noi stessi. Hai mai trovato una risposta alla tua domanda?
trimbletodd,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.