Como posso carregar milhares de nós por hora em um site do drupal 7 ao vivo e evitar conflitos?

9

Há pouco tempo, escrevi sobre deadlock aqui: PDOException: SQLSTATE [40001]: Falha na serialização: 1213 Deadlock encontrado ao tentar obter o lock;

Apesar de tudo que minha equipe de desenvolvimento tenta fazer, ainda temos erros como este:

PDOException: SQLSTATE [40001]: Falha de serialização: 1213 Impasse encontrado ao tentar obter o bloqueio; tente reiniciar a transação: INSERT INTO {location_instance} (nid, vid, uid, genid, lid) VALORES (: db_insert_placeholder_0,: db_insert_placeholder_1,: db_insert_placeholder_2,: db_insert_placeholder_3,: db_insert_placeholder_4); Matriz ([: 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_placeave_placeocall_4] (>) /var/www/website.com/sites/all/modules/location/location.module).

Apesar da tabela específica nesse exemplo, obtemos esse erro em outras tabelas.

Aqui está a minha situação. Eu participei de um grande projeto universitário. A qualquer momento, existem 50.000 residentes no campus que usam o sistema diariamente. Além disso, estou migrando centenas de milhares de itens de conteúdo manualmente e através do código do módulo personalizado (migração dos dados antigos da universidade) para este novo site do Drupal 7.

Esse erro está nos matando, a ponto de estarmos quase prontos para descartar os últimos anos de trabalho e fazer outra coisa se o Drupal não puder lidar com esse tipo de carga.

Mas essa é mais ou menos a minha pergunta - Como o Drupal pode lidar com esse tipo de carga? Como posso organizar meu fluxo de trabalho para lidar com tanta atividade? Esse é um problema do Drupal? Um problema no banco de dados?

Especificamente, estou executando o Ubuntu, pilha LAMP de 16 GB de RAM. Estou aberto a qualquer sugestão, seja relacionada ao Drupal, ao banco de dados, à configuração do servidor ou a um fluxo de trabalho diferente para trabalhar com os recursos do Drupal, portanto, fique à vontade para sugerir qualquer coisa, se você tiver experiência com tanta atividade.

blue928
fonte
Existe um artigo sobre a importação de grandes conjuntos de dados evolvingweb.ca/story/…
kalabro 4/12
Obrigado por isso. É muito encorajador ver que os volumes de dados podem realmente ser importados quase instantaneamente. No entanto, e o problema de usuários individuais postarem em suas próprias contas através dos formulários de nó? À medida que me aprofundo nesse assunto, as perguntas retóricas em minha cabeça crescem: "O Drupal pode lidar com tanto tráfego ao vivo? Se não, então qual é o objetivo?" Além das importações, temos uma equipe de cerca de 20 pessoas que estão adicionando conteúdo normalmente através de suas contas. O Drupal 'node save' pode realmente lidar apenas com 20 usuários simultâneos adicionando dados por vez?
blue928
Testamos nosso site Drupal com o Apache JMeter usando MySQL e PostgreSQL. Para o MySQL, nossos resultados foram de cerca de 20 nós. Para o PostgreSQL, os resultados foram muito melhores.
kalabro

Respostas:

5

Eu trabalho na Universidade de Stanford e tenho feito coisas semelhantes. Temos constantemente que carregar mais de 100.000 nós regularmente. Trabalhamos em nosso próprio código de carregamento personalizado por 2 anos e agora conseguimos acelerar bastante o processo usando o pcntl_fork. A única coisa que você deve lembrar é fechar toda a conexão do soquete antes de chamar o garfo. Por exemplo, você precisa fechar sua conexão mysql, conexão memcache e até conexão mongo. O Drupal criará automaticamente novas conexões quando uma não existir. No que diz respeito ao problema do impasse, fomos capazes de corrigir esse problema colocando innodb_locks_unsafe_for_binlog = 1.

Patrick
fonte
você está carregando aqueles em lote com código personalizado ou usando algumas das funções de API do drupal como node_save? Ou um módulo de tipo de migração? O código que você mencionou também está disponível para exibição pública? Seria bom ver como o pcntl_fork está integrado ao drupal para ver que vocês superaram esse obstáculo. Obrigado pela dica binlog!
blue928
2

A resposta é: Configure seu arquivo MySQL my.cnf corretamente.

Após pouco mais de uma semana de pesquisa, descobri que o Drupal 7 pode realmente lidar com esse tráfego de entrada simultâneo.

Essas PDOExceptions de deadlock estavam relacionadas ao arquivo my.cnf do MySQL que não estava sendo otimizado corretamente. Com a ajuda do grupo Drupal High Performance e outras fontes, nossa equipe não teve um único deadlock desde a implementação das novas definições de configuração para o MySQL. Testamos nossos scripts em lote para simular até 500 usuários atuais, salvando conteúdo sem problemas. Confira o tópico aqui.

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

Especificamente, Dalin sugeriu o uso de um assistente para obter um arquivo de configuração base com base nas especificações do servidor e nos tipos de tabela. Depois de usar isso, mesmo sem mais ajustes, os impasses pararam. Aqui está um link para o assistente, se você quiser experimentá-lo: https://tools.percona.com/wizard

Ficarei feliz em publicar o arquivo my.cnf se alguém achar útil.

Embora o problema do impasse não seja mais um problema, agora estamos recebendo esse erro com muita frequência:

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

Também poderia ser um problema de configuração do mysql?

blue928
fonte
Estamos começando a ver esse erro nós mesmos. Você já encontrou uma resposta para sua pergunta?
trimbletodd