2

我试图使用Elastic Beanstalk部署我的第一个rails应用程序,并且我已经到了需要为大约50万条记录创建我的数据库的点。我最初的尝试是在我的.ebextensions文件夹中创建一个.config文件,然后从命令行使用git aws.push,但它一直给我提供超时错误。运行rake db:AWS上的种子Elastic Beanstalk

所以,我放弃了这一点,并决定直接ssh到我的EC2实例,并从那里运行它。但是,这也不适合我。我cd到var/app/current,然后运行rake db:seed RAILS_ENV = production。它似乎运行了一两分钟,然后在退出之前输出'已杀死'。

我也尝试播种一个记录,只是为了看看文件的大小是否与它有任何关系。如果我这样做,它会弹出一个错误,告诉我我的SQLITE数据库是只读的。我很确定我的db设置为在生产中使用MySQL,我更改了database.yml以使用各种ENV变量,并且当我从命令行运行eb状态时,它告诉我正在使用MySQL。

奇怪的是,我发誓我昨天早些时候做了这些完全相同的步骤,在数据库中播种和播种,并且工作。唯一的问题是我做了一些改变,终止了应用程序,并决定重新开始,现在它根本不起作用。任何想法我做错了什么?这是一个Rails 4.1/Ruby 2.1安装程序。

回答

1

所以,我刚才得到了这个工作,想通了我应该回答这个问题。我的第一个问题是我搞砸了database.yml。我遗漏了适配器:mysql2行,所以它试图连接到一个sqlite数据库,因此只读错误。

一旦我改变了这一点,我可以连接到我的AWS RDS实例,并且我可以播种一个记录就好了。但是,当我尝试播种整个500k记录时,它仍然被杀死。我正在使用AWS免费层,所以我认为他们的微型实例出于性能原因不允许长时间运行的进程。为了解决这个问题,我创建了一个rake任务,它将我的seeds.rb文件分割成一堆小文件,例如seeds-01.rb到seeds-1000.rb。

desc "Splits a file into smaller subfiles" 
task :subfiles, [:filename, :num_files] => :environment do |task, args| 
    lines = File.readlines(args[:filename]) 
    num_files = args[:num_files].to_i 
    lines_per_file = lines.count/num_files 
    extension = File.extname(args[:filename]) 
    basename = File.basename(args[:filename]) 
    puts lines_per_file.to_s 
    puts lines.count.to_s 
    num_files.times do |num_file| 
    subfile = File.open(basename + "-#{num_file}" + extension, "w") 
    subline_start = num_file*lines_per_file 
    subline_end = (num_file+1)*lines_per_file-1 
    subline_end = lines.count-1 if num_file == num_files-1 
    sublines = lines[subline_start..subline_end].each do |subline| 
     subfile.puts subline 
    end 
    subfile.close 
    end 
end 

于是,我产生一个bash脚本运行的每个文件,就像这样:

rails runner seeds-01.rb 
rails runner seeds-02.rb 
... 
rails runner seeds-1000.rb 

应当指出的是,我尝试以下为好,不管出于什么原因,这是非常非常比使用rails runner慢。

sudo cp seeds-01.rb seeds.rb 
rake db:seed 
... 
sudo cp seeds-1000.rb seeds.rb 
rake db:seed 

所以不要那样做。那么,在我使用弹性beanstalk命令行工具来部署我的应用之后,我使用了我的实例并运行了我的bash脚本。

cd /var/app/current/db 
bash bash-script.txt 

这确保了文件足够小以至于它停止超时。

相关问题