Ce dépôt contient la configuration complète pour déployer un cluster MongoDB shardé dans un environnement Kubernetes en utilisant kind
(Kubernetes in Docker). La configuration inclut plusieurs ensembles de réplicas, des données fragmentées et un routage, tous conçus pour garantir une haute disponibilité, évolutivité et tolérance aux pannes.
- Introduction
- Prérequis
- Architecture
- Guide d'Installation
- Mise à l'Échelle et Test de Charge
- Cas d'Usage: Fragmenter une Collection d'Utilisateurs par
userId
- Dépannage
- Contribuer
- Licence
Ce projet montre comment déployer un cluster MongoDB shardé entièrement fonctionnel sur Kubernetes en utilisant des StatefulSets pour les composants MongoDB, y compris les serveurs de configuration, les serveurs shard, et les services de routage mongos.
L'architecture du cluster comprend :
- 4 Shards avec 2 ou 3 ensembles de réplicas chacun
- 3 Serveurs de configuration (ensemble de réplicas)
- 1 Serveur de routage MongoS
Ce projet est idéal pour quiconque cherche à implémenter une base de données distribuée et évolutive dans Kubernetes pour des applications réelles ou à des fins de test.
Pour installer et déployer ce cluster MongoDB shardé, assurez-vous d'avoir les outils suivants installés :
Le cluster est déployé comme suit :
- Shard 1 : Ensemble de réplicas avec des instances sur les ports 27301, 27302, 27303
- Shard 2 : Ensemble de réplicas avec des instances sur les ports 27401, 27402, 27403
- Shard 3 : Ensemble de réplicas avec des instances sur les ports 27501, 27502, 27503
- Shard 4 : Ensemble de réplicas avec des instances sur les ports 27601, 27602, 27603
- Serveurs de configuration : 3 instances formant un ensemble de réplicas sur les ports 27201, 27202, 27203
- Routeur MongoS : Instance sur le port 27100
git clone https://github.com/Mx-Bx/k8smongodb-shardedcluster.git
cd k8smongodb-shardedcluster
Déployez les shards MongoDB et les serveurs de configuration en utilisant les manifests Kubernetes fournis :
kubectl apply -R -f manifests/.
## OU
./start-all.sh
Vérifiez si tout fonctionne correctement :
./check-status.sh
Déployez les shards MongoDB et les serveurs de configuration en utilisant les manifests Kubernetes fournis :
./init-sharding.sh
Activez le sharding pour une base de données :
sh.enableSharding("dbTest")
Pour vérifier que le sharding fonctionne correctement, vérifiez le statut :
kubectl exec -it $(kubectl get pods -l app=mongos -o jsonpath="{.items[0].metadata.name}") -- mongosh --eval "sh.status()"
Vous pouvez mettre à l'échelle les ensembles de réplicas ou les shards en modifiant les fichiers de configuration StatefulSet.
Pour tester la charge, envisagez d'utiliser un jeu de données comme les exemples de MongoDB ou de générer des données personnalisées en utilisant l'outil mongoimport
de MongoDB.
Commencez par créer une base de données appelée testdb
et activer le sharding sur celle-ci.
-
Connectez-vous à l'instance
mongos
:kubectl exec -it $(kubectl get pods -l app=mongos -o jsonpath="{.items[0].metadata.name}") -- mongosh --port 27100
-
Activez le sharding sur la base de données
testdb
:use testdb sh.enableSharding("testdb")
Ensuite, créez une collection appelée users
et fragmentez-la en fonction du champ userId
, qui servira de clé de fragmentation.
db.createCollection("users")
sh.shardCollection("testdb.users", { "userId": 1 })
## ou
db.users.createIndex({ 'userId': "hashed" })
sh.shardCollection("testdb.users", { 'userId': "hashed" })
## Pour vérifier si les index ont été créés
db.users.getIndexes()
Ensuite, générez un grand jeu de données d'utilisateurs pour observer le comportement du sharding. Utilisez une boucle simple pour insérer un grand nombre de documents avec des valeurs userId
qui seront distribuées uniformément entre les shards.
Dans le shell mongos
, exécutez le script suivant pour insérer 100 000 documents utilisateur :
let batch = [];
for (let i = 1; i <= 100000; i++) {
batch.push({ userId: i, name: "User " + i, age: Math.floor(Math.random() * 50) + 18 });
if (batch.length === 1000) { // Insère tous les 1000 documents
db.users.insertMany(batch);
batch = [];
}
}
if (batch.length > 0) {
db.users.insertMany(batch); // Insère les documents restants
}
Cela insérera 100 000 utilisateurs dans la collection users
avec des âges aléatoires. Le champ userId
est utilisé comme clé de sharding, ce qui permet de distribuer les documents entre vos shards.
Une fois le jeu de données inséré, vous pouvez vérifier comment les chunks ont été distribués entre les shards. Utilisez la commande suivante dans le shell mongos
:
db.adminCommand({ balancerStatus: 1 })
Cela affichera si le balancer distribue activement des chunks entre les shards.
Ensuite, vous pouvez vérifier la distribution des chunks pour la collection users
:
db.printShardingStatus()
db.users.getShardDistribution()
Recherchez la section testdb.users
dans la sortie, qui affichera la distribution des chunks entre vos shards. Chaque chunk représentera une plage de valeurs userId
, et vous verrez combien de chunks sont attribués à chaque shard.
Vous pouvez effectuer quelques requêtes de test pour vérifier comment le sharding affecte les résultats des requêtes.
Par exemple, pour interroger les utilisateurs avec des plages spécifiques de userId
et voir comment MongoDB les traite à travers les shards :
db.users.find({ userId: { $gte: 1000, $lt: 2000 } }).explain("executionStats")
La sortie montrera combien de shards ont été impliqués dans la requête.
- Activer le sharding sur la base de données
testdb
. - Fragmenter la collection
users
paruserId
. - Insérer 100 000 utilisateurs avec des valeurs
userId
. - Vérifier la distribution des chunks avec
db.printShardingStatus()
. - Exécuter des requêtes pour observer comment les données sont réparties entre les shards.
Si vous rencontrez des problèmes, vous pouvez inspecter les journaux des composants MongoDB :
kubectl logs <nom-du-pod>
Vous pouvez exécuter un pod simple busybox
ou alpine
incluant telnet
ou curl
. Voici comment créer un pod de test :
kubectl run test-network-a --image=busybox --restart=Never -- sh -c "sleep 3600"
Une fois que le pod est en cours d'exécution, connectez-vous dedans et testez la connectivité :
kubectl exec -it test-network-a -- sh
Dans le pod, exécutez la commande suivante pour tester la connectivité vers config-server-2
:
telnet config-server-2.config-server.default.svc.cluster.local 27201
ou
nc -zv config-server-2.config-server.default.svc.cluster.local 27201
Pour les problèmes courants liés au réseau, au stockage persistant ou à la planification des pods, consultez la documentation Kubernetes ou la documentation MongoDB sur le sharding.
Si vous souhaitez contribuer, n'hésitez pas à soumettre une pull request. Pour les changements majeurs, veuillez ouvrir un ticket pour discuter des modifications avant de les proposer.
Ce projet est sous licence MIT. Voir le fichier LICENSE pour plus de détails.