web-dev-qa-db-fra.com

Comment configurer MongoDB Java) MongoOptions pour une utilisation en production?

J'ai cherché sur le Web les meilleures pratiques pour la configuration de MongoOptions pour le pilote MongoDB Java et je n'ai pas mis au point autre chose que l'API. Cette recherche a démarré après avoir exécuté le Erreur "com.mongodb.DBPortPool $ SemaphoresOut: Plus de sémaphores pour obtenir une connexion à la base de données" et en augmentant le nombre de connexions/multiplicateurs, j'ai pu résoudre ce problème. Je recherche des liens ou vos meilleures pratiques pour configurer ces options en production .

Les options du pilote 2.4 incluent: http://api.mongodb.org/Java/2.4/com/mongodb/MongoOptions.html

  • autoConnectRetry
  • connexionsPerHost
  • connectTimeout
  • maxWaitTime
  • socketTimeout
  • discussionsAllowedToBlockForConnectionMultiplier

Les nouveaux conducteurs ont plus d'options et j'aimerais en savoir plus à ce sujet.

98
Dan Polites

Mis à jour à 2.9:

  • autoConnectRetry signifie simplement que le pilote tentera automatiquement de se reconnecter au (x) serveur (s) après des déconnexions inattendues. Dans les environnements de production, vous souhaitez généralement que ce paramètre soit défini sur true.

  • connectionsPerHost représente le nombre de connexions physiques qu'une seule instance de Mongo (c'est un singleton, vous en avez donc généralement une par application) peut établir un processus mongod/mongos. Au moment de la rédaction, le pilote Java établira éventuellement cette quantité de connexions, même si le débit réel de la requête est faible (dans les mots de commande, vous verrez la statistique "conn" augmenter dans le mongostat jusqu’à atteindre ce niveau). nombre par serveur d'applications).

    Dans la plupart des cas, il n'est pas nécessaire de définir une valeur supérieure à 100, mais ce paramètre est l'un de ceux qui permettent de "tester et de voir". Notez que vous devrez vous assurer de définir cette valeur suffisamment bas pour que le nombre total de connexions à votre serveur ne dépasse pas

    db.serverStatus().connections.available

    En production, nous en avons actuellement 40.

  • connectTimeout . Comme son nom l'indique en millisecondes, le pilote attendra avant qu'une tentative de connexion ne soit annulée. Définissez le délai d’exécution sur une durée trop longue (15 à 30 secondes), sauf s’il existe une chance réaliste et prévisible que cela entravera le succès des tentatives de connexion. Normalement, si une tentative de connexion dure plus de quelques secondes, votre infrastructure réseau n'est pas capable d'un débit élevé.

  • maxWaitTime . Nombre de ms qu'un thread attendra qu'une connexion soit disponible sur le pool de connexions et lève une exception si cela ne se produit pas à temps. Conserver les valeurs par défaut.

  • socketTimeout . Valeur standard du délai d'attente de la prise. Réglé à 60 secondes (60000).

  • threadsAllowedToBlockForConnectionMultiplier . Multiplicateur pour connectionsPerHost qui indique le nombre de threads autorisés à attendre que les connexions deviennent disponibles si le pool est actuellement épuisé. Il s'agit du paramètre qui provoquera l'exception "com.mongodb.DBPortPool $ SemaphoresOut: Hors sémaphores pour obtenir une connexion à une base de données". Il lève cette exception lorsque cette file d'attente de threads dépasse la valeur de threadsAllowedToBlockForConnectionMultiplier. Par exemple, si le paramètre connectionsPerHost a pour valeur 10 et si la valeur est comprise entre 5 et 50 threads peuvent être bloqués avant la levée de l'exception susmentionnée.

    Si vous vous attendez à des pics de débit élevés susceptibles d'entraîner de grandes files d'attente, augmentez temporairement cette valeur. Nous l'avons à 15 heures pour le moment pour cette raison. Si la charge de votre requête dépasse systématiquement le serveur, vous devez simplement améliorer votre situation matérielle/mise à l'échelle en conséquence.

  • readPreference . (UPDATED, 2.8 +) Utilisé pour déterminer la préférence de lecture par défaut et remplace "slaveOk". Configurez une référence de lecture via l'une des méthodes de fabrique de classe. Vous trouverez une description complète des paramètres les plus courants à la fin de cet article

  • w . (UPDATED, 2.6 +) Cette valeur détermine la "sécurité" de l'écriture. Lorsque cette valeur est -1, l'écriture ne signale aucune erreur, que ce soit une erreur de réseau ou de base de données. WriteConcern.NONE est le WriteConcern prédéfini approprié pour cela. Si w est égal à 0, les erreurs réseau feront échouer l'écriture, mais pas les erreurs mongo. C'est ce que l'on appelle généralement "tire et oublie" et devrait être utilisé lorsque les performances sont plus importantes que la cohérence et la durabilité. Utilisez WriteConcern.NORMAL pour ce mode.

    Si vous définissez w sur 1 ou plus, l’écriture est considérée comme sûre. Les écritures sécurisées effectuent l'écriture et la suivent en envoyant une requête au serveur pour s'assurer que l'écriture a réussi ou en récupérant une valeur d'erreur si ce n'est pas le cas (autrement dit, il envoie une commande getLastError () après l'écriture). Notez que tant que cette commande getLastError () n'est pas terminée, la connexion est réservée. En conséquence de cela et de la commande supplémentaire, le débit sera considérablement inférieur à celui écrit avec w <= 0. Avec une valeur w exactement 1, MongoDB garantit que l'écriture a réussi (ou échoué de manière vérifiable) sur l'instance à laquelle vous avez envoyé l'écriture.

    Dans le cas de jeux de réplicas, vous pouvez utiliser des valeurs plus élevées pour w qui demandent à MongoDB d'envoyer l'écriture à au moins les membres "w" du jeu de réplicas avant de retourner (ou plus précisément, attendez la réplication de votre écriture vers les membres "w" ). Vous pouvez également définir w avec la chaîne "majorité" qui indique à MongoDB d'effectuer l'écriture sur la majorité des membres du jeu de réplicas (WriteConcern.MAJORITY). En règle générale, vous devez définir cette valeur sur 1 sauf si vous avez besoin de performances brutes (-1 ou 0) ou d'écritures répliquées (> 1). Les valeurs supérieures à 1 ont un impact considérable sur le débit en écriture.

  • fsync . Option de durabilité qui oblige mongo à se vider sur le disque après chaque écriture, une fois activé. Je n'ai jamais eu de problèmes de durabilité liés à un arriéré d'écriture, nous avons donc ceci sur false (défaut) en production.

  • j * (NOUVEAU 2.7 +) *. Boolean qui, lorsqu'il est défini sur true, force MongoDB à attendre la validation d'un groupe de journalisation réussi avant de revenir. Si vous avez activé la journalisation, vous pouvez l'activer pour une durabilité accrue. Reportez-vous à http://www.mongodb.org/display/DOCS/Journaling pour voir ce que la journalisation vous procure (et par conséquent pourquoi vous souhaitez activer ce drapeau).

ReadPreference La classe ReadPreference vous permet de configurer les instances mongod vers lesquelles les requêtes sont acheminées si vous utilisez des jeux de réplicas. Les options suivantes sont disponibles:

  • ReadPreference.primary () : toutes les lectures vont uniquement au membre principal du repset. Utilisez cette option si vous souhaitez que toutes les requêtes renvoient des données cohérentes (les plus récemment écrites). C'est la valeur par défaut.

  • ReadPreference.primaryPreferred () : toutes les lectures sont dirigées vers le membre principal du repset si possible, mais peuvent interroger les membres secondaires si le nœud principal n'est pas disponible. En tant que tel, si les primaires deviennent indisponibles, les lectures deviennent finalement cohérentes, mais uniquement si les primaires sont indisponibles.

  • ReadPreference.secondary () : toutes les lectures sont transmises aux membres du repset secondaire et le membre principal est utilisé uniquement pour les écritures. Utilisez-le uniquement si vous pouvez vivre avec des lectures cohérentes. Des membres supplémentaires du repset peuvent être utilisés pour augmenter les performances en lecture, bien qu'il y ait des limites au nombre de membres (votants) qu'un repset peut avoir.

  • ReadPreference.secondaryPreferred () : toutes les lectures sont dirigées vers les membres du repset secondaire si l'un d'entre eux est disponible. Le membre principal est utilisé exclusivement pour les écritures, sauf si tous les membres secondaires deviennent indisponibles. Ceci est identique à ReadPreference.secondary (), à l'exception du repli sur le membre principal pour les lectures.

  • ReadPreference.nearest () : les lectures vont au membre du repset le plus proche disponible pour le client de base de données. Utilisez uniquement si des lectures cohérentes finales sont acceptables. Le membre le plus proche est le membre avec la latence la plus faible entre le client et les différents membres du repset. Etant donné que les membres occupés auront éventuellement des latences plus élevées, ceci devrait équilibrer aussi automatiquement la charge de lecture bien que, selon mon expérience, secondaire (préféré) semble le faire mieux si les latences des membres sont relativement cohérentes.

Remarque: Toutes les versions précédentes ont des versions activées de la même méthode qui renvoient des instances de TaggableReadPreference. Une description complète des balises de jeu de répliques est disponible ici: Balises de jeu de répliques

158
Remon van Vliet