2016-03-03 2 views
1

J'utilise Octopus gem pour gérer le sharding de base de données dans mon application. J'ai un maître et un esclave. La requête d'insertion frappe toujours le maître et la lecture va à l'esclave.Rails: Problèmes lors de l'utilisation d'Octopus Gem pour la fragmentation de base de données

Mais je suis confronté à un problème étrange, après avoir inséré un enregistrement et quand j'essaie de le récupérer, l'enregistrement est introuvable. Cela affecte toute ma demande. J'ai essayé de résoudre ce problème avec le code suivant.

Model.using(:master).where(id: 250) 

Cela forcera le modèle à extraire l'enregistrement du maître plutôt que de l'esclave. Mais si nous ajoutons ceci partout dans l'application, il n'y a pas de point de partage.

Une solution pour cela?

Merci d'avance.

Répondre

1

Bienvenue dans le monde amusant de la réplication asynchrone.

Généralement, lors de la mise à jour des données dans votre base de données master, les données sont répliquées de manière asynchrone sur les esclaves, ce qui signifie qu'elles y arriveront à un moment ultérieur. Malheureusement, vous ne pouvez pas savoir quand cela se produira car la seule chose qui est généralement garantie est l'ordre des mises à jour de l'esclave, et non pas quand cela arrivera.

Souvent, vous essayerez de maintenir le délai de réplication plutôt faible, mais vous ne pouvez pas l'ignorer. Généralement, lors de l'utilisation de la réplication asynchrone, vous devez penser de manière critique à vos stratégies d'accès aux données pour éviter de présenter des données obsolètes indésirables.

Le sharding et la réplication ne viennent définitivement pas gratuitement. Les systèmes de base de données s'efforcent d'implémenter des niveaux d'atomicité fortement définis via les transactions, mais en raison de CAP, les choses deviennent plus compliquées (ou parfois impossibles) lors de l'introduction d'un système distribué.

Il n'y a pas de réponse généralement correcte pour ce problème car elle n'est pas directement claire, quelles données peuvent être obsolètes et lesquelles ne le sont pas. Pensez à vos habitudes d'accès et choisissez le serveur approprié. Souvent, la réponse la plus simple est de se débarrasser complètement du sharding et de la réplication et d'utiliser simplement un plus gros serveur.