如何每小时将1000个节点上载到一个在线drupal 7站点并避免死锁?


9

不久之前,我在这里写了有关死锁的信息:PDOException:SQLSTATE [40001]:序列化失败:1213尝试获取锁时发现了死锁;没有找到死锁。

尽管开发团队竭尽全力,我们仍然会收到如下错误:

PDOException:SQLSTATE [40001]:序列化失败:1213尝试获取锁时发现死锁;默认值为0。尝试重新启动事务: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);数组([]在(_)位置的(_974)数组([]: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 /var/www/website.com/sites/all/modules/location/location.module)。

尽管该示例中有特定的表,但在其他表上仍会出现此错误。

这是我的情况。我参加了一个大型大学项目。在任何给定时间,每天都有50,000名校园居民使用该系统。除此之外,我还将手动和通过自定义模块代码(从旧大学数据迁移)将1000千个内容项迁移到这个新的Drupal 7站点。

这个错误正在使我们丧命,以至于如果Drupal无法处理这种类型的负载,我们几乎已经准备好废除过去几年的工作,并进行其他工作。

但这或多或少是我的问题-Drupal如何处理这种类型的负载?如何组织我的工作流程以处理这么多的活动?这是Drupal问题吗?数据库问题?

具体来说,我正在运行Ubuntu,LAMP堆栈16GB RAM。我愿意接受任何建议,无论是与Drupal有关,与数据库有关,与服务器配置有关,还是在Drupal的能力范围内可以工作的其他工作流程,如果有丰富的活动经验,请随时提出任何建议。


有一篇有关导入大型数据集的文章evolvingweb.ca/story/…–
kalabro,2012年

谢谢你 令人鼓舞的是,几乎可以立即导入大量数据。但是,个人用户通过自己的帐户通过节点表单过帐的问题又如何呢?随着我对这个问题的深入研究,脑海中涌现出一些反问:“ Drupal可以处理这么多的实时流量吗?如果没有,那又有什么意义呢?” 除了导入外,我们还有大约20个团队,他们通常通过其帐户添加内容。Drupal的“节点保存”真的可以同时处理20个同时添加数据的用户吗?
blue928 2012年

我们使用MySQL和PostgreSQL在Apache JMeter上测试了Drupal站点。对于MySQL,我们的结果约为20个节点。对于PostgreSQL,结果要好得多。
卡拉布罗2012年

Answers:


5

我在斯坦福大学工作,并且一直在做类似的事情。我们经常需要定期加载超过100,000个以上的节点。两年来我们一直在开发自己的自定义加载代码,使用pcntl_fork可以大大加快该过程。您唯一需要记住的是在调用fork之前关闭所有套接字连接。例如,您必须关闭mysql连接,memcache连接,甚至mongo连接。当不存在任何连接时,Drupal将自动创建新连接。至于死锁问题,我们可以通过放置来解决该问题innodb_locks_unsafe_for_binlog = 1


您是使用自定义代码批量加载那些代码,还是使用诸如drupal的一些诸如node_save的API函数?还是迁移类型模块?您提到的代码也可以公开显示吗?很高兴看到pcntl_fork与drupal集成在一起,看看你们已经克服了这一障碍。感谢您的二进制提示!
blue928 2013年

2

答案是:正确配置MySQL my.cnf文件。

经过一个多星期的研究,我发现Drupal 7确实可以处理这么多并发的输入流量。

这些死锁PDOException与未正确优化MySQL my.cnf文件有关。在Drupal高性能小组和其他来源的帮助下,自从为MySQL实现新的配置设置以来,我们的团队就没有发生过一次死锁。我们测试了批处理脚本,以模拟多达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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.