Storage Replication
PiVirt supports flexible block and filesystem storage replication strategies to safeguard data against hardware failures, network partitioning, and site-wide outages.
Replication Types
Section titled “Replication Types”Synchronous Replication
Section titled “Synchronous Replication”sequenceDiagram
participant Primary as Primary Site
participant Secondary as Secondary Site
Primary->>Secondary: Write I/O (replicate)
Secondary-->>Primary: ACK (committed)
Note over Primary,Secondary: Write committed on both sites (RPO = 0)
Pros:
- Zero data loss (RPO = 0)
- Consistent state
Cons:
- Higher latency
- Requires low-latency network
Asynchronous Replication
Section titled “Asynchronous Replication”sequenceDiagram
participant Primary as Primary Site
participant Secondary as Secondary Site
Primary->>Primary: Write I/O (committed immediately)
Primary-->>Secondary: Async copy (background)
Note over Secondary: Write applied eventually
Pros:
- Lower latency
- Works over long distances
Cons:
- Potential data loss (RPO > 0)
- Inconsistent state during failure
Semi-Synchronous Replication
Section titled “Semi-Synchronous Replication”sequenceDiagram
participant Primary as Primary Site
participant Secondary as Secondary Site
Primary->>Primary: Write I/O (committed)
Note over Primary: Buffer writes in batch
Primary-->>Secondary: Batch copy (periodic flush)
Secondary-->>Primary: ACK batch
Pros:
- Balance between latency and data loss
- Configurable RPO
iSCSI Replication
Section titled “iSCSI Replication”LIO Target with Replication
Section titled “LIO Target with Replication”target: backend: "lio" replication: enabled: true mode: "async" # sync, async, semi-sync target_iqn: "iqn.2024-01.hu.pilab:replica" target_portal: "10.0.2.10:3260" bandwidth_limit_mbps: 1000 compression: trueDRBD Replication
Section titled “DRBD Replication”# Install DRBDapt-get install -y drbd-utils
# Configure DRBD resourcecat > /etc/drbd.d/pivirt-data.res <<EOFresource pivirt-data { protocol C; # Synchronous
on node-01 { device /dev/drbd0; disk /dev/sdb1; address 10.0.1.10:7789; meta-disk internal; }
on node-02 { device /dev/drbd0; disk /dev/sdb1; address 10.0.1.11:7789; meta-disk internal; }}EOF
# Initialize and startdrbdadm create-md pivirt-datadrbdadm up pivirt-datadrbdadm primary pivirt-data --forceOCFS2 Replication
Section titled “OCFS2 Replication”Cluster Filesystem with Replication
Section titled “Cluster Filesystem with Replication”cluster: name: "pivirt-cluster" replication: enabled: true mode: "async" target_cluster: "pivirt-dr" target_nodes: - "10.0.2.10" - "10.0.2.11" bandwidth_limit_mbps: 1000 compression: true encryption: trueSnapshot-Based Replication
Section titled “Snapshot-Based Replication”# Create snapshotpvcli storage snapshot create --volume data-01 --name "replica-snapshot"
# Replicate snapshot to secondary sitepvcli storage snapshot replicate \ --volume data-01 \ --snapshot "replica-snapshot" \ --target-site dr-site \ --target-volume data-01-drCeph RBD Replication
Section titled “Ceph RBD Replication”Ceph RBD Mirror
Section titled “Ceph RBD Mirror”# Enable RBD mirroringrbd mirror pool enable pivirt-data pool
# Add peerrbd mirror pool peer add pivirt-data client.admin@remote-cluster
# Enable image mirroringrbd mirror image enable pivirt-data/vm-disk-01 snapshot
# Check mirror statusrbd mirror image status pivirt-data/vm-disk-01Ceph Configuration
Section titled “Ceph Configuration”[global]fsid = 12345678-1234-1234-1234-123456789abcmon_host = 10.0.1.10, 10.0.1.11, 10.0.1.12
[client.rbd.mirror]rbd mirror pool = pivirt-datarbd mirror mode = snapshotrbd mirror snapshot interval = 60NFS Replication
Section titled “NFS Replication”NFS with rsync
Section titled “NFS with rsync”# Create replication scriptcat > /usr/local/bin/nfs-replicate.sh <<'EOF'#!/bin/bashSOURCE="/mnt/nfs-primary"TARGET="backup@10.0.2.10:/mnt/nfs-secondary"LOG="/var/log/nfs-replication.log"
rsync -avz --delete \ --exclude=".snapshot*" \ "$SOURCE/" "$TARGET/" \ >> "$LOG" 2>&1EOF
chmod +x /usr/local/bin/nfs-replicate.sh
# Schedule with cronecho "0 * * * * /usr/local/bin/nfs-replicate.sh" | crontab -NFS with Snapshots
Section titled “NFS with Snapshots”# Create NFS snapshotssh nfs-server "zfs snapshot tank/pivirt@$(date +%Y%m%d-%H%M%S)"
# Replicate snapshotssh nfs-server "zfs send tank/pivirt@latest | ssh backup-server zfs receive -F tank/pivirt-dr"Monitoring Replication
Section titled “Monitoring Replication”Replication Status
Section titled “Replication Status”# Check iSCSI replication statuspvcli storage replication status
# Check DRBD statusdrbd-overview
# Check Ceph RBD mirror statusrbd mirror image status pivirt-data/vm-disk-01Replication Metrics
Section titled “Replication Metrics”# View replication metricscurl http://localhost:9003/metrics | grep replication
# Key metrics:# iscsiman_replication_lag_seconds{volume="data-01"} 5# iscsiman_replication_bytes_total{volume="data-01"} 1073741824# iscsiman_replication_status{volume="data-01",status="healthy"} 1Prometheus Alerts
Section titled “Prometheus Alerts”groups: - name: pivirt.replication.rules rules: - alert: PivirtReplicationLagHigh expr: iscsiman_replication_lag_seconds > 60 for: 5m labels: severity: warning annotations: summary: "Replication lag > 60s for {{ $labels.volume }}"
- alert: PivirtReplicationFailed expr: iscsiman_replication_status{status="failed"} == 1 for: 1m labels: severity: critical annotations: summary: "Replication failed for {{ $labels.volume }}"Troubleshooting
Section titled “Troubleshooting”Replication Lag
Section titled “Replication Lag”# Check network bandwidthiperf3 -c target-site
# Check replication statuspvcli storage replication status
# Increase bandwidth limitpvcli storage replication update \ --volume data-01 \ --bandwidth-limit 10000Replication Failed
Section titled “Replication Failed”# Check logsjournalctl -u iscsiman -f | grep -i replicat
# Check network connectivitync -zv target-site 3260
# Restart replicationpvcli storage replication restart --volume data-01Data Inconsistency
Section titled “Data Inconsistency”# Verify data integritypvcli storage volume verify data-01
# Resync from primarypvcli storage replication resync --volume data-01 --forceBest Practices
Section titled “Best Practices”1. Choose Right Replication Mode
Section titled “1. Choose Right Replication Mode”| Use Case | Recommended Mode |
|---|---|
| Zero data loss required | Synchronous |
| Low latency required | Asynchronous |
| Balance between RPO and latency | Semi-synchronous |
2. Monitor Proactively
Section titled “2. Monitor Proactively”- Set up alerts for replication lag
- Monitor bandwidth utilization
- Track replication success rate
3. Test Failover Regularly
Section titled “3. Test Failover Regularly”- Test failover procedures
- Verify data consistency
- Measure RTO and RPO
4. Document Procedures
Section titled “4. Document Procedures”- Document failover procedures
- Document recovery procedures
- Keep runbooks up to date