2008-09-04 68 views
10

在Rails中处理分片数据库的最佳方式是什么?是否应该在应用程序层,活动记录层,数据库驱动程序层,代理层或其他什么东西处理分片?每个的优缺点是什么?数据库分片和Rails

回答

13

FiveRuns有一个名为DataFabric宝石,做应用程序级分片和主/从复制。这可能值得一试。

+3

https://github.com/mperham/开关数据库连接到一个奴隶data_fabric是新的URL – 2011-01-18 18:20:52

+2

“Bob现在负责”:https://github.com/bpot/data_fabric – 2012-10-08 08:39:45

1

在我看来,最简单的办法就是保持1:1 Rails实例和数据库碎片之间。

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

滑轨连接到多个数据库是不是大deal-您只需一个ActiveRecord子类重写连接属性中的每个碎片。这使得它非常简单,如果你需要进行跨分片调用。当你需要在碎片之间进行调用时,你只需写一点代码即可。

我不喜欢分裂轨实例汉克的想法,因为它似乎具有挑战性的调用实例之间的代码,除非你有一个很大的共享库。你

也应该看看做这样的事情Masochism你开始分片之前。