我有10个应用程序在同一个git标签上运行,这意味着除了在数据库设置中有变化的config / database.yml之外,应用程序端没有任何变化。
这会占用服务器上的大量空间,并且存在可伸缩性问题。那么,是否可以为同一个应用程序的其余9个实例克隆一个应用程序并使用不同的yml文件。可以应用软链接方法。
答案 0 :(得分:0)
如果我理解你的问题, 您的问题只是从同一个应用程序连接到不同的数据库,在这种情况下,您可以检查从一个主应用程序连接多个dbs的方法。阅读本文
Rails中有很多宝石可以让你轻松完成。这里
https://github.com/cherring/connection_ninja
http://magicmodels.rubyforge.org/magic_multi_connections/
http://rubygems.org/gems/contineo
这样,您只需要一个database.yml文件,并为所有实例添加所需的数据库数量。
希望它有所帮助!
答案 1 :(得分:0)
如果所有网站的应用程序逻辑相同,那么路由也是相同的,只有几种方法可以区分彼此:
为每个应用程序使用不同的端口以及相应的apache / nginx映射。 在这里,您必须为每个端口使用一个正在运行的应用程序。
www.domain-1.com - >本地主机:3001 , www.domain-2.com - > localhost:3002 等等。
这就是你现在拥有的。
为一个应用中的每个网站使用不同的控制器 。 Apache / nginx映射将映射到仅一个应用程序:
www.domain-1.com - >本地主机:3000 , www.domain-2.com - > localhost:3000 等等。
您可以在routes.rb(http://guides.rubyonrails.org/routing.html)确定适当的控制器。
可能是这样的:
<强> routes.rb中:强>
require 'domain'
constraints(Domain) do
match '/' => 'controller-1#action'
end
<强>顾虑/ domain.rb:强>
class Domain
def self.matches?(request)
request.domain.present? && request.domain == "www.domain-1.com"
end
end
对于yml文件,您也可以将它们合并到一个应用程序中。
答案 2 :(得分:0)
一个应用程序,但不同的yml文件
只需更新问题中给出的database.yml文件即可。假设我们的开发实例是 development-1,development-2,development-3和development-4。
首先,您只需创建环境文件development-1.rb
的3个副本(可以找到insideconfig / environments /)并将其重命名为development-2.rb
,development-3.rb
和development-4.rb
。
然后,在启动服务器之前,请执行以下步骤。
RAILS_ENV=development rake db:create
//(OR just rake db:create as it defaults to development)
RAILS_ENV=development-2 rake db:create
RAILS_ENV=development-3 rake db:create
RAILS_ENV=development-4 rake db:create
RAILS_ENV=development rake db:schema:load
//(OR just rake db:schema:load as it defaults to development)
RAILS_ENV=development-2 rake db:schema:load
RAILS_ENV=development-3 rake db:schema:load
RAILS_ENV=development-4 rake db:schema:load
RAILS_ENV=development rake db:seed
//(OR just rake db:seed as it defaults to development)
RAILS_ENV=development-2 rake db:seed
RAILS_ENV=development-3 rake db:seed
RAILS_ENV=development-4 rake db:seed
然后,使用下面给出的不同服务器pid启动所有实例。
rails s -p 3000 -e development --pid tmp/pids/server.pid (OR rails s by default)
rails s -p 3002 -e development-2 --pid tmp/pids/server.2.pid
rails s -p 3003 -e development-3 --pid tmp/pids/server.3.pid
rails s -p 3004 -e development-4 --pid tmp/pids/server.4.pid
这将同时从同一个源和单个database.yml
文件启动所有实例。
您也可以像往常一样将连接详细信息放在database.yml中,其名称如下:
*的 log_database_producion:* 强>
adapter: mysql
host: other_host
username: logmein
password: supersecret
database: logs
然后在您的特殊模型中:
class AccessLog < ActiveRecord::Base
establish_connection "log_database_#{Rails.env}"
end
将这些令人讨厌的凭据保留在您的应用程序代码中。
如果要在多个模型中重用此连接,则应创建一个新的抽象类并从中继承,因为连接与类紧密耦合(如此处,此处和此处所述),并且将创建新连接每个班级。
如果是这种情况,请按以下方式进行设置:
class LogDatabase < ActiveRecord::Base
self.abstract_class = true
establish_connection "log_database_#{Rails.env}"
end
class AccessLog < LogDatabase
end
class CheckoutLog < LogDatabase
end
按照模型的标准Rails命名约定在app_1 / models文件夹中创建一个新文件,在这种情况下,该模型将是一个名为a_table.rb的文件,因为它连接到一个名为a_table的表,然后在标准中设置类定义Rails模型格式如此
class ATable < ActiveRecord::Base
end
但是tha模型如何知道与国外数据库交谈?
您需要做的就是将establish_connection声明添加到类中,以便最终得到
class ATable < ActiveRecord::Base
establish_connection "foreign_#{Rails.env}"
end
就像magick一样,在ATable下运行app 1的任何环境都会在app 1的database.yml文件中获取相应的环境条目 例如当在上面的示例中以生产模式运行时,a_table将自动连接到foreign_production条目。
我发现创建一个单独的应用程序对我的需求来说太过分了。应用程序本身只会添加迁移,不需要任何视图,控制器,帮助程序等......只是一个模型和运行迁移的能力。
http://archive.railsforum.com/viewtopic.php?id=42143
http://blog.bitmelt.com/2008/10/connecting-to-multiple-database-in-ruby.html
https://www.digitalocean.com/community/questions/connecting-to-database-on-a-different-server
https://github.com/rails/rails/issues/7019