1

我正在从 rails 控制台执行脚本;该脚本爬取 MySQL 数据库,创建约 50 万个 MongoDB 文档。

我注意到rails server在脚本运行时运行时,任何请求的响应都必须等待 MOPED 的数千行输出,例如:

MOPED: 127.0.0.1:27017 UPDATE       database=survey_app_development collection=mongo_surveys selector={"_id"=>"509043ec2c5f64685b62c5b3", "questions._id"=>"509043ec2c5f64685b62c5b5"} update={"$set"=>{"questions.1.response"=>{"_id"=>"509043ec2c5f64685b62c5bd", "data"=>{"datepicker"=>"10/21/2011", "response"=>1319216400}, "comment"=>nil}}} flags=[] (0.0000ms)
MOPED: 127.0.0.1:27017 UPDATE       database=survey_app_development collection=mongo_surveys selector={"_id"=>"509043ec2c5f64685b62c5b3", "questions._id"=>"509043ec2c5f64685b62c5b6"} update={"$set"=>{"questions.2.response"=>{"_id"=>"509043ec2c5f64685b62c5be", "data"=>{"response"=>"Morning"}, "comment"=>nil}}} flags=[] (0.0000ms)
MOPED: 127.0.0.1:27017 UPDATE       database=survey_app_development collection=mongo_surveys selector={"_id"=>"509043ec2c5f64685b62c5b3", "questions._id"=>"509043ec2c5f64685b62c5b7"} update={"$set"=>{"questions.3.response"=>{"_id"=>"509043ec2c5f64685b62c5bf", "data"=>{"0"=>"yes", "1"=>"no", "2"=>"no", "3"=>"no"}, "comment"=>""}}} flags=[] (0.0000ms)
MOPED: 127.0.0.1:27017 UPDATE       database=survey_app_development collection=mongo_surveys selector={"_id"=>"509043ec2c5f64685b62c5b3", "questions._id"=>"509043ec2c5f64685b62c5b8"} update={"$set"=>{"questions.4.response"=>{"_id"=>"509043ec2c5f64685b62c5c0", "data"=>{"response"=>"outdoor"}, "comment"=>""}}} flags=[] (0.0000ms)
MOPED: 127.0.0.1:27017 UPDATE       database=survey_app_development collection=mongo_surveys selector={"_id"=>"509043ec2c5f64685b62c5b3", "questions._id"=>"509043ec2c5f64685b62c5b9"} update={"$set"=>{"questions.5.response"=>{"_id"=>"509043ec2c5f64685b62c5c1", "data"=>{"response"=>"5"}, "comment"=>nil}}} flags=[] (0.0000ms)
MOPED: 127.0.0.1:27017 UPDATE       database=survey_app_development collection=mongo_surveys selector={"_id"=>"509043ec2c5f64685b62c5b3", "questions._id"=>"509043ec2c5f64685b62c5ba"} update={"$set"=>{"questions.6.response"=>{"_id"=>"509043ec2c5f64685b62c5c2", "data"=>{"response"=>"attest"}, "comment"=>nil}}} flags=[] (1.0002ms)

如果我让脚本执行足够长的时间(运行 rails 服务器),任何 http 请求都会导致:

[2012-10-30 16:24:44] ERROR Java heap space
[2012-10-30 16:25:12] ERROR Java heap space
[2012-10-30 16:26:11] ERROR Java heap space

所以,我的问题是:是否有防止这种行为的设置?另外,我是否应该期望在写入 MongoDB 时服务器流量会受到阻碍?

我正在使用MongoidRails 3.2JRuby 1.7.0MongoDB 2.2.0

4

1 回答 1

0

MongoDB 只允许一次写入一个操作。这种写锁的范围因版本而异——它曾经是整个服务器,但在最近的版本中变得更细粒度。见http://docs.mongodb.org/manual/faq/concurrency/

也就是说,应该在每个update命令之后释放锁。因此,您的 Rails 服务器应该能够以与脚本中的单个更新命令相当的延迟来处理请求。如果不是,那么一定是发生了其他事情。

我建议安装MMS并查看锁定百分比和队列长度的图表,以了解由于写锁定而备份的内容如何。

于 2013-04-19T19:11:58.477 回答