This guide covers essential MongoDB replication concepts commonly asked in technical interviews. Each question includes detailed answers and practical examples.
MongoDB replication is a process of synchronizing data across multiple servers to ensure high availability and data redundancy. Key benefits include:
Replica set setup and configuration:
# Create replica set configuration
config = {
_id: "myReplicaSet",
members: [
{ _id: 0, host: "mongodb1:27017" },
{ _id: 1, host: "mongodb2:27017" },
{ _id: 2, host: "mongodb3:27017" }
]
}
# Initialize replica set
rs.initiate(config)
# Check replica set status
rs.status()
# Add a new member
rs.add("mongodb4:27017")
# Remove a member
rs.remove("mongodb4:27017")
# Configure with priority and tags
config = {
_id: "myReplicaSet",
members: [
{ _id: 0, host: "mongodb1:27017", priority: 2 },
{ _id: 1, host: "mongodb2:27017", priority: 1 },
{ _id: 2, host: "mongodb3:27017", priority: 0.5 },
{ _id: 3, host: "mongodb4:27017", arbiterOnly: true }
],
settings: {
chainingAllowed: true,
heartbeatTimeoutSecs: 10,
electionTimeoutMillis: 10000
}
}
# Initialize with advanced config
rs.reconfig(config)
Replica set operations management:
# Check replica set status
rs.status()
# Check replication lag
db.printSlaveReplicationInfo()
# Check oplog status
db.getReplicationInfo()
# Force reconfiguration
rs.reconfig(config, { force: true })
# Step down primary
rs.stepDown()
# Freeze secondary
rs.freeze(60) # Freeze for 60 seconds
# Check current primary
rs.isMaster()
# Force election
rs.freeze(0) # Unfreeze all nodes
rs.stepDown() // On current primary
# Check failover status
db.adminCommand({ replSetGetStatus: 1 })
# Monitor failover events
db.currentOp().inprog.forEach(function(op) {
if (op.command && op.command.replSetStepDown) {
printjson(op);
}
})
Replication lag and consistency management:
# Check replication lag
db.printSlaveReplicationInfo()
# Monitor oplog window
db.getReplicationInfo()
# Check secondary status
rs.status().members.forEach(function(member) {
if (member.stateStr === "SECONDARY") {
print("Lag for " + member.name + ": " + member.optimeDate);
}
})
# Set read preference
db.getMongo().setReadPref('secondary')
# Write concern configuration
db.users.insert({
name: "John",
email: "john@example.com"
}, { writeConcern: { w: "majority", wtimeout: 5000 } })
# Read concern configuration
db.users.find().readConcern("majority")
# Check consistency
db.runCommand({
findAndModify: "users",
query: { name: "John" },
update: { $set: { status: "active" } },
writeConcern: { w: "majority" }
})
Follow these replication best practices:
# Optimal replica set configuration
config = {
_id: "myReplicaSet",
members: [
{ _id: 0, host: "mongodb1:27017", priority: 2 },
{ _id: 1, host: "mongodb2:27017", priority: 1 },
{ _id: 2, host: "mongodb3:27017", priority: 0.5 }
],
settings: {
chainingAllowed: false,
heartbeatTimeoutSecs: 10,
electionTimeoutMillis: 10000,
catchUpTimeoutMillis: 2000
}
}
# Configure write concern
db.adminCommand({
setDefaultRWConcern: 1,
defaultWriteConcern: { w: "majority" },
defaultReadConcern: { level: "majority" }
})
# Regular health checks
function checkReplicaSetHealth() {
const status = rs.status();
// Check member states
status.members.forEach(function(member) {
if (member.stateStr !== "PRIMARY" &&
member.stateStr !== "SECONDARY") {
print("Warning: " + member.name + " is " + member.stateStr);
}
});
// Check replication lag
const lag = db.printSlaveReplicationInfo();
if (lag > 10) { // More than 10 seconds
print("Warning: High replication lag");
}
// Check oplog window
const oplog = db.getReplicationInfo();
if (oplog.timeDiff < 24 * 60 * 60) { // Less than 24 hours
print("Warning: Small oplog window");
}
}