Version: 1.0
Last Updated: April 2026
Document Owner: Operations Team
Review Cycle: Quarterly
- Executive Summary
- Recovery Objectives
- Backup Strategy
- Recovery Procedures
- Disaster Scenarios
- Testing & Validation
- Communication Plan
- Roles & Responsibilities
This Disaster Recovery Plan (DRP) defines procedures to restore ThemisDB operations in the event of a disaster. The plan establishes Recovery Time Objectives (RTO) and Recovery Point Objectives (RPO) for different failure scenarios and provides step-by-step recovery procedures.
- Automated Backups: Continuous incremental backups with point-in-time recovery
- Geographic Redundancy: Multi-region replication for critical data
- Regular Testing: Quarterly DR drills to validate recovery procedures
- Clear Communication: Defined escalation paths and stakeholder notifications
RTO defines the maximum acceptable time to restore service after a disaster.
| Disaster Scenario | Target RTO | Maximum Acceptable RTO |
|---|---|---|
| Single Node Failure | 5 minutes | 15 minutes |
| Data Center Outage | 30 minutes | 2 hours |
| Regional Disaster | 2 hours | 4 hours |
| Complete Data Loss | 4 hours | 8 hours |
| Ransomware Attack | 6 hours | 12 hours |
RPO defines the maximum acceptable data loss measured in time.
| Disaster Scenario | Target RPO | Maximum Acceptable RPO |
|---|---|---|
| Single Node Failure | 0 seconds (no data loss) | 5 seconds |
| Data Center Outage | 5 seconds | 30 seconds |
| Regional Disaster | 1 minute | 5 minutes |
| Complete Data Loss | 15 minutes | 1 hour |
| Ransomware Attack | 1 hour | 24 hours |
| Metric | Target | Measurement |
|---|---|---|
| Annual Availability | 99.95% | ~4.4 hours downtime/year |
| Monthly Availability | 99.9% | ~43 minutes downtime/month |
| Mean Time to Detect (MTTD) | < 2 minutes | Monitoring alerts |
| Mean Time to Recover (MTTR) | < 30 minutes | Incident resolution |
- Frequency: Real-time
- Method: Asynchronous replication to standby nodes
- RPO: < 5 seconds
- Use Case: High availability, failover
- Frequency: Every 15 minutes
- Method: RocksDB checkpoint + WAL archival
- RPO: 15 minutes
- Retention: 24 hours (96 snapshots)
- Frequency: Daily at 02:00 UTC
- Method: Complete database snapshot
- RPO: 24 hours
- Retention: 30 days
- Frequency: Weekly (Sunday 03:00 UTC)
- Method: Compressed full backup
- RPO: 7 days
- Retention: 1 year (52 backups)
Primary Backup Location:
Provider: S3-compatible object storage
Region: Primary region + 1
Encryption: AES-256-GCM at rest
Lifecycle: Automated retention policies
Secondary Backup Location:
Provider: S3-compatible object storage
Region: Geographic redundant region
Encryption: AES-256-GCM at rest
Lifecycle: Mirrored from primary
Cold Storage Archive:
Provider: Glacier/Archive storage
Retention: 7 years
Compliance: GDPR, SOC 2, HIPAAAll backups are automatically verified:
# Automated backup verification (runs after each backup)
themisdb-cli backup verify \
--backup-id <backup-id> \
--check-integrity \
--check-consistency \
--sample-restore
# Expected verification checks:
# ✓ Checksum validation
# ✓ File integrity check
# ✓ Metadata validation
# ✓ Sample data restore test
# ✓ Corruption detectionScenario: One database node fails in a multi-node cluster
RTO: 5 minutes | RPO: 0 seconds
# Monitoring alert triggers
ALERT NodeDown
IF up{job="themisdb"} == 0
FOR 1m
LABELS { severity="critical" }-
Assess Impact (< 1 minute)
# Check cluster status themisdb-cli cluster status # Verify other nodes healthy themisdb-cli health --all-nodes
-
Automatic Failover (< 2 minutes)
- Load balancer automatically routes traffic to healthy nodes
- Cluster rebalances shard assignments
- No manual intervention required
-
Replace Failed Node (< 2 minutes)
# Start replacement node kubectl scale deployment themisdb --replicas=3 # Node automatically joins cluster # Data replication begins automatically
-
Verify Recovery (< 1 minute)
# Confirm cluster health themisdb-cli cluster status # Expected: All nodes HEALTHY, all shards balanced # Run health check curl http://load-balancer/health # Expected: HTTP 200 OK
Success Criteria:
- All nodes reporting healthy
- All shards balanced
- No client-visible errors
- Replication caught up
Scenario: Complete data center loss
RTO: 30 minutes | RPO: 5 seconds
# Multi-node failure in same availability zone
ALERT DataCenterDown
IF count(up{job="themisdb", az="us-east-1a"} == 0) > 2
FOR 2m
LABELS { severity="critical" }-
Declare Disaster (< 5 minutes)
# Incident commander assesses situation # Confirm: Multiple nodes down in same DC # Decision: Activate DR plan # Notify stakeholders themisdb-cli incident declare \ --type datacenter_failure \ --severity critical \ --notify all
-
Activate Secondary Region (< 10 minutes)
# Promote secondary region to primary themisdb-cli failover promote \ --region us-west-2 \ --force \ --verify-data-consistency # Update DNS to point to new region aws route53 change-resource-record-sets \ --hosted-zone-id Z1234567890ABC \ --change-batch file://dns-failover.json # Expected output: # ✓ Secondary region promoted to primary # ✓ All shards active # ✓ DNS updated (TTL: 60s) # ✓ Traffic routing to new region
-
Verify Application Connectivity (< 5 minutes)
# Test from multiple locations for region in us-west eu-west ap-south; do curl https://themisdb.$region.example.com/health done # Run synthetic transactions themisdb-cli test synthetic-transactions \ --workload production \ --duration 5m
-
Monitor Recovery (< 10 minutes)
# Watch key metrics themisdb-cli monitor \ --metrics qps,latency,errors \ --duration 10m \ --alert-on-anomaly # Expected: Metrics return to normal within 10 minutes
Success Criteria:
- Secondary region serving all traffic
- < 5 seconds data loss
- All clients reconnected
- Performance within 10% of baseline
Scenario: Data corruption or logical error detected
RTO: 2 hours | RPO: 15 minutes
- Accidental data deletion
- Application bug corrupted data
- Malicious data modification
- Schema migration gone wrong
-
Identify Corruption Window (< 15 minutes)
# Analyze audit logs themisdb-cli audit query \ --start "2026-01-24T00:00:00Z" \ --end "2026-01-24T06:00:00Z" \ --user admin \ --action DELETE # Find last known good state themisdb-cli backup list \ --before "2026-01-24T05:00:00Z" \ --verified-only
-
Create Current State Snapshot (< 10 minutes)
# Preserve current state for forensics themisdb-cli backup create \ --type full \ --label "before-restore-$(date +%Y%m%d-%H%M%S)" \ --priority high
-
Restore to Point-in-Time (< 60 minutes)
# Perform PITR to last good snapshot themisdb-cli restore pitr \ --target "2026-01-24T04:45:00Z" \ --backup-id backup-20260124-0430 \ --verify-consistency \ --dry-run # Review dry-run results # If acceptable, execute restore: themisdb-cli restore pitr \ --target "2026-01-24T04:45:00Z" \ --backup-id backup-20260124-0430 \ --verify-consistency \ --execute
-
Verify Data Integrity (< 20 minutes)
# Run data validation themisdb-cli validate database \ --check-indexes \ --check-constraints \ --check-references # Compare key metrics themisdb-cli metrics compare \ --baseline backup-20260124-0430 \ --current now \ --tolerance 1%
-
Resume Operations (< 15 minutes)
# Bring database back online themisdb-cli maintenance-mode disable # Notify stakeholders themisdb-cli incident update \ --status resolved \ --notify all
Success Criteria:
- Data restored to target timestamp
- All integrity checks pass
- No data inconsistencies
- Applications functioning normally
Scenario: Ransomware attack detected
RTO: 6 hours | RPO: 1 hour
# Unusual patterns detected
ALERT RansomwareSuspected
IF (
rate(themisdb_delete_operations[5m]) > 1000 OR
rate(themisdb_encryption_failures[5m]) > 10
)
FOR 5m
LABELS { severity="critical" }-
Immediate Isolation (< 5 minutes)
# Isolate affected systems themisdb-cli security isolate \ --node all \ --block-external \ --preserve-forensics # Disable all user access themisdb-cli security revoke-all-tokens # Alert security team themisdb-cli incident declare \ --type security_breach \ --severity critical \ --notify security-team
-
Assess Damage (< 30 minutes)
# Identify affected data themisdb-cli security scan \ --check-integrity \ --check-encryption \ --output /security/scan-results.json # Find last clean backup themisdb-cli backup find-clean \ --before-incident \ --verify-integrity
-
Rebuild from Clean Backup (< 4 hours)
# Deploy new infrastructure (immutable) kubectl create namespace themisdb-recovery helm install themisdb-clean ./helm/themisdb \ --namespace themisdb-recovery \ --set security.hardened=true # Restore from verified clean backup themisdb-cli restore \ --backup-id <last-clean-backup> \ --namespace themisdb-recovery \ --verify-integrity \ --scan-malware
-
Security Hardening (< 1 hour)
# Apply security patches themisdb-cli security patch-all # Rotate all credentials themisdb-cli security rotate-credentials --all # Enable enhanced monitoring themisdb-cli security enable-enhanced-monitoring
-
Gradual Restoration (< 30 minutes)
# Bring services online with restricted access themisdb-cli service start --restricted-mode # Whitelist verified clients only themisdb-cli security allow-client \ --verified-only \ --require-mfa
Success Criteria:
- Clean database restored
- No malware detected
- All credentials rotated
- Enhanced security active
- Forensics preserved
| Scenario | Likelihood | Impact | RTO | RPO | Primary Response |
|---|---|---|---|---|---|
| Single node failure | High | Low | 5 min | 0 sec | Auto-failover |
| AZ failure | Medium | Medium | 30 min | 5 sec | Region failover |
| Region failure | Low | High | 2 hr | 1 min | DR site activation |
| Data corruption | Medium | Medium | 2 hr | 15 min | PITR restore |
| Ransomware | Low | High | 6 hr | 1 hr | Isolation + rebuild |
| Hardware failure | High | Low | 15 min | 0 sec | Replace + resync |
| Network partition | Medium | Medium | 10 min | 5 sec | Route around |
| DDoS attack | Medium | Low | 5 min | 0 sec | Rate limiting + CDN |
- Backup verification
- Restore test (non-production)
- Failover simulation
- Monitoring validation
- Full DR drill
- Cross-region failover
- Complete restore test
- Team readiness assessment
- Disaster simulation exercise
- Multi-scenario testing
- Communication plan validation
- Documentation review
#!/bin/bash
# Monthly backup verification script
# 1. List recent backups
themisdb-cli backup list --last 30-days
# 2. Select random backup
BACKUP_ID=$(themisdb-cli backup list --last 30-days --format json | jq -r '.[0].id')
# 3. Verify backup
themisdb-cli backup verify --backup-id $BACKUP_ID
# 4. Test restore to staging
themisdb-cli restore \
--backup-id $BACKUP_ID \
--target staging \
--verify
# 5. Run validation queries
themisdb-cli test queries \
--environment staging \
--suite smoke-tests
# 6. Generate report
themisdb-cli test report \
--output /reports/dr-test-$(date +%Y%m%d).html#!/bin/bash
# Quarterly full DR drill
echo "=== DR DRILL: $(date) ==="
# 1. Simulate disaster
echo "Step 1: Simulating data center failure..."
themisdb-cli test simulate-disaster \
--type datacenter-failure \
--region us-east-1
# 2. Activate DR procedures
echo "Step 2: Activating DR procedures..."
themisdb-cli failover promote \
--region us-west-2 \
--test-mode
# 3. Validate recovery
echo "Step 3: Validating recovery..."
themisdb-cli test synthetic-transactions \
--duration 15m \
--target dr-region
# 4. Measure metrics
echo "Step 4: Measuring RTO/RPO..."
themisdb-cli test measure-recovery \
--output /reports/dr-drill-metrics.json
# 5. Restore to normal
echo "Step 5: Restoring to normal operations..."
themisdb-cli failover restore \
--region us-east-1
# 6. Generate report
echo "Step 6: Generating report..."
themisdb-cli test report \
--type dr-drill \
--output /reports/dr-drill-$(date +%Y%m%d).pdf| Severity | Initial Response | Escalation (15 min) | Escalation (30 min) |
|---|---|---|---|
| P0 - Critical | On-call engineer | Engineering manager | CTO + CEO |
| P1 - High | On-call engineer | Engineering manager | VP Engineering |
| P2 - Medium | On-call engineer | Team lead | Engineering manager |
| P3 - Low | On-call engineer | - | - |
Subject: [P0 CRITICAL] ThemisDB Disaster - [SCENARIO]
Status: DISASTER IN PROGRESS
Severity: P0 - Critical
RTO: [X hours]
RPO: [Y minutes]
IMPACT:
- [Description of impact]
- [Affected services]
- [Estimated user impact]
CURRENT STATUS:
- Detection time: [HH:MM UTC]
- DR procedures activated: [HH:MM UTC]
- Expected recovery: [HH:MM UTC]
ACTIONS TAKEN:
- [Action 1]
- [Action 2]
NEXT STEPS:
- [Next step 1]
- [Next step 2]
Incident Commander: [Name]
War Room: [URL/Bridge number]
Updates will be provided every 15 minutes.
| Stakeholder | Timing | Method | Content |
|---|---|---|---|
| Internal team | Immediate | Slack + Email | Technical details |
| Management | < 15 min | Email + Call | Business impact |
| Customers | < 30 min | Status page | Service status |
| Partners | < 1 hour | Impact assessment |
- Declares disaster
- Coordinates recovery effort
- Makes key decisions
- Communicates with stakeholders
- Executes recovery procedures
- Validates technical steps
- Monitors system health
- Reports to Incident Commander
- Manages backup/restore
- Verifies data integrity
- Optimizes recovery process
- Documents technical details
- Drafts status updates
- Notifies stakeholders
- Manages status page
- Coordinates with PR/Legal
- Assesses security impact
- Conducts forensics
- Implements hardening
- Coordinates with security team
Incident Commander: [Name] - [Phone] - [Email]
Technical Lead: [Name] - [Phone] - [Email]
DBA On-Call: [Phone] - [PagerDuty]
Security Team: [Email] - [Phone]
Management: [Email] - [Phone]
Cloud Provider Support: [Phone] - [Ticket Portal]
Production Environment:
- Cluster ID: prod-cluster-001
- Primary Region: us-east-1
- DR Region: us-west-2
- Backup Location: s3://themisdb-backups
- Monitoring: https://grafana.example.com
Access Credentials:
- Vault Path: /secret/themisdb/dr
- Break-glass Account: dr-admin@example.com
- Emergency Access: [Documentation link]
- RTO/RPO targets still appropriate
- Backup retention periods sufficient
- Contact information up to date
- Recovery procedures tested
- Infrastructure changes documented
- Compliance requirements met
- Team training completed
- DR budget allocated
| Version | Date | Author | Changes |
|---|---|---|---|
| 1.0 | 2026-01-24 | Operations Team | Initial version |
| Role | Name | Signature | Date |
|---|---|---|---|
| CTO | |||
| VP Engineering | |||
| Security Officer | |||
| Compliance Officer |
Next Review Date: 2026-04-24
Document Classification: Internal - Confidential
Retention Period: 7 years