数据库分片和Rails
在Rails中处理分片数据库的最佳方法是什么?分片应在应用程序层,活动记录层,数据库驱动程序层,代理层还是其他任何层处理?各自的优缺点是什么?
解决方案
回答
在我看来,最简单的方法是在Rails实例和DB碎片之间保持1:1的比例。
回答
对于像我这样从未听说过分片的人:
http://highscalability.com/unorthodox-approach-database-design-coming-shard
回答
FiveRuns有一个名为DataFabric的gem,它可以进行应用程序级分片和主/从复制。可能值得一试。
回答
我假设使用碎片是在谈论水平分区,而不是垂直分区(这是Wikipedia上的区别)。
首先,在考虑水平分区之前,请尽可能扩展垂直分区。在Rails中,将不同的模型指向不同的机器很容易,对于大多数Rails站点,这将带给我们足够的帮助。
对于水平分区,在理想情况下,这将在Rails的应用程序层进行处理。但是,尽管这并不困难,但在Rails中却并不琐碎,并且到了我们需要的时候,通常应用程序已经超出了可行的范围,因为到处都是ActiveRecord调用。开发人员或者管理人员没有人喜欢在需要它之前进行开发,因为每个人都希望开发用户现在将要使用的功能,而不是进行分区,因为分区可能在流量激增后好几年才开始发挥作用。
ActiveRecord层...从我所看到的并不容易。将需要大量的猴子修补到Rails内部。
在Spock,我们最终使用自定义的MySQL代理进行了处理,并将其作为Spock Proxy在SourceForge上开源。 ActiveRecord认为它正在与一台MySQL数据库计算机通信,而实际上它正在与代理服务器通信,然后与一个或者多个MySQL数据库通信,合并/排序结果,并将其返回给ActiveRecord。只需要对Rails代码进行一些更改。请查看Spock Proxy SourceForge页面,以了解更多详细信息以及我们选择此路线的原因。
回答
将Rails连接到多个数据库并不是什么大不了的事情,我们只需为每个覆盖连接属性的分片都有一个ActiveRecord子类即可。如果我们需要进行跨分片调用,这将使其非常简单。然后,当需要在分片之间进行调用时,只需编写一些代码。
我不喜欢Hank拆分rails实例的想法,因为除非我们有一个很大的共享库,否则在实例之间调用代码似乎很困难。
另外,在开始分片之前,我们还应该考虑做类似受虐狂的事情。