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.
fonte
Respostas:
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
.fonte
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:
Também poderia ser um problema de configuração do mysql?
fonte
http://dev.mysql.com/doc/refman/5.0/en/innodb-deadlocks.html esta página do mysql sugere o que fazer quando você encontrar o impasse.
O ajuste fino da configuração do mysql ajudará você a resolver esse problema.
fonte