数据库分片和Rails

在Rails中处理分片数据库的最佳方法是什么? 是应该在应用程序层,活动记录层,数据库驱动程序层,代理层或其他方面处理分片? 各自的优点和缺点是什么?

FiveRuns有一个名为DataFabric的gem,它可以进行应用程序级分片和主/从复制。 可能值得一试。

我假设有分片我们谈的是水平分区而不是垂直分区( 这里是维基百科上的差异 )。

首先,在考虑水平分区之前,尽可能地拉伸垂直分区。 在Rails中很容易让不同的模型指向不同的机器,对于大多数Rails站点,这将带给你足够的空间。

对于水平分区,在理想情况下,这将在Rails中的应用层处理。 虽然它并不难,但它在Rails中并不是微不足道的,当你需要它时,通常你的应用程序已经超出了可行性的程度,因为你已经将ActiveRecord调用遍布各处。 并且没有人,开发人员或管理人员喜欢在您需要之前使用它,因为每个人都宁愿处理用户现在将使用的function,而不是在流量爆炸后可能无法发挥多年的分区。

ActiveRecord层 ……从我能看到的内容来看并不容易。 需要很多猴子修补到Rails内部。

在Spock,我们最终使用自定义MySQL代理处理它,并在SourceForge上将其作为Spock Proxy开源。 ActiveRecord认为它正在与一台MySQL数据库机器交谈,当它与代理进行通信时,代理会与一个或多个MySQL数据库进行通信,对结果进行合并/排序,然后将它们返回给ActiveRecord。 只需对Rails代码进行一些更改即可。 请查看Spock Proxy SourceForge页面,了解更多详细信息以及我们走这条路线的原因。

对于那些喜欢我没有听说过分片的人:

http://highscalability.com/unorthodox-approach-database-design-coming-shard

将Rails连接到多个数据库并不是什么大不了的事 – 您只需为每个分支都有一个ActiveRecord子类来覆盖连接属性。 如果你需要进行交叉分片调用,这很简单。 然后,当您需要在分片之间进行调用时,您只需要编写一些代码。

我不喜欢Hank关于拆分rails实例的想法,因为除非你有一个大的共享库,否则在实例之间调用代码似乎很有挑战性。

在开始分片之前,你应该看看像Masochism这样的东西。

在我看来,最简单的方法是在rails实例和DB分片之间保持1:1。

对于使用复制环境的rails,我建议使用my_replication插件,它有助于在运行时将数据库连接切换到其中一个从属

https://github.com/minhnghivn/my_replication