【问题标题】:Running Analytics Against a Postgres Follower (database mirror) using Rails使用 Rails 对 Postgres Follower(数据库镜像)运行分析
【发布时间】:2013-10-17 11:57:21
【问题描述】:

Heroku 在 Postgres Followers 上的文档吹捧“Followers 可用于...提供数据的只读视图以供分析”,但它没有提供任何关于如何实现这一点的见解。

我的计划是让“分析数据库”镜像“主数据库”;在分析数据库上运行一些主要的、数字运算的 sql 查询,并将结果存储在主数据库的表中。

我还没有找到有关如何针对这些查询访问分析数据库的详细信息,同时仍使用主数据库进行一般访问。我发现的大多数资源都在谈论调用

class MyModel < ActiveRecord::Base
    establish_connection :analytics   # and configure analytics within config/database.yml
end

但是,这将导致 MyModel 的所有存储都在追随者上(顺便说一句,这将不起作用,因为追随者是只读的)。我希望主存储空间在主数据库上,但只需对跟随者进行一些(只读)访问。

可能的解决方案:

1) 有一个 单独的 运行不同环境的 rails 应用程序实例,例如“分析”而不是“生产”。因此,它将使用分析数据库进行所有访问。然后将结果存储在

class AnalyticsData < ActiveRecord::Base
    establish_connection :production if Rails.env == 'analytics'
end

这将导致 AnalyticsData 结果存储在主生产数据库中。

2) 有一个 single 的 rails 应用实例。

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

我完全不确定后一种方法是否可行,但它的优点是不必担心保持两个 Heroku 应用程序同步。

想法?谢谢!

参考资料:

【问题讨论】:

    标签: ruby-on-rails-3 heroku


    【解决方案1】:

    关注者的数据库 URL 将在您的应用中作为配置变量提供。你可以通过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(并在整个互联网上分享对你有用的东西!)

    【讨论】:

      【解决方案2】:

      要访问只读关注者仅用于分析工作,请创建一个单独的模型,然后:

      1. 手动将其指向正确的表
      2. 让新模型扩展原始模型(让您可以访问相同的范围或方法)

      示例:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多