备份与恢复 #

一、备份概述 #

1.1 备份类型 #

类型 描述 特点
快照备份 全量数据快照 完整、快速
增量备份 增量数据备份 节省空间
提交日志 写入日志备份 支持时间点恢复

1.2 备份策略 #

text
备份策略建议:

开发环境
├── 快照备份:每周
└── 保留:2周

测试环境
├── 快照备份:每天
├── 增量备份:每4小时
└── 保留:1个月

生产环境
├── 快照备份:每天
├── 增量备份:每小时
├── 提交日志归档:实时
└── 保留:3个月+

二、快照备份 #

2.1 创建快照 #

bash
# 创建所有键空间快照
nodetool snapshot

# 创建特定键空间快照
nodetool snapshot my_keyspace

# 创建特定表快照
nodetool snapshot my_keyspace -t my_table

# 创建带标签的快照
nodetool snapshot -t backup_20240115

# 输出示例
Requested creating snapshot(s) for [my_keyspace] with snapshot options [skipFlush=false] and snapshot name [backup_20240115]
Snapshot directory: backup_20240115

2.2 快照位置 #

text
快照存储位置:

/var/lib/cassandra/data/my_keyspace/my_table-xxx/snapshots/
└── backup_20240115/
    ├── manifest.json
    ├── schema.cql
    └── *.db files

2.3 查看快照 #

bash
# 列出所有快照
nodetool listsnapshots

# 输出示例
Snapshot Details:
Snapshot name  Keyspace name  Column family name  True size  Size on disk
backup_20240115 my_keyspace   my_table            100 MB     100 MB

2.4 删除快照 #

bash
# 删除所有快照
nodetool clearsnapshot

# 删除特定快照
nodetool clearsnapshot -t backup_20240115

# 删除特定键空间的快照
nodetool clearsnapshot my_keyspace

三、增量备份 #

3.1 启用增量备份 #

yaml
# cassandra.yaml
incremental_backups: true

3.2 增量备份位置 #

text
增量备份位置:

/var/lib/cassandra/data/my_keyspace/my_table-xxx/backups/
└── *.db files

3.3 增量备份管理 #

bash
# 增量备份文件会持续累积
# 需要定期清理或归档

# 归档增量备份
cp -r /var/lib/cassandra/data/*/backups /backup/incremental_$(date +%Y%m%d)

# 清理增量备份
rm -rf /var/lib/cassandra/data/*/backups/*

四、恢复操作 #

4.1 从快照恢复 #

bash
# 1. 停止写入(可选但推荐)

# 2. 删除现有数据
rm -rf /var/lib/cassandra/data/my_keyspace/my_table-xxx/*.db

# 3. 复制快照数据
cp /var/lib/cassandra/data/my_keyspace/my_table-xxx/snapshots/backup_20240115/*.db \
   /var/lib/cassandra/data/my_keyspace/my_table-xxx/

# 4. 刷新节点
nodetool refresh my_keyspace my_table

# 5. 验证数据
cqlsh -e "SELECT COUNT(*) FROM my_keyspace.my_table"

4.2 使用sstableloader恢复 #

bash
# 1. 准备快照数据
# 将快照复制到临时目录

# 2. 使用sstableloader加载
sstableloader -d 192.168.1.1,192.168.1.2,192.168.1.3 \
    /path/to/snapshot/my_keyspace/my_table

# 参数说明
# -d: 目标节点列表
# -u: 用户名
# -pw: 密码
# -ts: 传输速度限制

4.3 恢复特定数据 #

bash
# 恢复单个表
nodetool refresh my_keyspace my_table

# 恢复特定分区(需要手动过滤)
# 1. 使用sstable2json导出
sstable2json /path/to/sstable.db > data.json

# 2. 过滤需要的分区
jq 'select(.key == "partition_key")' data.json > filtered.json

# 3. 使用json2sstable导入
json2sstable -s -K my_keyspace -c my_table filtered.json /path/to/new_sstable.db

五、完整备份脚本 #

5.1 备份脚本 #

bash
#!/bin/bash
# backup_cassandra.sh

KEYSPACE=$1
BACKUP_DIR="/backup/cassandra"
DATE=$(date +%Y%m%d_%H%M%S)
SNAPSHOT_NAME="backup_${DATE}"

# 创建备份目录
mkdir -p ${BACKUP_DIR}/${SNAPSHOT_NAME}

# 创建快照
echo "Creating snapshot..."
nodetool snapshot ${KEYSPACE} -t ${SNAPSHOT_NAME}

# 复制快照到备份目录
echo "Copying snapshot..."
for ks_dir in /var/lib/cassandra/data/${KEYSPACE}*; do
    if [ -d "$ks_dir" ]; then
        ks_name=$(basename $ks_dir | cut -d'-' -f1)
        cp -r ${ks_dir}/snapshots/${SNAPSHOT_NAME} \
              ${BACKUP_DIR}/${SNAPSHOT_NAME}/${ks_name}/
    fi
done

# 备份schema
echo "Backing up schema..."
cqlsh -e "DESCRIBE KEYSPACE ${KEYSPACE}" > ${BACKUP_DIR}/${SNAPSHOT_NAME}/schema.cql

# 清理本地快照
echo "Clearing local snapshot..."
nodetool clearsnapshot -t ${SNAPSHOT_NAME}

# 压缩备份
echo "Compressing backup..."
tar -czf ${BACKUP_DIR}/${SNAPSHOT_NAME}.tar.gz -C ${BACKUP_DIR} ${SNAPSHOT_NAME}
rm -rf ${BACKUP_DIR}/${SNAPSHOT_NAME}

# 删除旧备份(保留30天)
find ${BACKUP_DIR} -name "backup_*.tar.gz" -mtime +30 -delete

echo "Backup completed: ${BACKUP_DIR}/${SNAPSHOT_NAME}.tar.gz"

5.2 恢复脚本 #

bash
#!/bin/bash
# restore_cassandra.sh

BACKUP_FILE=$1
KEYSPACE=$2
TEMP_DIR="/tmp/cassandra_restore"

# 解压备份
echo "Extracting backup..."
mkdir -p ${TEMP_DIR}
tar -xzf ${BACKUP_FILE} -C ${TEMP_DIR}

BACKUP_DIR=$(ls ${TEMP_DIR})

# 恢复schema
echo "Restoring schema..."
cqlsh -f ${TEMP_DIR}/${BACKUP_DIR}/schema.cql

# 恢复数据
echo "Restoring data..."
for table_dir in ${TEMP_DIR}/${BACKUP_DIR}/*; do
    if [ -d "$table_dir" ]; then
        table_name=$(basename $table_dir)
        echo "Restoring table: ${table_name}"
        
        # 使用sstableloader
        sstableloader -d localhost ${table_dir}
    fi
done

# 清理临时文件
rm -rf ${TEMP_DIR}

echo "Restore completed"

六、备份最佳实践 #

6.1 备份策略 #

text
备份策略建议:

1. 定期快照
   └── 每天至少一次

2. 增量备份
   └── 每小时或每4小时

3. 异地备份
   └── 复制到远程存储

4. 验证备份
   └── 定期测试恢复

5. 保留策略
   └── 根据合规要求设置

6.2 恢复测试 #

text
恢复测试建议:

频率
├── 开发环境:每月
├── 测试环境:每季度
└── 生产环境:每半年

测试内容
├── 完整恢复流程
├── 部分数据恢复
├── 时间点恢复
└── 跨集群恢复

记录
├── 恢复时间
├── 遇到的问题
└── 改进措施

七、总结 #

备份与恢复要点:

  1. 快照备份:全量备份,快速创建
  2. 增量备份:节省空间,频繁备份
  3. 恢复方法:refresh、sstableloader
  4. 备份策略:定期、异地、验证
  5. 自动化脚本:定期执行备份
  6. 恢复测试:定期验证备份有效性

下一步,让我们学习性能优化!

最后更新:2026-03-27