Optimizing Sharded Clusters

1. Understanding Balancer Process

AspectDetail
OwnerRuns on primary config server
TriggerImbalance threshold (chunk count diff)
OperationOne migration at a time per shard pair

2. Starting and Stopping Balancer

MethodDetail
sh.startBalancer()Enable
sh.stopBalancer()Disable
sh.getBalancerState()Current state

3. Configuring Balancer Window

db.settings.update({_id:"balancer"},
  {$set:{activeWindow:{start:"01:00", stop:"06:00"}}}, {upsert:true});
AspectDetail
WindowLimit balancing to off-peak hours

4. Understanding Chunk Migration

PhaseDetail
CloneCopy docs
Catch-upReplay incoming writes
CommitAtomic metadata switch
CleanupOrphan deletion on source

5. Splitting Chunks Manually

MethodDetail
sh.splitAt(ns, middle)Split at exact key
sh.splitFind(ns, query)Split chunk containing query

6. Moving Chunks

MethodDetail
sh.moveChunk(ns, find, to)Manual migration
moveRange 6.0+Move by key range

7. Checking Shard Status

MethodDetail
sh.status()Cluster topology + chunks per shard
db.collection.getShardDistribution()Per-shard storage stats

8. Monitoring Shard Distribution

MetricUse
Chunk count per shardDetect imbalance
Data size per shardTrue load proxy
Migration historychangelog collection on config DB

9. Avoiding Jumbo Chunks

CauseMitigation
Low cardinality keyChoose better shard key / refine
Single huge docRefactor schema
Jumbo flagClear after manual split (4.4+)

10. Understanding Broadcast vs Targeted Queries

TypeTriggerCost
TargetedQuery includes shard keyLow; one shard
Broadcast (scatter-gather)No shard keyHigh; all shards