1 votes

Meilleure pratique pour la topologie matérielle des applications Web évolutives

Je travaille avec une application web existante développée en Ruby avec un back-end MySQL, mais je pense que la question de la topologie matérielle générique s'appliquera à une grande variété d'architectures de serveurs.

Je suis à la recherche d'un document / d'une ressource Web expliquant et détaillant les meilleures pratiques actuelles relatives à l'organisation du matériel au sein d'une ferme de serveurs pour fournir une application Web avec une base de données en arrière-plan.

L'architecture actuelle est la suivante ;

                    HTTP Server (Apache)
                           |
               Application Servers x 8 (Unicorn / Ruby-on-Rails)
                           |
                     MySQL Back-end (Master)
                            \
                             \
                          MySQL Slave (primarily for performing backups)

L'architecture proposée doit être plus évolutive que celle décrite ci-dessus, avec notamment un équilibreur de charge devant plusieurs serveurs HTTP, une répartition des serveurs d'applications entre les serveurs HTTP, plusieurs esclaves MySQL pour traiter les demandes en lecture seule (qui seront contrôlées par des modifications du logiciel d'application).

L'objectif principal est de disposer d'un système plus résilient, en utilisant les meilleures pratiques actuelles, et c'est ce qui a été suggéré jusqu'à présent.

Mais, si quelqu'un peut suggérer une ressource pour les meilleures pratiques dans ce type d'environnement, ou proposer une architecture qui donnera la résilience, la performance et l'évolutivité que nous recherchons, je vous en serais très reconnaissant :)

Dave

3voto

sysadmin1138 Points 129885

L'évolutivité s'étend au-delà de la couche matérielle et bien au-delà de la couche applicative. La capacité d'un environnement à s'étendre jusqu'à de gros volumes dépend dans une large mesure de la capacité du logiciel de chaque couche à gérer les erreurs et à maintenir un état cohérent dans l'ensemble de l'environnement. Si la base de données qui dirige l'ensemble de votre environnement ne peut pas être shardée, vous avez introduit un obstacle à l'évolutivité en utilisant cette base de données. Ce genre de choses.

Amazon propose quelques livres blancs sur le développement pour son nuage, et plusieurs d'entre eux sont généralement applicables à toute infrastructure évolutive.

http://aws.amazon.com/whitepapers/

Il existe quelques principes de haut niveau que vous devez garder à l'esprit lors de la mise à l'échelle :

  • Il doit survivre à la défaillance d'un seul composant, et ce sans intervention humaine.
  • Il doit répondre dynamiquement à des charges élevées, sans intervention humaine.

N'utilisez pas seulement un équilibreur de charge, mais un trio d'équilibreurs de charge qui se présentent comme un seul équilibreur de charge, de sorte que si l'un d'entre eux tombe en panne, les autres peuvent reprendre la charge.

Les serveurs web/app doivent avoir l'état de l'utilisateur disponible sur tous les nœuds, de sorte que si un utilisateur est poussé vers un autre serveur web/app, sa session est préservée. Dans le meilleur des cas, tous les états peuvent être servis par tous les serveurs.

Votre réseau doit comporter des routeurs redondants, afin que vous puissiez en supprimer un sans interrompre tout le trafic. HSRP est un protocole qui permet cela.

Votre plan de base de données doit tenir compte de l'évolutivité du serveur de base de données avant de commencer le sharding, et commencez à développer en gardant le sharding à l'esprit lorsque vous en êtes proche.

Des couches de mise en cache (memcached) peuvent être nécessaires dans votre environnement pour des raisons de performances.

Une fois que vous aurez atteint une taille suffisante, vous devrez planifier la manière dont vous hébergerez votre environnement à partir de plusieurs sites distincts (comme l'ouest et l'est des États-Unis, ou l'ouest des États-Unis et l'Europe) via Anycast ou GeoIP. Le déplacement des données entre les différents sites sera un défi, et vous devez commencer à développer en fonction de cette hypothèse dès que vous vous rapprochez du besoin de sites séparés.


Ruby lui-même a quelques problèmes d'évolutivité, notamment en ce qui concerne sa capacité (ou non) à tirer parti des processeurs multiples des serveurs. Les capacités existent, mais elles sont plutôt nouvelles et ne sont pas encore bien comprises par la communauté des développeurs (du moins, c'est ce que je crois). Avec la maturation de Ruby, certains de ces problèmes disparaîtront.

0voto

Oliver Steel Points 1

Merci pour cette excellente explication ; la question de l'extensibilité peut être réduite dans le cas des bases de données relationnelles grâce à équilibreur de charge de base de données . Il peut évoluer de manière linéaire et prendre en charge un nombre beaucoup plus important d'utilisateurs simultanés avec une fraction du temps de réponse, le tout sans aucune modification de votre application, ce qui en fait un outil tout à fait adapté aux applications web ou basées sur le web.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X