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


9

長すぎない前に、私はここにデッドロックについて書いた:PDOException:SQLSTATE [40001]:シリアル化の失敗:1213ロックを取得しようとしたときにデッドロックが見つかりました。

私の開発チームがやろうとしていることは何でも、次のようなエラーが発生します。

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の機能の範囲内で動作する別のワークフローなど、どんな提案でも受け付けています。このような活動の経験がある場合は、遠慮なく提案してください。


大規模なデータセットevolvingweb.ca/story/…の
kalabro

有難うございます。実際、ほぼ瞬時に大量のデータをインポートできることは非常に励みになります。しかし、ノードフォームを介して自分のアカウントを介して投稿する個々のユーザーの問題についてはどうですか?この問題を掘り下げて掘り下げると、「Drupalはこれだけのライブトラフィックを処理できるのか?そうでない場合、何が重要なのか?」という頭の中での修辞的な質問が増えます。インポートの他に、アカウントを介してコンテンツを通常追加している約20人のチームがあります。Drupalの「ノード保存」は、一度にデータを追加する20人の同時ユーザーのみを本当に処理できますか?
blue928 2012年

MySQLとPostgreSQLを使用して、Apache JMeterでDrupalサイトをテストしました。MySQLの場合、結果は約20ノードでした。PostgreSQLの場合、結果ははるかに優れていました。
kalabro、

回答:


5

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


それらをカスタムコードでバッチでロードしていますか、それともnode_saveなどのdrupalのAPI関数の一部を使用していますか?または移行タイプのモジュールですか?また、あなたが言及したコードは一般に公開されていますか?pcntl_forkがdrupalとどのように統合されているかを確認して、皆さんがこの障害を克服したことを確認してください。binlogのヒントをありがとう!
blue928 2013

2

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

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

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

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設定の問題ですか?


私たちは自分たちでそのエラーを見始めています。あなたは今まであなたの質問に対する答えを見つけましたか?
Trimbletodd 2013年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.