Activez le balancer et effectuez un pré-découpage pour résoudre efficacement les déséquilibres de données, lorsque la majorité des écritures est concentrée sur un seul shard.
Activer le balancer
Si le balancer est désactivé ou si la fenêtre temporelle configurée n'est pas encore atteinte, activez-le ou supprimez temporairement cette fenêtre pour lancer immédiatement l'équilibrage des données.
Connectez-vous à l'instance du cluster MongoDB fragmenté.
-
Dans la fenêtre de commande du nœud mongos, basculez vers la base de données config.
use config -
Exécutez la commande suivante selon vos besoins.
-
Activer le balancer
sh.setBalancerState(true) -
Supprimer temporairement la fenêtre du balancer
db.settings.updateOne( { _id : "balancer" }, { $unset : { activeWindow : true } } )
-
Pré-découpage
MongoDB prend en charge le sharding par plage (ranged) et le sharding haché (hashed). Le pré-découpage répartit les valeurs des chunks sur plusieurs nœuds shard de manière aussi uniforme que possible, ce qui contribue à équilibrer la charge lors de la synchronisation ou de la migration des données via DTS.
Sharding haché
Utilisez le paramètre numInitialChunks pour effectuer rapidement un pré-découpage. La valeur par défaut est nombre de shards × 2 et la valeur maximale est nombre de shards × 8192. Pour plus d'informations, consultez la documentation sh.shardCollection().
sh.shardCollection("phonebook.contacts", { last_name: "hashed" }, false, {numInitialChunks: 16384})
Sharding par plage
Si la source MongoDB utilise également une architecture de cluster fragmenté, interrogez les données dans
config.chunksafin d'obtenir les plages de chunks des collections fragmentées correspondantes dans la source MongoDB. Utilisez ces informations comme référence pour la valeur<split_value>dans les commandes de pré-découpage ultérieures.-
Si la source MongoDB est un replica set, déterminez la plage spécifique de la clé de shard en exécutant la commande
find, puis définissez des points de découpage appropriés sur la base de cette plage.# Get the minimum value of the shard key db.<coll>.find().sort({<shardKey>:1}).limit(1) # Get the maximum value of the shard key db.<coll>.find().sort({<shardKey>:-1).limit(1)
Syntaxe de la commande
L'exemple suivant utilise la commande splitAt. Pour plus d'informations, consultez les pages sh.splitAt(), sh.splitFind() et Split Chunks in a Sharded Cluster.
sh.splitAt("<db>.<coll>", {"<shardKey>":<split_value>})
Exemple
sh.splitAt("test.test", {"id":0})
sh.splitAt("test.test", {"id":50000})
sh.splitAt("test.test", {"id":75000})
Une fois le pré-découpage terminé, exécutez la commande sh.status() sur le nœud mongos pour vérifier les résultats.