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 

這確保了文件足夠小以至於它停止超時。

相關問題