MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment passer en production avec MongoDB - Les dix meilleurs conseils

Après le développement réussi de l'application et avant de vous consacrer à la production de MongoDB, tenez compte de ces directives rapides afin d'assurer un flux fluide et efficace ainsi que d'obtenir des performances optimales.

1) Options de déploiement

Sélection du bon matériel

Pour des performances optimales, il est préférable d'utiliser le SSD plutôt que le HDD. Il est nécessaire de faire attention si votre stockage est local ou distant et de prendre des mesures en conséquence. Il est préférable d'utiliser RAID pour la protection contre les défauts matériels et le schéma de récupération, mais ne vous y fiez pas entièrement, car il n'offre aucune protection contre les défaillances indésirables. Pour l'exécution sur disques, RAID-10 est un bon choix en termes de performances et de disponibilité, ce qui manque souvent aux autres niveaux RAID. Le bon matériel est la pierre angulaire de votre application pour des performances optimisées et pour éviter toute débâcle majeure.

Hébergement Cloud

Une gamme de fournisseurs de cloud est disponible et propose des hôtes de base de données MongoDB préinstallés. La sélection du meilleur choix est l'étape fondatrice pour que votre application se développe et fasse les premières impressions sur le marché cible. MongoDB Atlas est l'un des choix possibles qui offre une solution complète pour l'interface cloud avec des fonctionnalités telles que le déploiement de vos nœuds et un instantané de vos données stockées dans Amazon S3. ClusterControl est une autre bonne option disponible pour un déploiement et une mise à l'échelle faciles. Qui offre une variété de fonctionnalités telles que l'ajout et la suppression faciles de nœuds, le redimensionnement des instances et le clonage de votre cluster de production. Vous pouvez essayer ClusterControl ici sans être facturé. Les autres options disponibles sont RackSpace ObjectRocket et MongoStitch.

2) RAM

Les éléments fréquemment consultés sont mis en cache dans la RAM, afin que MongoDB puisse fournir un temps de réponse optimal. La RAM dépend généralement de la quantité de données que vous allez stocker, du nombre de collections et des index. Assurez-vous d'avoir suffisamment de RAM pour accueillir vos index, sinon cela affectera considérablement les performances de votre application en production. Plus de RAM signifie moins de défauts de page et un meilleur temps de réponse.

3) Indexation

Pour les applications qui comportent des requêtes d'écriture chroniques, l'indexation joue un rôle impératif. Selon les documents MongoDB :

"Si une opération d'écriture modifie un champ indexé, MongoDB met à jour tous les index qui ont le champ modifié comme clé"

Soyez donc prudent lorsque vous choisissez des index car cela peut affecter les performances de votre base de données.

Exemple d'indexation :saisie d'un échantillon dans la base de données du restaurant

{
  "address": {
     "building": "701",
     "street": "Harley street",
     "zipcode": "71000"
  },
  "cuisine": "Bakery",
  "grades": [
     { "date": { "$date": 1393804800000 }, "grade": "A", "score": 2 },
     { "date": { "$date": 1378857600000 }, "grade": "A", "score": 6 },
     { "date": { "$date": 1358985600000 }, "grade": "A", "score": 10 },
     { "date": { "$date": 1322006400000 }, "grade": "A", "score": 9 },
     { "date": { "$date": 1299715200000 }, "grade": "B", "score": 14 }
  ],
  "name": "Bombay Bakery",
  "restaurant_id": "187521"
}
  1. Création d'un index sur un seul champ

    > db.restaurants.createIndex( { "cuisine": 1 } );
    {
         "createdCollectionAutomatically" : false,
         "numIndexesBefore" : 1,
         "numIndexesAfter" : 2,
         "ok" : 1
    }

    Dans l'exemple ci-dessus, l'index d'ordre croissant est créé sur le champ de la cuisine.

  2. Création d'index sur plusieurs champs

    > db.restaurants.createIndex( { "cuisine": 1 , "address.zipcode": -1 } );
    {
            "createdCollectionAutomatically" : false,
            "numIndexesBefore" : 2,
            "numIndexesAfter" : 3,
            "ok" : 1
    }

    Ici, l'index composé est créé sur les champs de la cuisine et du code postal. Le nombre -ve définit l'ordre décroissant.

4) Soyez prêt pour le partage

MongoDB partitionne les données sur différentes machines à l'aide d'un mécanisme appelé sharding. Il n'est pas conseillé d'ajouter le sharding au début, sauf si vous vous attendez à des ensembles de données volumineux. N'oubliez pas que pour maintenir les performances de votre application, vous avez besoin d'une bonne clé de partitionnement, en fonction de vos modèles de données, car cela affecte directement votre temps de réponse. L'équilibrage des données entre les partitions est automatique. Cependant, il vaut mieux être préparé et avoir un bon plan. Vous pouvez ainsi consolider chaque fois que votre application l'exige.

5) Meilleures pratiques pour la configuration du système d'exploitation

  • Système de fichiers XFS
    • Il s'agit d'un système de fichiers de journalisation 64 bits hautement évolutif et performant. Améliore les performances d'E/S en autorisant des opérations d'E/S moins nombreuses et plus importantes.
  • Mettre la limite du descripteur de fichier.
  • Désactivez les pages volumineuses transparentes et la mémoire à accès non uniforme (NUMA).
  • Changez le temps TCP keepalive par défaut à 300 secondes (pour Linux) et 120 secondes (pour Azure).

Essayez ces commandes pour modifier la durée de vie par défaut ;

Pour Linux

sudo sysctl -w net.ipv4.tcp_keepalive_time=<value>

Pour Windows

Tapez cette commande dans l'invite de commande en tant qu'administrateur, où est exprimé en hexadécimal (par exemple, 120000 correspond à 0x1d4c0) :

reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\ /t REG_DWORD /v KeepAliveTime /d <value>

6) Garantir une haute disponibilité à l'aide de la réplication

Passer en production sans réplication peut entraîner des pannes soudaines de votre application. La réplication prend en charge le problème en cas de défaillance d'un nœud. Gérez les opérations de lecture et d'écriture pour vos instances MongoDB secondaires en fonction des besoins de votre application.

Gardez ces éléments à l'esprit lors de la réplication :

  • Pour une haute disponibilité, déployez votre jeu d'instances dupliquées dans au moins trois centres de données.
  • Assurez-vous que les instances MongoDB ont 0 ou 1 vote.
  • Assurez-vous d'une connectivité réseau bidirectionnelle complète entre toutes les instances MongoDB.

Exemple de création d'un jeu de répliques avec 4 instances MongoDB locales :

  1. Création de 4 instances MongoDB locales

    Tout d'abord, créez des répertoires de données

    mkdir -p /data/m0
    mkdir -p /data/m1
    mkdir -p /data/m2
    mkdir -p /data/m3
  2. Démarrez 4 instances locales

    mongod --replSet cluster1 --port 27017 --dbpath /data/m0
    mongod --replSet cluster2 --port 27018 --dbpath /data/m1
    mongod --replSet cluster1 --port 27019 --dbpath /data/m2
    mongod --replSet cluster1 --port 27020 --dbpath /data/m3
  3. Ajoutez les instances au cluster et lancez

    mongo myhost:34014
    myConfig = {_id: ‘cluster1’, members: [
        {_id: 0, host: ‘myhost1:27017’},
        {_id: 1, host: ‘myhost2:27018’},
        {_id: 2, host: ‘myhost3:27019’},
        {_id: 3, host: ‘myhost4:27020’}]
    }
    rs.initiate(myConfig);

Mesures de sécurité

7) Machines sécurisées

Les ports ouverts sur les machines hébergeant MongoDB sont vulnérables à diverses attaques malveillantes. Plus de 30 000 bases de données MongoDB ont été compromises dans une attaque de ransomware en raison d'un décalage dans la configuration de sécurité appropriée. Pendant la production, fermez vos ports publics du serveur MongoDB. Cependant, vous devez garder un port ouvert à des fins SSh.

Activation de l'authentification sur l'instance MongoDB :

  1. Lancez le fichier mongod.conf dans votre éditeur préféré.

  2. Ajoutez ces lignes à la fin du fichier de configuration.

    security:
          authorization: enabled
  3. Ajoutez ces lignes à la fin du fichier de configuration.

    service mongod restart
  4. Confirmer le statut

    service mongod status

Interdire l'accès externe

Ouvrez à nouveau le fichier mongod.conf pour définir un accès IP limité à votre serveur.

bind_ip=127.0.0.1

En ajoutant cette ligne, cela signifie que vous ne pouvez accéder à votre serveur que via 127.0.0. (qui est localhost). Vous pouvez également ajouter plusieurs adresses IP dans l'option de liaison.

bind_ip=127.0.0.1,168.21.200.200

Cela signifie que vous pouvez accéder à partir de localhost et de votre réseau privé.

8) Protection par mot de passe

Pour ajouter une couche de sécurité supplémentaire à vos machines, activez le contrôle d'accès et appliquez l'authentification. Malgré le fait que vous ayez restreint le serveur MongoDB pour qu'il accepte les connexions du monde extérieur, il est toujours possible que des scripts malveillants pénètrent dans votre serveur. N'hésitez donc pas à définir un nom d'utilisateur/mot de passe pour votre base de données et à attribuer les autorisations requises. Le contrôle d'accès activé permettra aux utilisateurs d'effectuer uniquement des actions déterminées par leurs rôles.

Voici les étapes pour créer un utilisateur et attribuer un accès à la base de données avec des rôles spécifiques.

En premier lieu, nous allons créer un utilisateur (dans ce cas, c'est admin) pour gérer tous les utilisateurs et bases de données, puis nous allons créer un propriétaire de base de données spécifique ayant uniquement des privilèges de lecture et d'écriture sur une instance de base de données MongoDB.

Créer un utilisateur administrateur pour gérer les autres utilisateurs pour les instances de base de données

  1. Ouvrez votre shell Mongo et passez à la base de données d'administration :

    use admin
  2. Créer un utilisateur pour la base de données d'administration

    db.createUser({ user: "admin", pwd: "admin_password", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })
  3. Authentifier l'utilisateur nouvellement créé

    db.auth("admin", "admin_password")
  4. Création d'un utilisateur d'instance spécifique :

    use database_1
    db.createUser({ user: "user_1", pwd: "your_password", roles: [{ role: "dbOwner", db: "database_1" }] })
  5. Vérifiez maintenant si un utilisateur a été créé avec succès ou non.

    db.auth("user_1", "your_password")
    show collections

C'est ça! Vous avez réussi à sécuriser vos instances de base de données avec une authentification appropriée. Vous pouvez ajouter autant d'utilisateurs que vous le souhaitez en suivant la même procédure.

9) Chiffrement et protection des données

Si vous utilisez Wiredtiger comme moteur de stockage, vous pouvez utiliser sa configuration de chiffrement au repos pour chiffrer vos données. Si ce n'est pas le cas, le chiffrement doit être effectué sur l'hôte à l'aide d'un système de fichiers, d'appareils ou d'un chiffrement physique.

10) Surveillez votre déploiement

Une fois que vous avez terminé le déploiement de MongoDB en production, vous devez suivre l'activité de performance pour éviter les problèmes éventuels. Il existe une gamme de stratégies que vous pouvez adapter pour surveiller les performances de vos données dans l'environnement de production.

  • MongoDB inclut des utilitaires qui renvoient des statistiques sur les performances et l'activité de l'instance. Les utilitaires sont utilisés pour identifier les problèmes et analyser les opérations normales.

  • Utilisez mongostat pour appréhender la disposition des types d'opérations et la planification des capacités.

  • Pour le suivi des rapports et des activités de lecture-écriture, mongotop est recommandé.

mongotop 15

Cette commande renverra une sortie toutes les 15 secondes.

                     ns    total    read    write          2018-04-22T15:32:01-05:00
   admin.system.roles      0ms     0ms      0ms
 admin.system.version      0ms     0ms      0ms
             local.me      0ms     0ms      0ms
       local.oplog.rs      0ms     0ms      0ms
   local.replset.minvalid  0ms     0ms      0ms
    local.startup_log      0ms     0ms      0ms
 local.system.indexes      0ms     0ms      0ms
  local.system.namespaces  0ms     0ms      0ms
 local.system.replset      0ms     0ms      0ms     
                     ns    total    read    write          2018-04-22T15:32:16-05:00
   admin.system.roles      0ms     0ms      0ms
 admin.system.version      0ms     0ms      0ms
             local.me      0ms     0ms      0ms
       local.oplog.rs      0ms     0ms      0ms
   local.replset.minvalid  0ms     0ms      0ms
    local.startup_log      0ms     0ms      0ms
 local.system.indexes      0ms     0ms      0ms
  local.system.namespaces  0ms     0ms      0ms
 local.system.replset      0ms     0ms      0ms

Le service de surveillance MongoDB (MMS) est une autre option disponible qui surveille votre cluster MongoDB et vous permet d'avoir une vue pratique des activités de déploiement de production.

Et bien sûr, il y a ClusterControl de Manynines, le système d'automatisation et de gestion des bases de données open source. ClusterControl permet un déploiement facile des clusters avec des paramètres de sécurité automatisés et simplifie le dépannage de votre base de données en fournissant une automatisation de la gestion facile à utiliser qui inclut la réparation et la récupération des nœuds cassés, les mises à niveau automatiques, etc. Vous pouvez commencer avec son édition communautaire (gratuite pour toujours), avec laquelle vous pouvez déployer et surveiller MongoDB ainsi que créer des conseillers personnalisés afin d'adapter vos efforts de surveillance aux aspects spécifiques à votre configuration. Téléchargez-le gratuitement ici.