Comment puis-je télécharger des milliers de nœuds par heure sur un site Drupal 7 en direct et éviter les blocages?

9

Il n'y a pas si longtemps, j'ai écrit sur le blocage ici: PDOException: SQLSTATE [40001]: échec de sérialisation: 1213 blocage trouvé lors de la tentative d'obtention du verrouillage;

Malgré tout ce que mon équipe de développement essaie de faire, nous obtenons toujours des erreurs comme celle-ci:

PDOException: SQLSTATE [40001]: échec de sérialisation: 1213 Deadlock trouvé lors de la tentative d'obtention du verrou; essayez de redémarrer la transaction: 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 ([97) /var/www/website.com/sites/all/modules/location/location.module).

Malgré la table spécifique de cet exemple, nous obtenons cette erreur sur d'autres tables.

Voici ma situation. J'ai pris un grand projet universitaire. À tout moment, 50 000 résidents du campus utilisent quotidiennement le système. En plus de cela, je migre des centaines de milliers d'éléments de contenu à la fois manuellement et via le code de module personnalisé (migration à partir des anciennes données universitaires) vers ce nouveau site Drupal 7.

Cette erreur nous tue, au point que nous sommes presque prêts à abandonner les dernières années de travail et à aller avec autre chose si Drupal ne peut pas gérer ce type de charge.

Mais c'est plus ou moins ma question - Comment Drupal peut-il gérer ce type de charge? Comment puis-je organiser mon flux de travail pour pouvoir gérer autant d'activités? Est-ce un problème Drupal? Un problème de base de données?

Plus précisément, j'utilise Ubuntu, LAMP stack 16GB RAM. Je suis ouvert à toute suggestion que ce soit lié à Drupal, lié à la base de données, lié à la configuration du serveur ou à un flux de travail différent pour travailler selon les capacités de Drupal, alors n'hésitez pas à suggérer quoi que ce soit si vous avez de l'expérience avec autant d'activités.

blue928
la source
Il y a un article sur l'importation d'un grand ensemble de données evolvingweb.ca/story/…
kalabro
Merci pour ça. Il est très encourageant de voir que des volumes de données peuvent en effet être importés presque instantanément. Cependant, qu'en est-il du problème des utilisateurs individuels qui publient via leurs propres comptes via les formulaires de nœud? Au fur et à mesure que je creuse et approfondis ce problème, les questions rhétoriques dans ma tête grandissent, "Est-ce que Drupal peut gérer autant de trafic en direct? Sinon, à quoi ça sert?" Mis à part les importations, nous avons une équipe d'une vingtaine de personnes qui ajoutent du contenu normalement via leurs comptes. Drupal 'node save' peut-il vraiment gérer seulement 20 utilisateurs simultanés ajoutant des données à la fois?
blue928
Nous avons testé notre site Drupal avec Apache JMeter en utilisant MySQL et PostgreSQL. Pour MySQL, nos résultats étaient d'environ 20 nœuds. Pour PostgreSQL, les résultats étaient bien meilleurs.
Kalabro

Réponses:

5

Je travaille pour l'université de Stanford et j'ai fait des choses similaires. Nous devons constamment charger plus de 100 000 nœuds sur une base régulière. Nous travaillons sur notre propre code de chargement personnalisé depuis 2 ans et nous avons pu accélérer le processus en utilisant pcntl_fork. La seule chose dont vous devez vous souvenir est de fermer toutes les connexions de socket avant d'appeler le fork. Par exemple, vous devez fermer votre connexion mysql, votre connexion memcache et même votre connexion mongo. Drupal créera automatiquement de nouvelles connexions quand il n'en existe pas. En ce qui concerne le problème de blocage, nous avons pu résoudre ce problème en mettant innodb_locks_unsafe_for_binlog = 1.

Patrick
la source
les chargez-vous en lot avec du code personnalisé ou utilisez-vous certaines des fonctions de l'API de Drupal comme node_save? Ou un module de type migration? Le code que vous avez mentionné est-il également accessible au public? Ce serait bien de voir comment pcntl_fork est intégré à drupal pour vous voir, vous avez surmonté cet obstacle. Merci pour l'astuce binlog!
blue928
2

La réponse est: configurez correctement votre fichier MySQL my.cnf.

Après un peu plus d'une semaine de recherche, j'ai trouvé que Drupal 7 peut en effet gérer ce trafic d'entrée très simultané.

Ces exceptions PDO Deadlock étaient liées au fait que le fichier MySQL my.cnf n'était pas optimisé correctement. Avec l'aide du groupe Drupal High Performance et d'autres sources, notre équipe n'a eu aucun seul blocage depuis la mise en œuvre des nouveaux paramètres de configuration pour MySQL. Nous avons testé nos scripts batch pour simuler jusqu'à 500 utilisateurs actuels en enregistrant du contenu sans problème. Découvrez le fil ici.

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

Plus précisément, Dalin a suggéré d'utiliser un assistant pour obtenir un fichier de configuration de base basé sur les spécifications du serveur et les types de table. Après avoir utilisé cela, même sans peaufiner davantage, les blocages se sont arrêtés. Voici un lien vers l'assistant si vous souhaitez l'essayer: https://tools.percona.com/wizard

Je serai heureux de publier le fichier my.cnf si quelqu'un le trouve utile.

Bien que le problème de blocage ne soit plus un problème, nous obtenons maintenant cette erreur très fréquemment:

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

Serait-ce également un problème de configuration mysql?

blue928
la source
Nous commençons à voir cette erreur nous-mêmes. Avez-vous déjà trouvé une réponse à votre question?
trimbletodd