Rails ActiveRecord Sharding for B2B Application

时间:2016-09-13 16:37:55

标签: mysql ruby-on-rails activerecord rails-activerecord sharding

我的B2B应用程序具有以下要求:

  1. 我们在Rails5上。 Mysql 5.6是我们的主要生产数据库。

  2. 以下是表user_preferences

    的架构

    client_id,user_id,pref1,pref2,.. pref10,created_at,updated_at

    首选项列的总数为10.首字段数据类型为tinyint,int。 还有2个日期时间字段。

  3. 以上所有数据目前都存储在一个表格中。

  4. 随着越来越多的客户加入我们的应用程序,我们预计这个表很快就会变大。单个客户端可能拥有1000万用户。

  5. 问题

    1. 我正在寻找根据客户端ID对表格进行分片的方法。例如客户端1具有表client1_user_preferences,client2_user_preference等。所有读写查询将转到相应的客户端用户首选项表。
    2. 架构将类似于:

      client1_user_preferences

      user_id,pref1,pref2,.. pref10,created_at,updated_at

      rails activerecord是否支持这种方式?如果没有gem /插件,我也会接受其他建议。

      为什么我要根据客户端分隔表格?

      1. 我们有业务用例,通过在使用应用程序服务后将表移动到自己的数据库,为客户提供管理自己用户数据的选项。使用分片表,迁移将非常顺利。

      2. 在此表上执行大量读写操作。使用这种方法,每个表的数据将更少,因此更快的读取,写入查询。

1 个答案:

答案 0 :(得分:0)

由于您的愿望很高且预算很低,我建议您立即实施某些内容。但计划在6个月内重新设计整个设计

您现在实施的“某些东西”会让您对所遇到的陷阱有所了解,并教会您在重新设计中需要修复的内容。它可以指出您正在使用的软件的限制。 (一般来说,大项目,必须抛弃任何位于客户端软件和数据库之间的第三方软件包。它对于概念验证很方便,但在扩展时会崩溃)

并且不要认为第二步是最后一次剧变 - 计划再次在另外6个月内重建整个系统。

对大型项目造成最大伤害的是早期设计陷入困境,但在无法进一步扩展的情况下却没有意愿将其抛弃。