Je suis en train de mettre en place un système similaire (au niveau professionnel) et c'est le design que j'ai choisi:
- Deux équilibreurs de charge Nginx (tous deux actifs, les deux basculent pour l'autre, équilibrés avec un round robin DNS)
- Deux bases de données MySQL en mode de réplication maître-maître
- Deux instances Tomcat en tant que cluster Tomcat
- Deux instances Memcached pour la mise en cache et le partage d'état de session pour le cluster Tomcat
Cela permettra d'obtenir une solution redondante, haute disponibilité et évolutive.
Les équilibreurs de charge (sur un matériel décent) équilibreront facilement une ligne saturée de 1 Gbit chacun. C'est également un excellent endroit pour le déchargement SSL.
Vous pouvez enregistrer vos informations de session dans memcached. En cas d'échec d'une instance de tomcat, une autre instance de tomcat peut récupérer les informations de session pertinentes et les clients ne remarqueront rien. N'oubliez pas de combiner cela avec des séances collantes aussi. (Pour limiter le trafic réseau)
Le clustering Tomcat a également une option pour partager les informations de session avec le cluster en temps réel, sans utiliser memcached. Bien que je pense en termes de performances, l'utilisation de Memcached sera meilleure.
Si vous avez besoin de plus de puissance dans l'une de ces applications:
- Nginx: Ajoutez plus d'équilibreurs de charge, même si je ne pense pas que ce sera le goulot d'étranglement très bientôt.
- Tomcat: vous pouvez facilement augmenter la taille du cluster Tomcat ou ajouter plus de clusters
- Mysql: Ajoutez des esclaves en lecture seule ou augmentez la taille du cluster (selon votre application, mais puisque vous avez écrit une application basée sur REST, cela ne devrait pas poser de problème)
- Memcached: Ajoutez plus de nœuds, Memcached évolue assez bien je crois.
Je ne sais pas comment votre application est construite et quelles sont les grosses ressources de porcs, mais si vous voyez une charge de base de données élevée (pendant vos tests de charge!), L'ajout d'un cache entre l'application et la base de données pourrait certainement améliorer considérablement les performances. Mais n'oubliez pas que tout n'est pas cachable, si vos requêtes sont toujours différentes, la mise en cache n'aidera pas (beaucoup)
Mon conseil serait de télécharger VMware Workbench (ou un logiciel de virtualisation similaire) et d'essayer de créer une configuration simple. Pas d'équilibrage de charge ou de clustering, juste les bases et travaillez à partir de là. Un par un, ajoutez plus de fonctionnalités (équilibrage, mise en cache, mise en cluster, etc.) et assurez-vous de faire des recherches sur chaque sujet, afin que vous sachiez que vous avez fait le bon choix.
Si vous continuez à exécuter les mêmes tests de performances au cours de ce processus, vous pouvez voir par vous-même si l'utilisation de X est meilleure que l'utilisation de Y dans votre configuration, ou quel impact la mise en cache aura, etc.
En fin de compte, une configuration comme celle-ci dépend vraiment des exigences de votre application et de ses clients, tout peut être fait de différentes manières, chacune avec ses propres forces et faiblesses.
Autres questions?
Bonne chance!
Wesley