Vous hébergez probablement votre MongoDB sur un fournisseur de services cloud fiable, par exemple Atlas, parce que vous voulez vraiment vous concentrer sur votre idée et déléguer tous les domaines de gestion clés subtils tels que la mise en réseau, le stockage, l'accès, etc.
Tout semble bien au départ jusqu'à ce que votre petite idée commence à se transformer en une entreprise et que le coût commence à monter en flèche. Même si ce n'est pas le cas, cet article vous donnera tout de même un aperçu général des complexités techniques impliquées (et des économies réalisées !) si vous deviez migrer vers une solution auto-hébergée.
BTW, de combien d'économies parlons-nous ? Faisons une comparaison rapide entre un Atlas instance et une MongoDB auto-hébergée sur AWS .
Atlas (~$166/mois)
0,23 $/heure en fonction des exigences sélectionnées ci-dessus (~ cloud.mongodb.com)
AWS (~ 36 USD/mois)
0,0416 $/heure pour l'instance et une tarification supplémentaire basée sur le type et le stockage EBS (~ calculator.aws)
C'est près de 4,5 fois plus d'économies rien qu'en termes d'infrastructure !
Maintenant que vous connaissez les principales raisons et que vous lisez toujours cet article, sans plus tarder, plongeons dans la technologie.
Contour
- Mise en place de l'infrastructure
- Configuration de MongoDB
- Migration groupée
- Delta-sync pour combler la latence du changement de connexion (non applicable aux clusters obsolètes)
Étant donné que tout le contenu peut être un peu épuisant au même endroit, je vais le diviser en 2 articles connexes.
1. Mise en place de l'infrastructure
Je vais mentionner ci-dessous le guide pour configurer une instance exécutant RedHat Enterprise Linux 8 sur AWS. En effet, MongoDB fonctionne généralement mieux avec le système de fichiers xfs. Voici un article pour mieux le comprendre.
Démarrer une instance EC2
J'ai utilisé un t3.small
instance fournie avec 2 processeurs virtuels et 2 Go de RAM bien que vous puissiez sélectionner n'importe quelle instance de votre choix.
Il est recommandé que votre base de données ait accès à au moins 1 Go de RAM et 2 vrais cœurs car cela affecte directement les performances lors des mécanismes de mise en cache et de concurrence, tels qu'ils sont gérés par le moteur par défaut WiredTiger . Vous pouvez en savoir plus sur les notes de production liées aux exigences de RAM et de CPU ici .
Présentation de la configuration :
- SE :Redhat Enterprise Linux 8 (basé sur Intel x64)
- Type d'instance :t3.small
- Espace de stockage :10 Go (système d'exploitation) + 30 Go (données) + 3 Go (journaux) de EBS soit 3 tomes distincts
Je suppose que vous savez comment créer une machine virtuelle sur AWS.
Maintenant, une fois que l'instance est en cours d'exécution, attribuez une adresse IP élastique puis connectez-vous simplement à distance à la machine.
Nous aurons besoin de l'IP Elastic pour configurer le nom d'hôte public de l'instance
$ ssh -i <PEM_FILE> ec2-user@<ELASTIC_IP>
Monter des volumes supplémentaires
Nous avons ajouté 2 volumes EBS supplémentaires autres que le Root FS pour les données et les journaux qui doivent encore être montés (Vous vous souvenez des 30 Go et 3 Go ? ). Vous pouvez lister les blocs de volume en utilisant,
$ sudo lsblk
Les volumes supplémentaires seront listés juste après le bloc racine (voir les flèches)
Dans l'image ci-dessus, vous pouvez voir que les volumes supplémentaires sont nommés
- xvdb (30 Go d'espace pour stocker les données)
- xvcc (3 Go d'espace pour stocker les journaux)
Maintenant, créons les systèmes de fichiers dans ces volumes.
$ sudo mkfs.xfs -L mongodata /dev/xvdb
$ sudo mkfs.xfs -L mongologs /dev/xvdc
-L
est une option d'alias pour définir le nom de volume
Et puis montez les volumes.
$ sudo mount -t xfs /dev/xvdb /var/lib/mongo
$ sudo mount -t xfs /dev/xvdc /var/log/mongodb
Pour que ces modifications soient prises en compte, le système doit être redémarré. Par conséquent, nous avons maintenant également besoin de la persistance de la partition afin qu'en cas de redémarrage involontaire, nous ne perdions pas le stockage de la base de données.
Nous pouvons y parvenir en spécifiant les règles de montage dans le fichier fstab. Vous pouvez en savoir plus ici.
Avant cela, copions l'UUID des partitions ci-dessus (car elles sont uniques et ne changeront pas lors d'un redémarrage du système )
$ sudo blkid
Copiez les UUID répertoriés pour /dev/xvdb et /dev/xvdc . Reportez-vous au "LABEL" pour l'identification des blocs
Ouvrez maintenant le /etc/fstab
fichier et collez la configuration au format suivant.
UUID=<COPIED_UUID_FOR_DATA> /var/lib/mongo xfs defaults,nofail 0 0
UUID=<COPIED_UUID_FOR_LOGS> /var/log/mongodb xfs defaults,nofail 0 0
Mettre à jour le nom d'hôte
Le nom d'hôte sera utilisé pour identifier votre serveur de base de données sur le réseau. Vous pouvez soit utiliser l'adresse IP élastique attribuée ci-dessus ou Nom de domaine (si disponible). Ouvrez le /etc/hostname
déposer et ajouter l'entrée. Par exemple
ip-xx.us-east-2.compute.internal **<ELASTIC_IP> <DOMAIN_1> <DOMAIN_2>** ...
Mettre à jour les limites du processus (facultatif)
Ceci est éventuellement requis afin de contrôler le nombre maximum de connexions acceptables tout en maintenant la stabilité du système. Ouvrez le fichier /etc/security/limits.conf
fichier et ajoutez les entrées suivantes.
* soft nofile 64000
* hard nofile 64000
* soft nproc 32000
* hard nproc 32000
Maintenant que tous les prérequis liés à l'infra sont triés, redémarrez l'instance, et passons à l'installation de MongoDB.
1. Configuration de MongoDB
Ajouter la source du référentiel
Créez un fichier /etc/yum.repos.d/mongodb-org.4.2.repo
et ajoutez les détails suivants du référentiel de packages.
[mongodb-org-4.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc
Installons maintenant MongoDB.
$ sudo yum -y install mongodb-org
Créer des répertoires et configurer les autorisations
MongoDB utilise par défaut les chemins suivants pour stocker les données et les logs internes :
/var/lib/mongo → Données
/var/log/mongodb → Journaux
Créer les répertoires
$ sudo mkdir /var/lib/mongo
$ sudo mkdir /var/log/mongodb
Modifier les autorisations des utilisateurs et des groupes
$ sudo chown mongod:mongod /var/lib/mongo
$ sudo chown mongod:mongod /var/log/mongod
Créer un utilisateur administrateur
Le démon/service mongod doit être exécuté pour la première fois avant de procéder à la création d'un utilisateur. Utilisons la configuration par défaut (stockée dans /etc/mongod.conf
) pour l'instant et démarrez le processus démon.
$ sudo -u mongod mongod -f /etc/mongod.conf
La commande ci-dessus démarrera le démon mongod en mode fork (par défaut).
Maintenant, connectons-nous au serveur et créons notre premier utilisateur administrateur.
Ouvrir un shell mongo
$ mongo
Utilisez la base de données "admin" pour créer le root-admin
> use admin
Créer l'utilisateur administrateur
> db.createUser({user: "admin", pwd: "password", roles: [{role: "root", db: "admin"}]})
Créer un utilisateur régulier
> db.createUser({user: "normal_user", pwd: "password", roles: [{role: "readWriteAnyDatabase", db: "admin"}]})
Éteignez le serveur pour l'instant. Nous allons redémarrer avec la configuration modifiée
> db.shutDownServer()
Configuration de l'authentification
Ici, nous allons activer l'authentification de la base de données et modifier l'adresse de liaison pour que notre serveur soit accessible dans le domaine public. Ouvrez /etc/mongod.conf
et apportez les modifications ci-dessous.
# network interfaces
net:
port: 27017
bindIp: 0.0.0.0 # accessible on the network address
security:
authorization: enabled # creds will be required for making db operations
Enregistrez la configuration et redémarrez le serveur.
$ sudo -u mongod mongod -f /etc/mongod.conf
Tester la connexion
Vous pouvez vérifier si les informations d'identification fonctionnent en utilisant,
$ mongo -u admin -p password
C'est tout pour la configuration initiale ! Veuillez rester à l'écoute pour mon prochain article sur le processus de migration détaillé et des conseils pour garder la base de données prête pour la production.
PS Merci à Piyush Kumar d'avoir aidé à organiser ce post !