数据库分片和Rails

时间:2008-09-04 16:40:10

标签: ruby-on-rails database activerecord sharding

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

6 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:9)

我假设使用分片,我们讨论的是水平分区而不是垂直分区(here are the differences on Wikipedia)。

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

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

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

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

答案 2 :(得分:8)

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

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

答案 3 :(得分:2)

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

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

在开始分片之前,你应该考虑做Masochism这样的事情。

答案 4 :(得分:1)

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

https://github.com/minhnghivn/my_replication

答案 5 :(得分:0)

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