Domanda

Qual è il modo migliore per gestire un database partizionato in Rails?Lo sharding dovrebbe essere gestito a livello di applicazione, a livello di record attivo, a livello di driver del database, a livello proxy o qualcos'altro?Quali sono i pro ed i contro di ognuno?

È stato utile?

Soluzione

FiveRuns ha una gemma chiamata DataFabric che esegue lo sharding a livello di applicazione e la replica master/slave.Potrebbe valere la pena dare un'occhiata.

Altri suggerimenti

Presumo che con gli shard stiamo parlando di partizionamento orizzontale e non di partizionamento verticale (ecco le differenze su Wikipedia).

Prima di tutto, partizionamento verticale allungato per quanto puoi portarlo prima di considerare il partizionamento orizzontale.In Rails è facile avere modelli diversi che puntano a macchine diverse e per la maggior parte dei siti Rails questo ti porterà abbastanza lontano.

Per il partizionamento orizzontale, in un mondo ideale, questo verrebbe gestito al livello livello di applicazione nelle rotaie.Ma sebbene non sia difficile, non è banale in Rails e, quando ne hai bisogno, di solito la tua applicazione è cresciuta oltre il punto in cui ciò è fattibile poiché hai chiamate ActiveRecord sparse ovunque.E a nessuno, sviluppatori o dirigenti, piace lavorarci prima che tu ne abbia bisogno, poiché tutti preferirebbero lavorare sulle funzionalità che gli utenti utilizzeranno ora piuttosto che sul partizionamento che potrebbe non entrare in gioco per anni dopo l'esplosione del tuo traffico.

Livello ActiveRecord...non è facile da quello che posso vedere.Richiederebbe molte patch scimmie negli interni di Rails.

A Spock abbiamo finito per gestirlo utilizzando a proxy MySQL personalizzato e renderlo open source su SourceForge come Spock Proxy.ActiveRecord pensa di parlare con una macchina di database MySQL quando in realtà sta parlando con il proxy, che quindi parla con uno o più database MySQL, unisce/ordina i risultati e li restituisce ad ActiveRecord.Richiede solo poche modifiche al codice Rails.Dai un'occhiata alla pagina Spock Proxy SourceForge per maggiori dettagli e per i motivi per cui abbiamo intrapreso questa strada.

Per quelli di voi come me che non avevano sentito parlare di sharding:

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

Connettere Rails a più database non è un grosso problema: hai semplicemente una sottoclasse ActiveRecord per ogni frammento che sovrascrive la proprietà di connessione.Ciò rende piuttosto semplice se è necessario effettuare chiamate tra partizioni.Devi quindi solo scrivere un piccolo codice quando devi effettuare chiamate tra i frammenti.

Non mi piace l'idea di Hank di dividere le istanze dei binari, perché sembra difficile chiamare il codice tra le istanze a meno che non si disponga di una grande libreria condivisa.

Inoltre dovresti provare a fare qualcosa del genere Masochismo prima di iniziare lo sharding.

Affinché i rail funzionino con l'ambiente replicato, suggerirei di utilizzare il plugin my_replication che aiuta a cambiare la connessione al database su uno degli slave in fase di esecuzione

https://github.com/minhnghivn/my_replication

A mio avviso, il modo più semplice è mantenere un rapporto 1:1 tra le istanze dei binari e gli shard DB.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top