Heroku关于Postgres粉丝的文档称“追随者可能习惯于...提供您的数据的只读视图以进行分析”,但它没有提供任何有关如何实现这一点的见解。
我的计划是让“主数据库”由“analytics db”镜像;在分析数据库上运行一些主要的,数字运算的sql-queries,并将结果存储在主数据库的表中。
我还没有找到有关如何为这些查询点击分析数据库的详细信息,同时仍然使用主数据库进行常规访问。我发现的大部分资源都是关于调用
的class MyModel < ActiveRecord::Base
establish_connection :analytics # and configure analytics within config/database.yml
end
然而,这将导致MyModel的所有存储都在跟随者上(顺便说一下,因为跟随者是只读的,因此无法正常工作)。我希望主存储空间位于主数据库上,但只是对跟随者进行一些(只读)访问。
1)运行不同环境的rails app的单独的实例,例如'分析'而不是'生产'。因此,它将使用分析数据库进行所有访问。然后将结果存储在
中class AnalyticsData < ActiveRecord::Base
establish_connection :production if Rails.env == 'analytics'
end
这将导致AnalyticsData结果存储在主生产数据库中。
2)拥有rails app的单个实例。
我完全不确定后一种方法是否有效,但它的优势在于无需担心两个Heroku应用程序保持同步。
思考?谢谢!
答案 0 :(得分:3)
关注者的数据库URL将作为应用程序的config var提供。您可以通过heroku config --app your-app
。
我会通过
将其指定为READONLY_DATABASE_URLheroku config:add READONLY_DATABASE_URL=<the url> --app your-app
然后使用任何用于activerecord的分片插件,根据ENV['READONLY_DATABASE_URL']
设置正确的数据库连接参数。我没有使用过这些内容,但你应该在这里调查你的选择:https://www.ruby-toolbox.com/categories/Active_Record_Sharding(并分享一下对你有用的东西!)
答案 1 :(得分:1)
要仅为分析工作访问只读关注者,请创建一个单独的模型,然后执行以下操作:
class AnalyzeMyModel < MyModel
set_table_name 'my_models'
# ...connect to follower db...
def self.sold_today_by_model_number(model)
NumberCrunch.create name: "#{model} sold #{Date.today}",
data: created_today.where(model_number: model).to_json
end
def self.number_sold_today_by_model_number(model)
NumberCrunch.create name: "Number of #{model} sold #{Date.today}",
data: sold_today_by_model_number(model).count
end
end
# Usage:
numbers_crunched = AnalyzeMyModel.number_sold_today_by_model_number(9001)
puts "#{numbers_crunched.name}: #{numbers_crunched.data}"
# "Number of 9001 sold DATE: 9876"
现在,您可以在同一个应用中使用MyModel,并使用AnalyzeMyModel获取来自您的关注者的报告/分析数据。