voyageai-cli
Version:
CLI for Voyage AI embeddings, reranking, and MongoDB Atlas Vector Search
273 lines (212 loc) • 8.76 kB
Markdown
# MongoDB Backup and Recovery
## Overview
A robust backup and recovery strategy is essential for any production MongoDB
deployment. This guide covers backup methods, restore procedures, point-in-time
recovery, and disaster recovery planning for both self-managed and MongoDB Atlas
deployments.
## Backup Methods
### mongodump and mongorestore
The `mongodump` tool exports data in BSON dump format, capturing collections,
indexes, and metadata. `mongorestore` imports BSON dumps back into a MongoDB instance.
```javascript
// Verify database status before backup
db.adminCommand({ serverStatus: 1, repl: 1 });
// List all databases and their sizes
db.adminCommand({ listDatabases: 1 }).databases.forEach(d => {
print(`${d.name}: ${(d.sizeOnDisk / 1024 / 1024).toFixed(2)} MB`);
});
```
#### Full Backup with mongodump
```bash
# Full cluster backup with oplog for point-in-time recovery
mongodump --uri="mongodb+srv://cluster0.example.mongodb.net" \
--oplog \
--gzip \
--out=/backups/full/$(date +%Y%m%d_%H%M%S)
# Backup a single database
mongodump --uri="mongodb://localhost:27017" \
--db=production \
--gzip \
--out=/backups/db_production/$(date +%Y%m%d)
# Backup a single collection
mongodump --uri="mongodb://localhost:27017" \
--db=production \
--collection=orders \
--gzip \
--out=/backups/collection_orders/$(date +%Y%m%d)
```
#### Restore with mongorestore
```bash
# Full restore from a BSON dump
mongorestore --uri="mongodb://localhost:27017" \
--gzip \
--oplogReplay \
/backups/full/20260305_020000
# Restore a single database
mongorestore --uri="mongodb://localhost:27017" \
--db=production \
--gzip \
/backups/db_production/20260305/production
# Restore a single collection, dropping existing data
mongorestore --uri="mongodb://localhost:27017" \
--db=production \
--collection=orders \
--drop \
--gzip \
/backups/collection_orders/20260305/production/orders.bson.gz
```
### Filesystem Snapshots
For WiredTiger deployments, filesystem-level snapshots (LVM, EBS, ZFS) provide
fast, consistent backups when journaling is enabled.
Requirements:
- Journaling must be enabled (default for WiredTiger).
- The snapshot must capture the entire `dbPath` directory.
- For sharded clusters, stop the balancer and snapshot all shards and config servers.
```javascript
// Verify journaling is enabled
db.serverStatus().storageEngine;
// { "name": "wiredTiger", "supportsCommittedReads": true, ... }
// For sharded clusters, stop the balancer before snapshots
sh.stopBalancer();
// ... take filesystem snapshots ...
sh.startBalancer();
```
### MongoDB Atlas Continuous Backup
MongoDB Atlas provides fully managed backup with:
- **Continuous backups** with point-in-time restore granularity.
- **Cloud provider snapshots** taken at configurable intervals.
- **Snapshot retention policies** (hourly, daily, weekly, monthly).
- **Cross-region snapshot distribution** for disaster recovery.
Atlas backup requires no manual tooling. Snapshots are taken automatically
and can be restored through the Atlas UI or API.
## Recovery Point and Recovery Time Objectives
| Metric | Target | Strategy |
|--------|--------------|-------------------------------------------------|
| RPO | < 1 minute | Oplog-based continuous backup (Atlas) |
| RPO | < 1 hour | Hourly filesystem snapshots |
| RPO | < 24 hours | Daily mongodump with oplog |
| RTO | < 5 minutes | Replica set automatic failover |
| RTO | < 30 minutes | mongorestore from local BSON dump |
| RTO | < 2 hours | Atlas point-in-time restore to new cluster |
## Point-in-Time Recovery
### Oplog-Based Recovery
The oplog (operations log) is a capped collection that records all write operations.
Combined with a base backup, you can replay the oplog to restore to any specific
point in time.
```javascript
// Check oplog status
const oplogInfo = db.getSiblingDB("local").getCollection("oplog.rs").stats();
print("Oplog size:", (oplogInfo.maxSize / 1024 / 1024).toFixed(0), "MB");
print("Oplog used:", (oplogInfo.size / 1024 / 1024).toFixed(2), "MB");
// Find the oplog time window
const first = db.getSiblingDB("local").oplog.rs.find().sort({ $natural: 1 }).limit(1).next();
const last = db.getSiblingDB("local").oplog.rs.find().sort({ $natural: -1 }).limit(1).next();
print("Oplog window start:", first.ts);
print("Oplog window end:", last.ts);
```
```bash
# Restore base backup, then replay oplog to a specific timestamp
mongorestore --oplogReplay \
--oplogLimit="1709654400:1" \
--gzip \
/backups/full/20260305_020000
```
### Atlas Point-in-Time Restore
In MongoDB Atlas, point-in-time restore allows you to restore a cluster to
any second within the backup retention window. Atlas handles oplog replay
automatically.
## Replica Set Failover and Recovery
MongoDB replica sets provide automatic failover. When a primary becomes
unavailable, the remaining members hold an election to choose a new primary.
```javascript
// Check replica set health
rs.status().members.forEach(m => {
print(`${m.name} | state: ${m.stateStr} | health: ${m.health} | lag: ${m.optimeDate}`);
});
// Force a replica set member to become primary (for maintenance)
rs.stepDown(120); // Primary steps down for 120 seconds
// Check replication lag
rs.printSecondaryReplicationInfo();
```
### Failover Timeline
| Phase | Duration |
|--------------------------------|--------------|
| Failure detection | 5-10 seconds |
| Election initiation | ~2 seconds |
| New primary election | ~2 seconds |
| Driver reconnection | ~1-5 seconds |
| **Total automatic failover** | 10-20 seconds|
## Disaster Recovery
### Multi-Region Replica Set
Deploy replica set members across regions for geographic redundancy.
```javascript
// Example replica set config with multi-region members
rs.initiate({
_id: "rs-production",
members: [
{ _id: 0, host: "mongo-us-east-1:27017", priority: 10 },
{ _id: 1, host: "mongo-us-west-2:27017", priority: 5 },
{ _id: 2, host: "mongo-eu-west-1:27017", priority: 1 },
{ _id: 3, host: "mongo-us-east-1b:27017", priority: 0, hidden: true, tags: { role: "backup" } },
{ _id: 4, host: "mongo-us-east-1c:27017", arbiterOnly: true }
],
settings: {
getLastErrorDefaults: { w: "majority", wtimeout: 5000 }
}
});
```
### Backup Verification
Regularly test that backups are restorable.
```javascript
// After restoring to a test environment, verify data integrity
const collections = db.getCollectionNames();
collections.forEach(name => {
const count = db.getCollection(name).estimatedDocumentCount();
const indexes = db.getCollection(name).getIndexes().length;
print(`${name}: ${count} documents, ${indexes} indexes`);
});
// Validate a collection for internal consistency
db.orders.validate({ full: true });
```
### Backup Automation Script
```javascript
// Run from mongosh to log backup metadata
const backupRecord = {
timestamp: new Date(),
type: "full",
method: "mongodump",
databases: db.adminCommand({ listDatabases: 1 }).databases.map(d => ({
name: d.name,
sizeOnDisk: d.sizeOnDisk
})),
oplogPosition: db.getSiblingDB("local").oplog.rs.find().sort({ $natural: -1 }).limit(1).next().ts,
status: "completed"
};
db.getSiblingDB("admin").getCollection("backupLog").insertOne(backupRecord);
print("Backup record logged:", backupRecord.timestamp);
```
## Data Retention Policies
### Active Data
Document data is retained indefinitely unless explicitly removed. Documents
marked with a `deletedAt` field are retained for 90 days before permanent
removal via a TTL index or scheduled cleanup job.
```javascript
// Create a TTL index for automatic document expiration
db.sessionLogs.createIndex(
{ "expiresAt": 1 },
{ expireAfterSeconds: 0 }
);
```
### Logs and Audit Trails
- API request logs: 90 days
- Audit logs: 1 year (for compliance)
- Error logs: 30 days
## Best Practices
1. **Automate backups** on a schedule matching your RPO requirements.
2. **Always include the oplog** when using mongodump for point-in-time recovery.
3. **Test restores regularly.** A backup you have never restored is not a backup.
4. **Monitor oplog window size.** Ensure the oplog retains enough history for your needs.
5. **Use Atlas managed backups** when possible for automated snapshots and restore.
6. **Store backups in a different region** from your primary deployment.
7. **Encrypt backups at rest** using `--gzip` with filesystem-level encryption.
8. **Document your recovery runbook** and practice failover drills quarterly.