1

Je développe une application Ruby On Rails que je souhaite déployer dans un environnement de production. J'ai plusieurs serveurs Web Ubuntu configurés de manière identique que je peux utiliser mais je ne sais pas comment mettre à l'échelle l'application RoR et les données db sur plusieurs hôtes.Mise à l'échelle d'un site Ruby on Rails

Je voudrais mettre à la fois un serveur web et un serveur db sur chaque hôte. Du côté du serveur web/ruby ​​middleware, j'aimerais que les sessions soient contrôlées par un serveur web maître qui gère l'équilibrage de charge sur le serveur web/couches de middleware ruby. Il devrait transmettre de nouvelles sessions aux hôtes libres.

J'ai besoin d'avoir un équilibrage de charge en place sur le serveur web/côté logiciel de ruby. Les sessions Web/middleware doivent être atomiques (je ne souhaite pas les répliquer sur plusieurs hôtes)

Je souhaite que les données transactionnelles qui n'ont pas été enregistrées dans la base de données soient enregistrées dans une journalisation intermédiaire - être réexécuté en cas de défaillance-récupération.

Dans la couche DB:

Je voudrais avoir les données DB sur l'un hôte à répliquer à 2 autres hôtes. (Chaque ensemble de base de données a 3 hôtes de base de données)

Je ne souhaite pas que les données de base de données soient répliquées sur tous les hôtes car la latence est trop longue.

Je voudrais mettre en place un algorithme qui dirigera les demandes de type 'create' vers la bonne base de données. L'équilibrage de charge me vient à l'esprit.

Le contrôleur maître DB doit savoir quel jeu de 3 DB doit être utilisé pour les demandes de 'mise à jour/lecture/suppression'.

Mon serveur web de test est webrick et le backend DB est Postgresql (même si cela n'a vraiment pas d'importance avec RoR). Je crois que j'ai besoin de lier un sessionId à chaque transaction et de garder un nouveau journal au cas où je devrais recharger cette session après une panne.

Quels autres problèmes de conception vais-je rencontrer? De plus, quel serveur web et quel serveur de base de données dois-je utiliser pour effectuer le travail de base? Quels sont les bons choix pour la base de données master et les serveurs Web maîtres? Je comprends que c'est un problème compliqué qui s'étend sur plusieurs domaines de connaissance. J'aimerais savoir si ce que je demande est possible.

+0

Si vous trouvez que c'est trop, cédez et utilisez Heroku. – Skilldrick

+1

Quelle est votre architecture de production actuelle? Ce sont des exigences assez complexes - êtes-vous sûr qu'ils sont nécessaires? Pouvez-vous y arriver au fil du temps avec une approche itérative? – nfm

Répondre

2

À mon dernier emploi, nous avons eu assez bonne chance avec l'infrastructure suivante:

1 équilibreur de charge -nginx

3 serveurs d'applications -thin

2 serveurs MySQL avec redondance écrit

2 boîtes de sauvegarde

Actuellement, nous avons 4 très grandes applications critiques qui fonctionnent sur cet environnement. Nous avons deux serveurs d'application pour prendre soin de la 5ème application. Si vous avez besoin de plus que cela, alors heroku sera probablement un meilleur pari en ce qui concerne le retour sur investissement (ROI). Simplement, heroku est un meilleur pari, même pour les petits problèmes de mise à l'échelle, vous avez un cauchemar dans l'administrateur système dans le plan ci-dessus.

+1

Je suis curieux quant à vos maths avec la raison pour laquelle heroku sera meilleur du côté du ROI. Je me sens chaque fois que j'ai besoin de quelque chose de simple, heroku vous charge, par exemple. J'ai besoin d'exécuter un processus de travail ou un serveur de recherche ... etc .. etc ... plus $$$ –

+0

bien, cela peut ne plus être pertinent car cela était basé sur d'autres options et technologies maintenant deux ans, mais je pense que l'essentiel de l'idée serait le même: par exemple le coût d'avoir un dévots à temps plein pour gérer l'infrastructure au lieu de payer pour ce dont vous avez besoin. Il y a beaucoup d'autres options là-bas maintenant, bien que concurrentes dans l'espace heroku et peuvent être mieux pour des applications spécifiques. –