web-dev-qa-db-ja.com

1時間あたり1000のノードをライブのdrupal 7サイトにアップロードして、デッドロックを回避するにはどうすればよいですか?

少し前に私はここでデッドロックについて書きました: PDOException:SQLSTATE [40001]:Serialization failure:1213 Deadlock found when when get lock to get;

私の開発チームがやろうとしているすべてのことにもかかわらず、次のようなエラーが発生します。

PDOException:SQLSTATE [40001]:シリアル化の失敗:1213ロックを取得しようとしたときにデッドロックが見つかりました。トランザクションを再起動してみてください: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);配列([: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)in location_save_locations()(line 974 /var/www/website.com/sites/all/modules/location/location.module)。

この例の特定のテーブルにもかかわらず、他のテーブルでこのエラーが発生します。

これが私の状況です。私は大規模な大学のプロジェクトを受けました。常時、50,000人のキャンパス住民がこのシステムを毎日使用しています。それに加えて、私は手動で、およびカスタムモジュールコード(古い大学のデータからの移行)を通じて、何百ものコンテンツの何百ものアイテムをこの新しいDrupal 7サイトに移行しています。

Drupalがこのタイプの負荷を処理できない場合、このエラーは私たちを殺し、最後の年の価値のある仕事をスクラップして他の何かに取り掛かる準備がほぼ整います。

しかし、それは多かれ少なかれ私の質問です-Drupalこのタイプの負荷をどのように処理できますか?これだけのアクティビティを処理できるようにワークフローを整理するにはどうすればよいですか?これはDrupal問題?データベースの問題?

具体的には、Ubuntu、LAMPスタック16GB RAMを実行しています。 Drupal関連、データベース関連、サーバー構成関連、またはDrupalの機能の範囲内で動作する別のワークフローのいずれであっても、私はどんな提案でも受け入れるので、経験がある場合は自由に提案してくださいこれだけの活動。

9
blue928

その答えは、MySQL my.cnfファイルを正しく設定することです。

1週間強の調査の結果、Drupal 7が実際にこれだけの同時入力トラフィックを処理できることがわかりました。

これらのデッドロックPDOExceptionsは、MySQL my.cnfファイルが正しく最適化されていないことに関連しています。 Drupal High Performance groupや他のソースの助けを借りて、MySQLの新しい構成設定を実装して以来、私たちのチームは1つのデッドロックが発生することはありませんでした。ユーザーは問題なくコンテンツを保存しています。こちらのスレッドを確認してください。

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

具体的には、Dalinはウィザードを使用して、サーバーの仕様とテーブルタイプに基づいて基本構成ファイルを取得することを提案しました。これを使用した後、さらに調整しなくても、デッドロックは停止しました。試してみたい場合のウィザードへのリンクは次のとおりです。 https://tools.percona.com/wizard

My.cnfファイルを投稿していただけると助かります。

デッドロックの問題はもはや問題ではありませんが、現在このエラーは非常に頻繁に発生しています。

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

これもmysql設定の問題ですか?

2
blue928

私はスタンフォード大学で働いており、同様のことをしています。常に100,000以上のノードを定期的にロードする必要があります。私たちは2年間、独自のカスタムロードコードに取り組んできましたが、pcntl_forkを使用すると、プロセスを大幅に高速化できました。覚えておくべき唯一のことは、フォークを呼び出す前にすべてのソケット接続を閉じることです。たとえば、mysql接続、memcache接続、さらにはmongo接続を閉じる必要があります。 Drupalは、接続が存在しない場合に自動的に新しい接続を作成します。デッドロックの問題に関しては、innodb_locks_unsafe_for_binlog = 1

5
Patrick

http://dev.mysql.com/doc/refman/5.0/en/innodb-deadlocks.html このmysqlページは、デッドロックが発生した場合の対処法を示しています。

Mysql設定を微調整することで、この問題の解決に役立ちます。

1
kamalakannan