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");
    }
}