备份与恢复

MPCIUM 提供可靠的备份与恢复能力,确保分布式 MPC 集群的数据不会丢失。备份系统采用带加密的增量备份策略,在尽量减少资源占用的同时,高效地存储并保护数据库状态。

增量备份
Click to open the full-size diagram

重要:在生产环境中实施之前,请务必先在非生产环境中测试备份与恢复流程。

备份配置

MPCIUM 支持可配置的备份设置,可在 config.yaml 文件中进行调整:

备份配置

config.yaml
# Backup Configuration
backup_enabled: true                    # Enable/disable automatic backups (default: true)
backup_period_seconds: 300              # How often to perform backups in seconds (default: 300)
backup_dir: "./backups"                 # Directory where encrypted backups are stored

配置参数

backup_enabled (boolean)

控制是否执行自动备份。设置为 false 可完全禁用备份。

backup_period_seconds (integer)

定义两次自动备份之间的间隔(秒)。默认值 300 秒(5 分钟)在数据保护和系统性能之间取得了良好的平衡。

backup_dir (string)

指定加密备份文件的存储目录。请确保该目录具有适当的权限和足够的磁盘空间。

备份策略

MPCIUM 采用增量备份策略,仅高效存储自上次备份以来的变更,从而降低存储需求并缩短备份时间。这种方式确保每次备份都不会重复之前的备份内容,在保持完整数据保护的同时,大幅节省存储空间和网络带宽。

备份文件结构

备份文件存储在配置的备份目录中,命名规则如下:

node0/
└── backups/
    ├── backup-node0-2025-07-28_20-46-39-1.enc
    ├── backup-node0-2025-07-28_20-48-39-2.enc
    ├── backup-node0-2025-07-28_20-49-39-3.enc
    └── latest.version

备份文件格式

每个备份文件包含:

  • 自上次备份以来的增量数据库变更(而非完整副本)
  • 使用 AES-256-GCM 加密的数据库状态,确保传输和存储过程中的安全
  • 元数据,包括创建时间戳、加密参数和版本信息
  • 增量更新链,可据此重建并恢复完整的数据库状态

备份元数据示例

{
  "algo": "AES-256-GCM",
  "nonce_b64": "MgDMCSqKNujD+9na",
  "created_at": "2025-07-28T20:46:39+07:00",
  "since": 0,
  "next_since": 6,
  "encryption_key_id": "bd1937594bea2580"
}

安全性:备份文件使用与数据库加密相同的 badger_password 进行加密,确保备份数据在传输和存储过程中的安全。增量方式与加密相结合,兼顾了资源效率和数据保护。

恢复流程

使用 mpcium-cli recover

要从加密备份文件中恢复 MPCIUM 数据库,请使用 mpcium-cli recover 命令:

恢复命令

mpcium-cli
mpcium-cli recover --help

NAME:
   mpcium recover - Recover database from encrypted backup files

USAGE:
   mpcium recover [command [command options]]

OPTIONS:
   --backup-dir string, -b string             Directory containing encrypted backup files
   --recovery-path string, -r string          Target path for database recovery
   --backup-encryption-key string, -k string  Encryption key for backup files (will prompt if not provided)
   --force, -f                                Force overwrite if recovery path already exists (default: false)
   --help, -h                                 show help

恢复过程

  1. 停止 MPCIUM 节点,确保没有正在进行的数据库操作
  2. 使用合适的参数运行恢复命令
  3. 更新配置,使其指向恢复后的数据库
  4. 使用恢复后的数据重启节点
备份恢复

恢复示例

bash
# Step 1: Stop the MPCIUM node

# Step 2: Recover the database
mpcium-cli recover \
  --backup-dir backups/ \
  --recovery-path restore_db/node0

# Step 3: Update config.yaml
# Change db_path to: db_path: "restore_db"

# Step 4: Restart the node

mpcium start -n node0

AWS S3 集成

MPCIUM 支持使用 AWS S3 进行云端备份存储,提供额外的冗余和灾难恢复能力。

设置 S3 备份

1. 创建 S3 存储桶

创建 S3 存储桶

bash
aws s3 mb s3://node0-backup --region ap-southeast-1

2. 配置 S3 权限

请确保你的 AWS 凭证具有执行 S3 操作的相应权限:

S3 策略示例

json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:ListBucket",
        "s3:DeleteObject"
      ],
      "Resource": [
        "arn:aws:s3:::node0-backup",
        "arn:aws:s3:::node0-backup/*"
      ]
    }
  ]
}

S3 备份操作

将本地备份上传到 S3

上传到 S3

bash
# Sync local backup folder to S3
aws s3 sync ./backups s3://node0-backup

从 S3 下载备份

从 S3 下载

bash
# Sync from S3 to local folder
aws s3 sync s3://node0-backup ./backups

校验 S3 备份

校验 S3 内容

bash
# List S3 backup contents
aws s3 ls s3://node0-backup --recursive

# Check backup file details
aws s3api head-object --bucket node0-backup --key backup-node0-2025-07-28_20-46-39-1.enc

Former: Product Manager at TomoChain labs

自动备份

设置 Cron 任务

使用 cron 任务设置自动 S3 备份,确保定期同步到云端存储:

Cron 任务配置

bash
# Edit crontab
crontab -e

# Add backup job (runs every hour)
0 * * * * /usr/local/bin/backup-mpcium.sh

# Add daily backup verification
0 2 * * * /usr/local/bin/verify-backup.sh

备份脚本示例

创建一个备份脚本,自动执行 S3 同步过程:

备份脚本

bash
#!/bin/bash
# /usr/local/bin/backup-mpcium.sh

# Configuration
NODE_NAME="node0"
S3_BUCKET="node0-backup"
BACKUP_DIR="/opt/mpcium/node0/backups"
LOG_FILE="/var/log/mpcium-backup.log"

# Log function
log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
}

# Start backup
log "Starting MPCIUM backup to S3"

# Sync local backups to S3
if aws s3 sync "$BACKUP_DIR" "s3://$S3_BUCKET" --delete; then
    log "Backup completed successfully"
else
    log "Backup failed"
    exit 1
fi

# Verify backup
if aws s3 ls "s3://$S3_BUCKET" | grep -q "backup-$NODE_NAME"; then
    log "Backup verification successful"
else
    log "Backup verification failed"
    exit 1
fi

校验脚本

创建一个用于校验备份完整性的脚本:

校验脚本

bash
#!/bin/bash
# /usr/local/bin/verify-backup.sh

# Configuration
S3_BUCKET="node0-backup"
LOG_FILE="/var/log/mpcium-backup-verify.log"

# Log function
log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
}

# Check S3 bucket accessibility
if aws s3 ls "s3://$S3_BUCKET" > /dev/null 2>&1; then
    log "S3 bucket accessible"
else
    log "S3 bucket not accessible"
    exit 1
fi

# Count backup files
BACKUP_COUNT=$(aws s3 ls "s3://$S3_BUCKET" --recursive | grep -c "\.enc$")
log "Found $BACKUP_COUNT backup files in S3"

# Check for recent backups (within last 24 hours)
RECENT_BACKUPS=$(aws s3 ls "s3://$S3_BUCKET" --recursive | grep "$(date '+%Y-%m-%d')" | wc -l)
log "Found $RECENT_BACKUPS backups from today"

if [ "$RECENT_BACKUPS" -eq 0 ]; then
    log "WARNING: No recent backups found"
    exit 1
fi

监控与告警

为备份流程设置监控:

监控设置

bash
# Check backup script exit status
if [ $? -ne 0 ]; then
    # Send alert (example with curl to webhook)
    curl -X POST -H "Content-Type: application/json" \
         -d '{"text":"MPCIUM backup failed"}' \
         https://your-webhook-url.com/alert
fi

最佳实践:定期在测试环境中测试备份与恢复流程,确保在需要时能够正常工作。