This guide covers essential MongoDB clustering concepts commonly asked in technical interviews. Each question includes detailed answers and practical examples.
MongoDB clustering is a method of deploying multiple MongoDB instances to provide high availability, scalability, and fault tolerance. Key benefits include:
Cluster setup and configuration:
# Start config servers
mongod --configsvr --dbpath /data/configdb --port 27019
# Start shard servers
mongod --shardsvr --dbpath /data/shard1 --port 27018
mongod --shardsvr --dbpath /data/shard2 --port 27017
# Start mongos router
mongos --configdb configReplSet/localhost:27019
# Add shards to cluster
sh.addShard("localhost:27018")
sh.addShard("localhost:27017")
# Enable sharding for database
sh.enableSharding("myapp")
# Shard collection
sh.shardCollection("myapp.users", { "userId": "hashed" })
# Configure replica sets
rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "localhost:27017" },
{ _id: 1, host: "localhost:27018" },
{ _id: 2, host: "localhost:27019" }
]
})
# Configure shard zones
sh.addShardToZone("shard0", "zone1")
sh.addShardToZone("shard1", "zone2")
# Define zone ranges
sh.updateZoneKeyRange(
"myapp.users",
{ "userId": MinKey },
{ "userId": MaxKey },
"zone1"
)
# Configure balancer
sh.setBalancerState(false) // Disable balancer
sh.startBalancer() // Start balancer
sh.stopBalancer() // Stop balancer
Cluster management and monitoring:
# Check cluster status
sh.status()
# Monitor balancer
sh.getBalancerState()
sh.isBalancerRunning()
# Check chunk distribution
db.chunks.find({ ns: "myapp.users" })
# Move chunks
sh.moveChunk("myapp.users",
{ userId: 1000 },
"shard1")
# Split chunks
sh.splitAt("myapp.users",
{ userId: 5000 })
# Monitor cluster metrics
db.adminCommand({
serverStatus: 1
})
# Check operation distribution
db.currentOp().inprog.forEach(function(op) {
if (op.shard) {
printjson(op);
}
})
# Monitor chunk splits
db.changelog.find({
what: "split",
ns: "myapp.users"
})
# Check balancer rounds
db.changelog.find({
what: "balancer.round"
})
Cluster scaling and maintenance:
# Add new shard
sh.addShard("localhost:27020")
# Remove shard
sh.removeShard("shard0")
# Check shard status
sh.status()
# Monitor shard removal
db.adminCommand({
removeShard: "shard0"
})
# Check shard removal status
db.adminCommand({
listShards: 1
})
# Backup cluster
mongodump --host localhost --port 27017 --out /backup
# Restore cluster
mongorestore --host localhost --port 27017 /backup
# Check cluster health
db.adminCommand({
serverStatus: 1
})
# Monitor cluster metrics
db.adminCommand({
top: 1
})
Follow these clustering best practices:
// Optimal shard key selection
function analyzeShardKey(coll, key) {
// Check cardinality
const cardinality = db[coll].distinct(key).length;
// Check distribution
const distribution = db[coll].aggregate([
{ $group: { _id: "$" + key, count: { $sum: 1 } } },
{ $sort: { count: -1 } }
]).toArray();
// Check query patterns
const queries = db.system.profile.find({
ns: db.getName() + "." + coll
}).toArray();
return {
cardinality,
distribution,
queries
};
}
// Implement shard key
db.users.createIndex({ userId: 1 })
sh.shardCollection("myapp.users", { userId: 1 })
// Regular maintenance
function maintainCluster() {
// Check cluster health
const status = sh.status();
// Monitor chunk distribution
const chunks = db.chunks.find({
ns: "myapp.users"
}).toArray();
// Check balancer status
const balancerState = sh.getBalancerState();
// Monitor performance
const performance = db.adminCommand({
serverStatus: 1
});
// Take action based on metrics
if (chunks.length > 1000) {
sh.splitAt("myapp.users", { userId: 5000 });
}
if (!balancerState) {
sh.startBalancer();
}
}
Continue your MongoDB interview preparation with: