¿Cómo puedo cargar miles de nodos por hora en un sitio de drupal 7 en vivo y evitar puntos muertos?

9

No hace mucho tiempo escribí sobre un punto muerto aquí: PDOException: SQLSTATE [40001]: Error de serialización: 1213 Punto muerto encontrado al intentar obtener el bloqueo;

A pesar de todo lo que mi equipo de desarrollo intenta hacer, todavía recibimos errores como este:

PDOException: SQLSTATE [40001]: error de serialización: 1213 Deadlock encontrado al intentar obtener el bloqueo; intente reiniciar la transacción: 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).

A pesar de la tabla específica en ese ejemplo, obtenemos este error en otras tablas.

Aquí está mi situación. He tomado un gran proyecto universitario. En cualquier momento hay 50,000 residentes del campus que usan el sistema diariamente. Además de eso, estoy migrando cientos de miles de elementos de contenido tanto manualmente como a través de un código de módulo personalizado (migración de los datos antiguos de la universidad) a este nuevo sitio de Drupal 7.

Este error nos está matando, hasta el punto de que estamos casi listos para desechar el trabajo de los últimos años e ir con otra cosa si Drupal no puede manejar este tipo de carga.

Pero esa es más o menos mi pregunta: ¿cómo puede Drupal manejar este tipo de carga? ¿Cómo puedo organizar mi flujo de trabajo para poder manejar tanta actividad? ¿Es este un problema de Drupal? ¿Un problema de base de datos?

Específicamente, estoy ejecutando Ubuntu, LAMP stack 16GB RAM. Estoy abierto a cualquier sugerencia, ya sea relacionada con Drupal, relacionada con la base de datos, relacionada con la configuración del servidor o un flujo de trabajo diferente para trabajar dentro de las capacidades de Drupal, así que siéntase libre de sugerir cualquier cosa si tiene experiencia con esta gran actividad.

blue928
fuente
Hay un artículo sobre la importación de grandes conjuntos de datos evolvingweb.ca/story/…
kalabro
Gracias por eso. Es muy alentador ver que los volúmenes de datos pueden importarse casi instantáneamente. Sin embargo, ¿qué pasa con el problema de los usuarios individuales que publican a través de sus propias cuentas a través de los formularios de nodo? A medida que cavo y profundizo más en este problema, las preguntas retóricas en mi cabeza crecen: "¿Puede Drupal manejar tanto tráfico en vivo? Si no, ¿cuál es el punto?" Además de las importaciones, tenemos un equipo de aproximadamente 20 personas que agregan contenido normalmente a través de sus cuentas. ¿Puede Drupal 'node save' realmente solo manejar 20 usuarios simultáneos agregando datos a la vez?
blue928
Probamos nuestro sitio Drupal con Apache JMeter usando MySQL y PostgreSQL. Para MySQL nuestros resultados fueron de unos 20 nodos. Para PostgreSQL, los resultados fueron mucho mejores.
kalabro

Respuestas:

5

Trabajo para la universidad de Stanford y he estado haciendo cosas similares. Constantemente tenemos que cargar más de 100,000 nodos de forma regular. Hemos estado trabajando en nuestro propio código de carga personalizado durante 2 años y ahora hemos podido acelerar el proceso bastante grande usando pcntl_fork. Lo único que debe recordar es cerrar todas las conexiones de socket antes de invocar la bifurcación. Por ejemplo, debe cerrar su conexión mysql, la conexión memcache e incluso la conexión mongo. Drupal creará automáticamente nuevas conexiones cuando no exista una. En cuanto al problema del punto muerto, pudimos solucionar ese problema poniendo innodb_locks_unsafe_for_binlog = 1.

Patricio
fuente
¿Está cargando esos en lote con código personalizado o está utilizando algunas de las funciones API de drupal como node_save? ¿O un módulo de tipo de migración? ¿El código que mencionó también está disponible para la vista pública? Sería bueno ver cómo pcntl_fork está integrado con drupal para ver que ustedes han superado este obstáculo. Gracias por el consejo de binlog!
blue928
2

La respuesta es: Configure su archivo MySQL my.cnf correctamente.

Después de un poco más de una semana de investigación, descubrí que Drupal 7 puede manejar este tráfico de entrada simultáneo.

Estas Deadlock PDOExceptions estaban relacionadas con el archivo MySQL my.cnf no optimizado correctamente. Con la ayuda del grupo Drupal High Performance y otras fuentes, nuestro equipo no ha tenido un solo punto muerto desde que implementó la nueva configuración de MySQL. Probamos nuestros scripts por lotes para simular hasta 500 usuarios actuales que guardan contenido sin ningún problema. Mira el hilo aquí.

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

Específicamente, Dalin sugirió usar un asistente para obtener un archivo de configuración base basado en las especificaciones del servidor y los tipos de tabla. Después de usar esto, incluso sin más ajustes, los puntos muertos se detuvieron. Aquí hay un enlace al asistente si desea probarlo: https://tools.percona.com/wizard

Estaré encantado de publicar el archivo my.cnf si alguien lo encuentra útil.

Aunque el problema de Deadlock ya no es un problema, ahora estamos recibiendo este error con mucha frecuencia:

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

¿Podría ser esto también un problema de configuración de MySQL?

blue928
fuente
Estamos empezando a ver ese error nosotros mismos. ¿Alguna vez encontró una respuesta a su pregunta?
trimbletodd