Comment limiter les connexions par hôte dans MongoDB?


8

J'exécute un serveur mongo qui accepte les connexions d'autres clients via le pilote java. Ce que j'ai remarqué, c'est qu'après un certain temps, certains utilisateurs ouvrent trop de ports, ce qui empêche d'autres utilisateurs de se connecter au mongo. Ils ne créent qu'un seul mongoClientobjet, bien que la vérification de leur adresse IP entraîne la surveillance de centaines de ports.

Je suis tombé sur un exemple pour limiter la connexion par hôte dans le pilote java, mais je ne veux pas que le client s'en mêle. Comment puis-je limiter le client de mon instance mongod?

L'instance est 1 mongod qui s'exécute sur un serveur distant Linux.

Réponses:


12

J'ai énuméré ci-dessous quelques alternatives pour la gestion des connexions, par ordre de plus à moins recommandé.

Augmentez les connexions autorisées sur le serveur

La limite de connexion entrante totale sur le serveur est déterminée par la moindre des limites imposées par le système d'exploitation ou maxIncomingConnections(alias maxConnsdans MongoDB 2.4 et versions antérieures).

Les distributions Linux limitent généralement les descripteurs de fichiers par processus à 1024, dont MongoDB utilisera 80% pour les connexions entrantes (laissant environ 819 connexions disponibles).

Vous pouvez vérifier les connexions actuelles et disponibles dans le mongoshell via:

db.serverStatus().connections

Pour les systèmes de production, il est typique d'ajuster les ulimitparamètres sous Linux pour permettre plus de connexions simultanées. Pour plus de meilleures pratiques, je recommanderais de revoir les notes de production dans le manuel MongoDB.

Fournir une API

Si vous gérez un serveur partagé avec des limites de ressources, il est courant de fournir votre propre API plutôt que d'accéder directement à la base de données. Cette approche vous offre une couche d'abstraction supplémentaire afin que vous puissiez gérer l'utilisation des ressources et le déploiement du serveur indépendamment de la configuration du client. Par exemple, vous pouvez déplacer votre serveur de base de données ou reconfigurer d'un poste autonome vers un jeu de réplicas, et les clients n'auront pas à en être conscients. Vous pouvez également gérer des limites de ressources personnalisées (telles que les connexions par client) via votre API, en fonction des informations d'identification que le client utilise pour se connecter.

Réduisez la taille du pool de connexions dans les clients

MongoDB (à la version 2.6) n'a pas d'option pour limiter les connexions par client. Normalement, les limites du client seraient imposées via le pilote (c'est-à-dire la définition de la taille du pool de connexions). Par exemple, dans le pilote Java, la MongoClienttaille maximale par défaut du pool est 100.

Vous avez déjà suggéré que ce n'était pas une option souhaitable car vous ne voulez pas que les clients gâchent les limites de connexion, mais si vous allez imposer une limite côté serveur, il serait toujours raisonnable de leur demander de définir la taille du pool. de manière appropriée. Sinon, leurs applications recevront des exceptions fréquentes lorsque vous couperez les connexions en excès.

Surveiller les opérations client

Si l'ajustement des limites sur le client ou le serveur n'est pas une option, une alternative à envisager consiste à implémenter un script pour compter les connexions clientes simultanées (par IP) via db.currentOp()et tuer les connexions en excès via db.killOp(). Vous devez être très prudent pour ne tuer que les demandes des clients. La killOp()commande est une commande de superutilisateur qui vous permettra également de tuer les threads de base de données internes (ce qui peut conduire à des résultats imprévisibles).

REMARQUE: cette approche échouera si vos clients se connectent via une passerelle partagée (c'est-à-dire lorsque l'adresse IP source n'identifie pas de manière unique un client).

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.