备份与恢复 #
一、备份概述 #
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
恢复测试建议:
频率
├── 开发环境:每月
├── 测试环境:每季度
└── 生产环境:每半年
测试内容
├── 完整恢复流程
├── 部分数据恢复
├── 时间点恢复
└── 跨集群恢复
记录
├── 恢复时间
├── 遇到的问题
└── 改进措施
七、总结 #
备份与恢复要点:
- 快照备份:全量备份,快速创建
- 增量备份:节省空间,频繁备份
- 恢复方法:refresh、sstableloader
- 备份策略:定期、异地、验证
- 自动化脚本:定期执行备份
- 恢复测试:定期验证备份有效性
下一步,让我们学习性能优化!
最后更新:2026-03-27