阿里云主机折上折
  • 微信号
Current Site:Index > Data synchronization (Oplog) and delayed nodes

Data synchronization (Oplog) and delayed nodes

Author:Chuan Chen 阅读数:56872人阅读 分类: MongoDB

Data Synchronization (Oplog) and Delayed Nodes

MongoDB replica sets implement data synchronization through the Oplog, while delayed nodes are specially configured members of the replica set. Understanding how these two mechanisms work is crucial for building highly available database architectures.

Oplog Working Mechanism

The Oplog (operation log) is the core component of MongoDB replica sets. It is essentially a fixed-size capped collection stored in the local database. Every data modification operation is recorded in the Oplog in BSON format:

// Example of a typical Oplog entry
{
  "ts" : Timestamp(1627984723, 1),  // Operation timestamp
  "t" : NumberLong(2),             // Term number
  "h" : NumberLong("123456789"),   // Operation hash value
  "v" : 2,                        // Oplog version
  "op" : "i",                     // Operation type (i=insert, u=update, d=delete)
  "ns" : "test.users",            // Namespace
  "ui" : UUID("abcdef12-3456-7890-abcd-ef1234567890"),
  "o" : {                         // Operation document
    "_id" : ObjectId("612a1f33c1d9e7a2b8d0e1f2"),
    "name" : "Zhang San",
    "age" : 30
  }
}

Key characteristics of the Oplog:

  1. Idempotent Design: All operations are designed to be repeatable without side effects.
  2. Circular Writing: When the configured size limit is reached, old entries are overwritten.
  3. On-Demand Synchronization: Secondary nodes request the Oplog entries they need based on their own state.

Replication Synchronization Process

Data synchronization between the primary and secondary nodes is completed through the following steps:

  1. Initial Sync: A full data copy is performed when a new node joins.
  2. Continuous Replication: Oplog entries are continuously fetched via the replSetSyncFrom command.
  3. Heartbeat Detection: Heartbeat packets are sent every 2 seconds to detect member status.
  4. Streaming Transmission: MongoDB 4.2+ supports streaming transmission of the Oplog.

You can check the replication status with the following commands:

// View replica set status
rs.status()

// View Oplog status
db.getReplicationInfo()

Delayed Node Configuration

A delayed node is a replica set member configured with the slaveDelay parameter, intentionally maintaining a data delay relative to the primary node. Example configuration:

// Add delayed node configuration
conf = rs.conf()
conf.members[2].priority = 0
conf.members[2].hidden = true
conf.members[2].slaveDelay = 3600  // Delay of 1 hour
rs.reconfig(conf)

Core features of delayed nodes:

  • Cannot Become Primary: Priority must be set to 0.
  • Invisible to Clients: Typically configured as hidden.
  • Delay Calculation: Based on the primary node's operation time, not local time.

Delayed Node Working Mechanism

The synchronization process of delayed nodes has special handling:

  1. Oplog Fetching: Normally receives all Oplog entries from the primary node.
  2. Delayed Application: Operations are temporarily stored in a memory queue until the configured delay time is reached.
  3. Clock Synchronization: Relies on server clock accuracy to calculate the delay.

Key monitoring metrics:

// View replication delay
db.printSlaveReplicationInfo()

// Example output
source: mongo1:27017
    syncedTo: Thu Aug 05 2021 10:23:45 GMT+0800
    delay: 3582 sec (0.99hr)

Application Scenarios and Practical Use

Data Recovery Scenario

When a primary node experiences an erroneous operation (e.g., accidental collection deletion), data can be recovered from a delayed node:

// 1. Stop synchronization on the delayed node
db.adminCommand({replSetMaintenance: true})

// 2. Convert the delayed node to a standalone node
rs.remove("delayedNode:27017")

// 3. Export data from the delayed node
mongodump --host delayedNode:27017 -d mydb -c importantCollection

// 4. Restore to the primary cluster
mongorestore --host primaryNode:27017 dump/mydb/importantCollection.bson

Read-Write Separation Implementation

Implement read-write separation using delayed nodes:

// Example frontend connection configuration
const { MongoClient } = require('mongodb');

const primaryConnection = new MongoClient('mongodb://primary:27017');
const delayedConnection = new MongoClient('mongodb://delayedNode:27017');

async function queryHistoricalData() {
  // Route delay-tolerant queries to the delayed node
  const client = await delayedConnection.connect();
  return client.db('reporting').collection('analytics').find({
    date: { $gte: new Date(Date.now() - 86400000) }
  }).toArray();
}

Performance Optimization Strategies

Oplog Size Tuning

Setting an appropriate Oplog size is critical. Calculation formula:

Required Oplog Size = Average Write Rate (MB/h) × Maximum Expected Downtime (h) × Safety Factor (1.5-2)

Steps to adjust Oplog size:

// 1. Restart the secondary node in standalone mode
mongod --port 27018 --dbpath /data/db --replSet rs0 --oplogSize 2048

// 2. Rejoin the replica set
rs.add({host: "node2:27018", priority: 0, votes: 0})

Network Optimization

For cross-data center deployments:

// Enable network transmission compression
mongod --networkMessageCompressors zlib

// Configure replica set channel priority
conf.settings = {
  chainingAllowed: false,
  getLastErrorModes: { 
    multiDC: { "dc1": 2, "dc2": 1 }
  }
}
rs.reconfig(conf)

Monitoring and Troubleshooting

Key monitoring metrics collection:

// Example custom monitoring script
const monitorReplicationLag = async () => {
  const adminDb = primaryConnection.db('admin');
  const result = await adminDb.command({ replSetGetStatus: 1 });
  
  result.members.forEach(member => {
    if (member.optimeDate) {
      const lag = Date.now() - member.optimeDate.getTime();
      console.log(`${member.name} lag: ${Math.floor(lag/1000)}s`);
    }
  });
};

setInterval(monitorReplicationLag, 30000);

Common troubleshooting patterns:

  1. Oplog Overflow:
// Temporary solution: Increase the Oplog window
db.adminCommand({replSetResizeOplog: 1, size: 2048})
  1. Synchronization Stagnation:
// Force resynchronization
db.adminCommand({replSetStepDown: 86400})  // Demote primary node
rs.syncFrom("newPrimary:27017")           // Reselect sync source

Advanced Configuration Patterns

Multiple Delayed Node Configuration

Support different business needs with varying delay configurations:

// Configure multiple delayed nodes
const members = [
  {_id:0, host:"primary:27017", priority:10},
  {_id:1, host:"secondary:27017", priority:5},
  {_id:2, host:"delayed1h:27017", priority:0, hidden:true, slaveDelay:3600},
  {_id:3, host:"delayed24h:27017", priority:0, hidden:true, slaveDelay:86400}
];
rs.initiate({_id:"rs0", members, settings:{chainingAllowed:false}});

Mixed Storage Engine Deployment

Combine features of different storage engines:

// WiredTiger primary node + delayed MMAPv1 node
conf.members[2].storageEngine = {
  mmapv1: {
    smallFiles: true,
    journal: { enabled: true }
  }
}
rs.reconfig(conf);

Interaction with Sharded Clusters

In a sharded cluster, each shard is an independent replica set. Delayed node configuration must consider:

// Configure delayed nodes in a sharded cluster
sh.addShardTag("shard1", "delayed")
sh.addTagRange("mydb.analytics", 
  {date: new ISODate("2020-01-01")}, 
  {date: new ISODate("2025-01-01")}, 
  "delayed"
)

Example query routing configuration:

// Use $readPreference to specify query routing
db.analytics.find({reportDate: {$lt: new Date()}})
  .readPref("secondaryPreferred", [{tag: "delayed"}])
  .maxTimeMS(30000)

本站部分内容来自互联网,一切版权均归源网站或源作者所有。

如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn

Front End Chuan

Front End Chuan, Chen Chuan's Code Teahouse 🍵, specializing in exorcising all kinds of stubborn bugs 💻. Daily serving baldness-warning-level development insights 🛠️, with a bonus of one-liners that'll make you laugh for ten years 🐟. Occasionally drops pixel-perfect romance brewed in a coffee cup ☕.