使用Rails对Postgres Follower(数据库镜像)运行Analytics

时间:2012-08-13 15:33:28

标签: ruby-on-rails-3 heroku

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的单个实例。

  • 在开始分析工作之前,请调用ActiveRecord :: Base.establish_connection(:analytics)
  • 做嘎吱嘎吱
  • 调用ActiveRecord :: Base.establish_connection(:production)
  • 实例化AnalyticsData对象以保存结果

我完全不确定后一种方法是否有效,但它的优势在于无需担心两个Heroku应用程序保持同步。

思考?谢谢!

参考文献:

2 个答案:

答案 0 :(得分:3)

关注者的数据库URL将作为应用程序的config var提供。您可以通过heroku config --app your-app

查看此信息

我会通过

将其指定为READONLY_DATABASE_URL
heroku 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)

要仅为分析工作访问只读关注者,请创建一个单独的模型,然后执行以下操作:

  1. 手动将其指向正确的表格
  2. 让新模型扩展原始模型(允许您访问相同的范围或方法)
  3. 实施例

    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获取来自您的关注者的报告/分析数据。