web-dev-qa-db-fra.com

Comment limiter les connexions par hôte dans MongoDB?

J'exécute un serveur mongo qui accepte les connexions d'autres clients via Java. La chose que j'ai remarquée est qu'après un certain temps, certains utilisateurs ouvrent trop de ports, ce qui empêche d'autres utilisateurs de se connecter à Ils créent seulement 1 mongoClient objet, bien que la vérification de leur adresse IP permette de regarder des 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 à partir de mon instance mongod?

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

8
itaied

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 (aka maxConns dans 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 mongo Shell via:

db.serverStatus().connections

Pour les systèmes de production, il est typique d'ajuster les ulimit settings sous Linux pour permettre plus de connexions simultanées. Pour plus de meilleures pratiques, je recommanderais de revoir 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 les 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 taille de pool maximale par défaut MongoClient 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 à considérer 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 attentif à ne tuer que les demandes des clients. La commande killOp() 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).

11
Stennie