2008-09-04 11 views
10

Was ist der beste Weg, um mit einer sharded Datenbank in Rails umzugehen? Sollte das Sharding auf der Anwendungsschicht, der aktiven Datensatzschicht, der Datenbanktreiberschicht, einer Proxy-Schicht oder etwas anderem durchgeführt werden? Was sind die Vor- und Nachteile von jedem?Datenbank sharting und Rails

Antwort

13

FiveRuns haben ein Juwel DataFabric benannt, die auf Anwendungsebene sharding und Master/Slave-Replikation funktioniert. Es könnte einen Besuch wert sein.

+3

https://github.com/mperham/ hilft data_fabric ist die neue URL –

+2

"Bob ist jetzt verantwortlich": https://github.com/bpot/data_fabric –

1

Meiner Meinung nach ist der einfachste Weg, eine 1: 1 zwischen Schienen Instanzen und DB Shards zu pflegen.

9

Ich nehme an mit Shards wir sprechen über horizontale Partitionierung und nicht vertikale Partitionierung (here are the differences on Wikipedia).

Zuerst, strecken vertikale Partitionierung so weit wie Sie es vor der horizontalen Partitionierung nehmen können. In Rails ist es einfach, wenn verschiedene Modelle auf verschiedene Maschinen verweisen, und für die meisten Rails-Sites reicht das weit genug.

Für die horizontale Partitionierung, in einer idealen Welt, würde dies unter der Anwendungsschicht in Rails behandelt werden. Auch wenn es nicht schwer ist, ist es in Rails nicht trivial. Wenn Sie es benötigen, ist Ihre Anwendung in der Regel über den Punkt hinaus, wo dies möglich ist, da Sie ActiveRecord-Anrufe überall verteilt haben. Und niemand, Entwickler oder Management, arbeitet gerne daran, bevor Sie es benötigen, da jeder lieber an Funktionen arbeitet, die Benutzer jetzt verwenden werden, als an der Partitionierung, die möglicherweise nach Jahren des Verkehrs nicht mehr ins Spiel kommt.

ActiveRecord Schicht ... nicht einfach von dem, was ich sehen kann. Würde erfordern viele Affen Patching in Rails Interna.

Bei Spock endeten wir dies mit einem benutzerdefinierten MySQL Proxy Handhabung und Open Source es auf Source als Spock Proxy. ActiveRecord denkt, dass es mit einer MySQL-Datenbankmaschine spricht, wenn es mit dem Proxy kommuniziert, der dann mit einer oder mehreren MySQL-Datenbanken redet, die Ergebnisse zusammenführt/sortiert und sie an ActiveRecord zurückgibt. Erfordert nur wenige Änderungen an Ihrem Rails-Code. Werfen Sie einen Blick auf die Seite Spock Proxy SourceForge für weitere Details und unsere Gründe für diesen Weg.

+0

+1 für die vertikale Partitionierung auf Tabellenebene. Mit ActiveRecord ist es ziemlich schmerzlos, Tabellen in mehrere Tabellen mit weniger Spalten aufzuteilen, um "heiße" Daten von anderen Daten zu isolieren. Dies macht einen großen Unterschied, wenn Sie MySQL verwenden. – casey

2

Das Verbinden von Rails mit mehreren Datenbanken ist keine große Sache - Sie haben einfach eine ActiveRecord-Unterklasse für jeden Shard, der die Verbindungseigenschaft überschreibt. Das macht es ziemlich einfach, wenn Sie Cross-Shard-Anrufe tätigen müssen. Sie müssen dann nur ein wenig Code schreiben, wenn Sie zwischen den Shards telefonieren müssen.

Ich mag nicht Hanks Idee der Aufteilung der Schienen-Instanzen, weil es schwierig scheint, den Code zwischen den Instanzen aufzurufen, es sei denn, Sie haben eine große gemeinsame Bibliothek.

Auch sollten Sie etwas wie Masochism tun, bevor Sie Sharding beginnen.