Puisqu'il y a déjà et une réponse soumise, et une réponse utile et valide à cela, je ne veux pas me distraire de sa propre utilité, mais il y a effectivement des points à soulever qui vont bien au-delà d'un bref commentaire. Considérez donc cette "augmentation", qui, nous l'espérons, est valable mais principalement en plus de ce qui a déjà été dit.
La vérité est de vraiment considérer "comment votre application utilise les données", et d'être également conscient des facteurs dans un "environnement fragmenté" ainsi que de votre "environnement de conteneur" proposé qui affectent cela.
Le cas d'arrière-plan
L'approche générale de la recommandation de pratique pour colocaliser le mongos
processus avec l'instance d'application est d'éviter toute surcharge réseau requise pour que l'application communique avec ce mongos
processus. Bien sûr, il est également "recommandé" de spécifier un certain nombre d' mongos
instances dans la chaîne de connexion de l'application dans le cas où le nœud "le plus proche" ne devrait pas être disponible pour une raison quelconque, puis un autre pourrait être sélectionné, bien qu'avec le surcoût possible de contacter un nœud distant.
Le cas du "docker" dont vous parlez semble quelque peu arbitraire. S'il est vrai que l'un des principaux objectifs des conteneurs (et avant cela, quelque chose comme les prisons BSD ou même chroot) est généralement d'atteindre un certain niveau d '«isolation des processus», il n'y a rien de vraiment mal à exécuter plusieurs processus tant que vous comprendre les implications.
Dans ce cas particulier, le mongos
est censé être "léger" et exécuté en tant que "fonction supplémentaire" pour le processus de demande d'une manière qui est à peu près une partie "appariée" de l'application elle-même. Ainsi, les images docker elles-mêmes n'ont pas de processus de type "initd" mais il n'y a vraiment rien de mal à exécuter un contrôleur de processus comme supervisord (par exemple) en tant que processus principal du conteneur, ce qui vous donne ensuite un point de contrôle du processus sur ce conteneur aussi. Cette situation de «processus jumelés» est un cas raisonnable et aussi une demande assez courante qu'il existe une documentation officielle pour cela.
Si vous avez choisi ce type d'opération «jumelée» pour le déploiement, cela traite en effet le point principal de la gestion d'une mongos
instance sur la même connexion réseau et en fait une «instance de serveur» que le serveur d'applications lui-même. Il peut également être considéré en quelque sorte comme un cas où le "conteneur entier" devait échouer, alors ce nœud en lui-même serait tout simplement invalide. Non pas que je le recommanderais, et en fait, vous devriez probablement configurer des connexions pour rechercher d'autres mongos
instances même si celles-ci ne sont accessibles que via une connexion réseau qui augmente la latence.
Spécifique à la version / spécifique à l'utilisation
Maintenant que ce point est fait, l'autre considération ici revient à cette considération initiale de co-localiser le mongos
processus avec l'application à des fins de latence du réseau. Dans les versions de MongoDB antérieures à 2.6 et en particulier en ce qui concerne les opérations telles que le cadre d'agrégation, le cas était qu'il y aurait beaucoup plus de trafic réseau et après le travail de traitement effectué par le mongos
processus pour traiter les données de différents fragments . Ce n'est pas tellement le cas maintenant, car une grande partie de la charge de travail de traitement peut maintenant être effectuée sur ces fragments eux-mêmes avant de «distiller» le «routeur».
L'autre cas est les modèles d'utilisation de votre application en ce qui concerne le partage. Cela signifie que la charge de travail principale consiste à «distribuer les écritures» sur plusieurs fragments, ou bien à être une approche de «diffusion-collecte» dans la consolidation des demandes de lecture. Dans ces scénarios
Testez, testez puis testez à nouveau
Donc, le dernier point ici est vraiment explicite et se résume au consensus de base de toute réponse sensée à votre question. Ce n'est pas une nouveauté pour MongoDB ou toute autre solution de stockage, mais votre environnement de déploiement réel doit être testé sur ses «modèles d'utilisation» aussi proches de la réalité réelle que tout «test unitaire» des fonctionnalités attendues des composants principaux ou les résultats globaux doivent être testés.
Il n'y a vraiment pas de déclaration «définitive» pour dire «configurer de cette façon» ou «utiliser de cette façon» qui a du sens en dehors de tester ce qui «fonctionne le mieux» pour les performances et la fiabilité de votre application comme prévu.
Bien sûr, le «meilleur cas» sera toujours de ne pas «surcharger» les mongos
instances avec des demandes provenant de «nombreuses» sources de serveur d'applications. Mais ensuite, pour leur permettre une certaine "parité" naturelle qui peut être distribuée par les charges de travail des ressources disponibles pour avoir au moins "un" pool de ressources "qui peut être sélectionné, et idéalement dans de nombreux cas, mais en évitant la nécessité d'induire un supplément "frais généraux de transport réseau".
C'est le but, mais idéalement, vous pouvez "tester en laboratoire" les différentes configurations perçues afin d'arriver à une solution "la mieux adaptée" pour votre éventuelle solution de déploiement.
Je recommanderais également fortement les cours "gratuits" (comme dans la bière) disponibles comme déjà mentionné, et quel que soit votre niveau de connaissance. Je trouve que diverses sources de matériel de cours offrent souvent des «trésors cachés» pour donner plus de détails sur des choses que vous n'avez peut-être pas envisagées ou autrement négligées. La classe M102 mentionnée est construite et dirigée par Adam Commerford pour qui je peux attester qu'il possède un niveau élevé de connaissances sur les déploiements à grande échelle de MongoDB et d'autres architectures de données. Vaut le temps d'envisager au moins une nouvelle perspective sur ce que vous pensez peut-être déjà savoir.
mongos
, le fait de faire correspondre le même nombre de nœuds dédiés devrait fournir au moins suffisamment d'mongos
instances. Ce n'est pas une science exacte et dépend de vos besoins, mais c'est ainsi que je préférerais un environnement de production.