1. 首页 > Cassandra教程 > 正文

Cassandra教程FG012-Cassandra备份恢复实战

本文档风哥主要介绍Cassandra数据库备份恢复实战,包括备份概述、备份类型、备份策略、备份计划制定、备份存储规划、备份验证策略、快照备份实战、快照恢复实战、自动化备份脚本、全量备份实战、增量备份实战、灾难恢复实战等内容,风哥教程参考Cassandra官方文档Backup and Restore内容编写,适合DBA人员和开发人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。

Part01-基础概念与理论知识

1.1 Cassandra数据库备份概述

Cassandra数据库备份是保证数据安全的关键措施,通过备份可以在数据丢失或损坏时恢复数据。更多视频教程www.fgedu.net.cn

1.1.1 Cassandra数据库备份重要性

# 备份重要性

# 1. 数据保护
– 防止数据丢失
– 应对硬件故障
– 处理人为错误
– 防范安全威胁

# 2. 合规要求
– 数据保留政策
– 审计要求
– 行业规范
– 法律法规

# 3. 业务连续性
– 快速恢复业务
– 减少停机时间
– 降低业务损失
– 保证服务质量

# 4. 灾难恢复
– 应对自然灾害
– 处理重大故障
– 数据中心故障
– 跨地域恢复

# 备份目标
# RPO (Recovery Point Objective)
– 恢复点目标
– 可接受的数据丢失量
– 决定备份频率

# RTO (Recovery Time Objective)
– 恢复时间目标
– 可接受的恢复时间
– 决定恢复策略

# 典型RPO/RTO要求
场景 | RPO | RTO
————-|————|————
关键业务 | 1小时 | 1小时
重要业务 | 4小时 | 4小时
一般业务 | 24小时 | 24小时
归档数据 | 7天 | 72小时

1.1.2 Cassandra数据库备份原理

# 备份原理

# 1. 快照备份原理
# 基于SSTable的备份
– 创建硬链接指向SSTable文件
– 不复制实际数据
– 备份速度快
– 占用空间小(增量时)

# 快照特点
– 一致性备份
– 不阻塞读写
– 需要足够磁盘空间
– 需要手动清理

# 2. 增量备份原理
# 基于提交日志的备份
– 备份提交日志段文件
– 记录数据变更
– 备份粒度细
– 恢复时间长

# 增量备份特点
– 备份数据量小
– 备份频率高
– 恢复需要全量+增量
– 管理复杂度高

# 3. 备份流程
# 快照备份流程
1. 刷新Memtable到磁盘
2. 创建SSTable硬链接
3. 记录快照元数据
4. 验证快照完整性

# 增量备份流程
1. 启用增量备份
2. 监控提交日志
3. 归档提交日志段
4. 定期清理旧备份

# 4. 恢复流程
# 快照恢复流程
1. 停止Cassandra服务
2. 清空数据目录
3. 复制快照文件
4. 启动Cassandra服务
5. 运行repair同步数据

# 增量恢复流程
1. 恢复全量快照
2. 应用增量备份
3. 重放提交日志
4. 验证数据完整性

1.2 Cassandra数据库备份类型

Cassandra数据库备份类型详解:

1.2.1 Cassandra数据库快照备份

# 快照备份

# 1. 全量快照
# 特点
– 备份所有SSTable
– 独立完整
– 恢复简单
– 占用空间大

# 适用场景
– 首次备份
– 定期全量备份
– 重大变更前备份

# 2. 增量快照
# 特点
– 只备份变化的数据
– 基于硬链接
– 节省空间
– 需要全量基础

# 适用场景
– 频繁备份
– 数据变化大
– 存储空间有限

# 3. 表级快照
# 特点
– 只备份指定表
– 灵活性高
– 备份速度快
– 适合大表

# 适用场景
– 单表恢复
– 表迁移
– 表级备份

# 4. Keyspace级快照
# 特点
– 备份整个Keyspace
– 包含所有表
– 管理方便
– 适合业务隔离

# 适用场景
– 业务迁移
– Keyspace恢复
– 跨环境同步

# 快照命令
# 创建全量快照
nodetool snapshot

# 创建Keyspace快照
nodetool snapshot -kt fgedudb

# 创建表快照
nodetool snapshot -kt fgedudb.fgedu_users

# 创建命名快照
nodetool snapshot -t backup_20240115

# 查看快照
nodetool listsnapshots

# 删除快照
nodetool clearsnapshot -t backup_20240115

1.2.2 Cassandra数据库增量备份

# 增量备份

# 1. 提交日志备份
# 特点
– 备份提交日志段
– 记录所有变更
– 备份粒度细
– 恢复时间长

# 配置
# 在cassandra.yaml中启用
incremental_backups: true

# 2. 增量备份文件
# 位置
/cassandra/fgdata/fgedudb/fgedu_users/backups/

# 文件类型
– *.db 数据文件
– *.txt 元数据文件

# 3. 增量备份管理
# 手动归档
cp /cassandra/fgdata/*/backups/* /backup/incremental/

# 自动归档脚本
#!/bin/bash
# incremental_backup.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

BACKUP_DIR=”/backup/incremental/$(date +%Y%m%d)”
mkdir -p ${BACKUP_DIR}

# 归档增量备份
find /cassandra/fgdata -name “backups” -type d -exec cp -r {} ${BACKUP_DIR} \;

# 清理旧增量备份
find /backup/incremental -type d -mtime +7 -exec rm -rf {} \;

# 4. 增量备份特点
# 优点
– 备份数据量小
– 备份频率高
– RPO小

# 缺点
– 恢复复杂
– 需要全量基础
– 管理成本高

# 5. 增量备份策略
# 推荐配置
– 全量备份: 每周一次
– 增量备份: 每小时一次
– 保留周期: 30天

# 恢复顺序
1. 恢复最近全量备份
2. 按顺序应用增量备份
3. 运行repair同步数据

1.3 Cassandra数据库备份策略

Cassandra数据库备份策略详解:

1.3.1 Cassandra数据库备份策略制定

# 备份策略

# 1. 备份频率策略
# 关键数据
– 全量备份: 每天
– 增量备份: 每小时
– 快照保留: 30天

# 重要数据
– 全量备份: 每周
– 增量备份: 每天
– 快照保留: 90天

# 一般数据
– 全量备份: 每月
– 增量备份: 每周
– 快照保留: 180天

# 2. 备份保留策略
# 保留周期
– 日备份: 保留7天
– 周备份: 保留4周
– 月备份: 保留12个月
– 年备份: 永久保留

# 3. 备份存储策略
# 本地存储
– 快速访问
– 成本低
– 风险高

# 远程存储
– 异地容灾
– 成本高
– 安全性高

# 云存储
– 弹性扩展
– 按需付费
– 管理简单

# 4. 备份验证策略
# 完整性验证
– 校验文件数量
– 校验文件大小
– 校验文件MD5

# 可恢复性验证
– 定期恢复测试
– 验证数据完整性
– 记录恢复时间

# 5. 备份安全策略
# 加密
– 备份文件加密
– 传输加密
– 存储加密

# 访问控制
– 备份权限管理
– 操作审计
– 访问日志

1.3.2 Cassandra数据库备份策略选择

# 备份策略选择

# 1. 根据数据重要性选择
# 关键数据
策略: 全量+增量
频率: 全量每天,增量每小时
保留: 30天
存储: 本地+远程

# 重要数据
策略: 全量+增量
频率: 全量每周,增量每天
保留: 90天
存储: 本地+远程

# 一般数据
策略: 全量
频率: 每周
保留: 30天
存储: 本地

# 2. 根据数据量选择
# 小数据量 (<100GB) 策略: 全量快照 频率: 每天 恢复: 快照恢复 # 中等数据量 (100GB-1TB) 策略: 全量+增量 频率: 全量每周,增量每天 恢复: 快照+增量 # 大数据量 (>1TB)
策略: 增量为主
频率: 全量每月,增量每天
恢复: 快照+增量

# 3. 根据业务特点选择
# 高可用业务
策略: 快照+增量
频率: 快照每天,增量每小时
特点: RPO小,RTO短

# 批处理业务
策略: 全量快照
频率: 批处理后
特点: 简单可靠

# 开发测试环境
策略: 全量快照
频率: 每周
特点: 成本低

# 4. 多数据中心备份策略
# 策略
– 每个数据中心独立备份
– 跨数据中心复制备份
– 异地容灾备份

# 配置
数据中心1: 本地备份 + 远程复制
数据中心2: 本地备份 + 远程复制
灾备中心: 接收远程备份

Part02-生产环境规划与建议

2.1 Cassandra数据库备份计划制定

Cassandra数据库备份计划制定详解:

2.1.1 Cassandra数据库备份计划模板

# 备份计划模板

# 1. 备份窗口
# 全量备份窗口
– 时间: 每周日凌晨2:00-6:00
– 时长: 4小时
– 影响: 轻微

# 增量备份窗口
– 时间: 每小时整点
– 时长: 5分钟
– 影响: 无

# 2. 备份任务安排
# 周一至周五
00:00 – 增量备份
01:00 – 增量备份
02:00 – 增量备份

23:00 – 增量备份

# 周六
02:00 – 全量备份验证

# 周日
02:00 – 全量备份

# 3. 备份保留计划
# 日备份
保留: 7天
清理: 自动清理8天前备份

# 周备份
保留: 4周
清理: 自动清理5周前备份

# 月备份
保留: 12个月
清理: 手动清理

# 4. 备份验证计划
# 每周验证
– 验证备份完整性
– 检查备份文件数量
– 校验文件大小

# 每月验证
– 执行恢复测试
– 验证数据可用性
– 记录恢复时间

# 每季度验证
– 灾难恢复演练
– 验证恢复流程
– 更新恢复文档

# 5. 备份计划脚本
#!/bin/bash
# backup_schedule.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

# 配置cron定时任务
# 每小时增量备份
0 * * * * /cassandra/scripts/incremental_backup.sh

# 每周全量备份
0 2 * * 0 /cassandra/scripts/full_backup.sh

# 每周备份验证
0 2 * * 6 /cassandra/scripts/backup_verify.sh

# 每月备份清理
0 3 1 * * /cassandra/scripts/backup_cleanup.sh

2.1.2 Cassandra数据库备份资源规划

# 备份资源规划

# 1. 存储空间规划
# 全量备份空间
数据量: 500GB
压缩比: 0.7
备份空间: 500GB * 0.7 = 350GB

# 增量备份空间
日增量: 10GB
保留天数: 7天
增量空间: 10GB * 7 = 70GB

# 总空间需求
全量: 350GB * 4周 = 1400GB
增量: 70GB
总计: 1470GB

# 建议预留: 2000GB

# 2. 网络带宽规划
# 备份传输
数据量: 500GB
备份窗口: 4小时
所需带宽: 500GB / 4h = 125GB/h = 34MB/s = 272Mbps

# 建议带宽: 500Mbps

# 3. 计算资源规划
# 备份服务器
CPU: 8核
内存: 16GB
磁盘: 2TB SSD
网络: 1Gbps

# 4. 人员安排
# 备份管理员
– 监控备份状态
– 处理备份告警
– 执行恢复操作

# 值班安排
– 工作日: 9:00-18:00
– 非工作日: 远程值班
– 重大备份: 现场值班

# 5. 预算规划
# 存储成本
本地存储: 2000GB * 0.5元/GB/月 = 1000元/月
云存储: 2000GB * 0.12元/GB/月 = 240元/月

# 网络成本
带宽: 500Mbps * 100元/Mbps/月 = 50000元/月

# 人力成本
备份管理员: 1人 * 15000元/月 = 15000元/月

# 总成本: 约66000元/月

2.2 Cassandra数据库备份存储规划

Cassandra数据库备份存储规划详解:

2.2.1 Cassandra数据库备份存储架构

# 备份存储架构

# 1. 本地存储
# 特点
– 访问速度快
– 成本低
– 风险高

# 配置
路径: /backup/local/
容量: 2TB
RAID: RAID10

# 2. 远程存储
# 特点
– 异地容灾
– 安全性高
– 成本高

# 配置
服务器: backup.fgedu.net.cn
路径: /backup/remote/
容量: 5TB

# 3. 云存储
# 特点
– 弹性扩展
– 高可用
– 按需付费

# 配置
服务商: 阿里云OSS
存储类型: 标准存储
容量: 不限

# 4. 存储层级
# 热数据 (最近7天)
存储: 本地SSD
访问: 频繁
成本: 高

# 温数据 (7-30天)
存储: 本地HDD
访问: 一般
成本: 中

# 冷数据 (30天以上)
存储: 云存储
访问: 很少
成本: 低

# 5. 存储架构图
Cassandra集群 → 本地备份 → 远程备份 → 云存储
↓ ↓ ↓ ↓
快照 增量备份 异地复制 长期归档

2.2.2 Cassandra数据库备份存储管理

# 备份存储管理

# 1. 存储监控
# 空间监控
df -h /backup/local/

# 输出示例
Filesystem Size Used Avail Use% Mounted on
/dev/sdb1 2.0T 1.2T 800G 60% /backup/local

# 性能监控
iostat -x /dev/sdb1 1 10

# 2. 存储清理
# 清理旧备份
find /backup/local -name “*.snap” -mtime +30 -delete

# 清理临时文件
find /backup/local -name “*.tmp” -delete

# 3. 存储扩容
# 监控告警阈值
THRESHOLD=80

USAGE=$(df -h /backup/local | tail -1 | awk ‘{print $5}’ | sed ‘s/%//’)
if [ ${USAGE} -gt ${THRESHOLD} ]; then
echo “存储空间不足,请扩容”
fi

# 4. 存储优化
# 压缩备份
tar -czf backup_$(date +%Y%m%d).tar.gz /backup/local/snapshot/

# 去重备份
# 使用rsync增量同步
rsync -av –delete /backup/local/ backup-server:/backup/remote/

# 5. 存储管理脚本
#!/bin/bash
# storage_management.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

BACKUP_DIR=”/backup/local”
LOG_FILE=”/cassandra/logs/backup/storage_$(date +%Y%m%d).log”

echo “=== 存储管理开始 ===” | tee -a ${LOG_FILE}

# 检查存储空间
echo “检查存储空间…” | tee -a ${LOG_FILE}
df -h ${BACKUP_DIR} | tee -a ${LOG_FILE}

# 清理旧备份
echo “清理旧备份…” | tee -a ${LOG_FILE}
find ${BACKUP_DIR} -name “*.snap” -mtime +30 -delete | tee -a ${LOG_FILE}

# 压缩备份
echo “压缩备份…” | tee -a ${LOG_FILE}
cd ${BACKUP_DIR}
tar -czf archive_$(date +%Y%m%d).tar.gz snapshot/ 2>&1 | tee -a ${LOG_FILE}

echo “=== 存储管理完成 ===” | tee -a ${LOG_FILE}

2.3 Cassandra数据库备份验证策略

Cassandra数据库备份验证策略详解:

2.3.1 Cassandra数据库备份验证方法

# 备份验证方法

# 1. 完整性验证
# 检查文件数量
find /backup/local/snapshot -type f | wc -l

# 检查文件大小
du -sh /backup/local/snapshot

# 检查文件MD5
find /backup/local/snapshot -type f -exec md5sum {} \; > md5sum.txt

# 2. 可恢复性验证
# 创建测试环境
# 恢复备份到测试环境
# 验证数据完整性

# 3. 数据一致性验证
# 比较源数据和备份数据
nodetool verify fgedudb fgedu_users

# 4. 定期恢复测试
# 测试频率: 每月一次
# 测试内容:
– 全量恢复测试
– 增量恢复测试
– 表级恢复测试
– 灾难恢复演练

# 5. 验证报告
# 验证内容
– 备份时间
– 备份大小
– 文件数量
– 验证结果
– 恢复时间

# 验证脚本
#!/bin/bash
# backup_verify.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

BACKUP_DIR=”/backup/local/snapshot”
LOG_FILE=”/cassandra/logs/backup/verify_$(date +%Y%m%d).log”

echo “=== 备份验证开始 ===” | tee -a ${LOG_FILE}
echo “时间: $(date)” | tee -a ${LOG_FILE}

# 检查备份目录
if [ ! -d “${BACKUP_DIR}” ]; then
echo “错误: 备份目录不存在” | tee -a ${LOG_FILE}
exit 1
fi

# 检查文件数量
FILE_COUNT=$(find ${BACKUP_DIR} -type f | wc -l)
echo “文件数量: ${FILE_COUNT}” | tee -a ${LOG_FILE}

# 检查备份大小
BACKUP_SIZE=$(du -sh ${BACKUP_DIR} | awk ‘{print $1}’)
echo “备份大小: ${BACKUP_SIZE}” | tee -a ${LOG_FILE}

# 检查快照列表
echo “快照列表:” | tee -a ${LOG_FILE}
nodetool listsnapshots | tee -a ${LOG_FILE}

# 验证结果
if [ ${FILE_COUNT} -gt 0 ]; then
echo “验证通过” | tee -a ${LOG_FILE}
else
echo “验证失败” | tee -a ${LOG_FILE}
fi

echo “=== 备份验证完成 ===” | tee -a ${LOG_FILE}

风哥提示:备份验证是备份管理的重要环节。定期验证备份的完整性和可恢复性,确保在需要时能够成功恢复数据。学习交流加群风哥微信: itpux-com

Part03-生产环境项目实施方案

3.1 Cassandra数据库快照备份实战

Cassandra数据库快照备份实战:

3.1.1 Cassandra数据库创建快照

# 创建快照

# 1. 创建全量快照
# nodetool snapshot

Requested creating snapshot(s) for: all keyspaces
Snapshot directory: 1705312800000
Snapshot name: 1705312800000

# 输出说明
– 快照目录: 时间戳命名
– 快照名称: 时间戳
– 范围: 所有Keyspace

# 2. 创建指定Keyspace快照
# nodetool snapshot -kt fgedudb

Requested creating snapshot(s) for: [fgedudb]
Snapshot directory: 1705312800000
Snapshot name: 1705312800000

# 3. 创建指定表快照
# nodetool snapshot -kt fgedudb.fgedu_users

Requested creating snapshot(s) for: [fgedudb.fgedu_users]
Snapshot directory: 1705312800000
Snapshot name: 1705312800000

# 4. 创建命名快照
# nodetool snapshot -t backup_20240115

Requested creating snapshot(s) for: all keyspaces
Snapshot directory: backup_20240115
Snapshot name: backup_20240115

# 5. 查看快照列表
# nodetool listsnapshots

Snapshot name Keyspace Table Size Created on
1705312800000 fgedudb fgedu_users 100 GB 2024-01-15T10:00:00Z
backup_20240115 fgedudb fgedu_orders 50 GB 2024-01-15T10:30:00Z

Total snapshots: 2

# 6. 查看快照详细信息
# ls -la /cassandra/fgdata/fgedudb/fgedu_users/snapshots/

total 0
drwxr-xr-x 2 cassandra cassandra 100 Jan 15 10:00 1705312800000
drwxr-xr-x 2 cassandra cassandra 100 Jan 15 10:30 backup_20240115

# 7. 查看快照文件
# ls -la /cassandra/fgdata/fgedudb/fgedu_users/snapshots/backup_20240115/

total 100000
-rw-r–r– 2 cassandra cassandra 100000 Jan 15 10:00 na-1-big-Data.db
-rw-r–r– 2 cassandra cassandra 1000 Jan 15 10:00 na-1-big-Index.db
-rw-r–r– 2 cassandra cassandra 100 Jan 15 10:00 na-1-big-Filter.db
-rw-r–r– 2 cassandra cassandra 100 Jan 15 10:00 na-1-big-Summary.db
-rw-r–r– 2 cassandra cassandra 100 Jan 15 10:00 na-1-big-Statistics.db

3.1.2 Cassandra数据库快照管理

# 快照管理

# 1. 查看快照信息
# nodetool listsnapshots

Snapshot name Keyspace Table Size Created on
1705312800000 fgedudb fgedu_users 100 GB 2024-01-15T10:00:00Z
backup_20240115 fgedudb fgedu_orders 50 GB 2024-01-15T10:30:00Z

# 2. 删除指定快照
# nodetool clearsnapshot -t backup_20240115

Snapshot backup_20240115 cleared

# 3. 删除所有快照
# nodetool clearsnapshot

All snapshots cleared

# 4. 快照归档
# 复制快照到备份目录
# cp -r /cassandra/fgdata/fgedudb/fgedu_users/snapshots/backup_20240115 /backup/local/fgedudb_fgedu_users_20240115/

# 5. 快照压缩
# tar -czf /backup/local/fgedudb_fgedu_users_20240115.tar.gz -C /cassandra/fgdata/fgedudb/fgedu_users/snapshots backup_20240115

# 6. 快照传输
# scp /backup/local/fgedudb_fgedu_users_20240115.tar.gz backup-server:/backup/remote/

# 7. 快照管理脚本
#!/bin/bash
# snapshot_management.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

BACKUP_DIR=”/backup/local”
SNAPSHOT_NAME=”backup_$(date +%Y%m%d)”
LOG_FILE=”/cassandra/logs/backup/snapshot_$(date +%Y%m%d).log”

echo “=== 快照管理开始 ===” | tee -a ${LOG_FILE}
echo “时间: $(date)” | tee -a ${LOG_FILE}

# 创建快照
echo “创建快照: ${SNAPSHOT_NAME}” | tee -a ${LOG_FILE}
nodetool snapshot -t ${SNAPSHOT_NAME} 2>&1 | tee -a ${LOG_FILE}

# 等待快照完成
sleep 10

# 归档快照
echo “归档快照…” | tee -a ${LOG_FILE}
for keyspace in $(nodetool listsnapshots | grep ${SNAPSHOT_NAME} | awk ‘{print $2}’ | sort -u); do
for table in $(nodetool listsnapshots | grep ${SNAPSHOT_NAME} | grep ${keyspace} | awk ‘{print $3}’); do
SRC_DIR=”/cassandra/fgdata/${keyspace}/${table}/snapshots/${SNAPSHOT_NAME}”
DST_DIR=”${BACKUP_DIR}/${keyspace}_${table}_${SNAPSHOT_NAME}”

if [ -d “${SRC_DIR}” ]; then
echo “归档: ${keyspace}.${table}” | tee -a ${LOG_FILE}
mkdir -p ${DST_DIR}
cp -r ${SRC_DIR}/* ${DST_DIR}/
fi
done
done

# 压缩快照
echo “压缩快照…” | tee -a ${LOG_FILE}
cd ${BACKUP_DIR}
tar -czf ${SNAPSHOT_NAME}.tar.gz *_${SNAPSHOT_NAME} 2>&1 | tee -a ${LOG_FILE}

# 清理临时文件
rm -rf *_${SNAPSHOT_NAME}

# 清理旧快照
echo “清理旧快照…” | tee -a ${LOG_FILE}
nodetool clearsnapshot -t ${SNAPSHOT_NAME}

# 清理旧备份
find ${BACKUP_DIR} -name “*.tar.gz” -mtime +30 -delete

echo “=== 快照管理完成 ===” | tee -a ${LOG_FILE}

3.2 Cassandra数据库快照恢复实战

Cassandra数据库快照恢复实战:

3.2.1 Cassandra数据库全量恢复

# 全量恢复

# 1. 停止Cassandra服务
# nodetool drain
# systemctl stop cassandra

# 输出
Draining nodes…
Node is drained
Stopping cassandra service: OK

# 2. 清空数据目录
# rm -rf /cassandra/fgdata/fgedudb/fgedu_users/*

# 3. 解压备份文件
# tar -xzf /backup/local/backup_20240115.tar.gz -C /tmp/

# 4. 复制快照文件
# cp -r /tmp/backup_20240115/* /cassandra/fgdata/fgedudb/fgedu_users/

# 5. 修改文件权限
# chown -R cassandra:cassandra /cassandra/fgdata/fgedudb/fgedu_users/

# 6. 启动Cassandra服务
# systemctl start cassandra

# 输出
Starting cassandra service: OK

# 7. 验证数据
# cqlsh -e “SELECT COUNT(*) FROM fgedudb.fgedu_users;”

count
——-
100000

(1 rows)

# 8. 运行repair
# nodetool repair -pr fgedudb

[2024-01-15 11:00:00,000] Starting repair…
[2024-01-15 11:30:00,000] Repair completed successfully

# 9. 验证集群状态
# nodetool status

Datacenter: dc1
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
— Address Load Tokens Owns (effective) Host ID Rack
UN 192.168.1.101 100 GB 256 100.0% a1b2c3d4… RAC1
UN 192.168.1.102 100 GB 256 100.0% e5f6g7h8… RAC1
UN 192.168.1.103 100 GB 256 100.0% i9j0k1l2… RAC2

3.2.2 Cassandra数据库表级恢复

# 表级恢复

# 1. 停止Cassandra服务(可选)
# 如果只恢复单个表,可以不停止服务
# 但建议停止服务以保证数据一致性

# 2. 清空表数据目录
# rm -rf /cassandra/fgdata/fgedudb/fgedu_users/*

# 3. 解压备份文件
# tar -xzf /backup/local/fgedudb_fgedu_users_20240115.tar.gz -C /tmp/

# 4. 复制快照文件
# cp -r /tmp/backup_20240115/* /cassandra/fgdata/fgedudb/fgedu_users/

# 5. 修改文件权限
# chown -R cassandra:cassandra /cassandra/fgdata/fgedudb/fgedu_users/

# 6. 刷新表
# nodetool refresh fgedudb fgedu_users

# 输出
Refreshing table fgedudb.fgedu_users

# 7. 验证数据
# cqlsh -e “SELECT COUNT(*) FROM fgedudb.fgedu_users;”

count
——-
100000

(1 rows)

# 8. 运行repair
# nodetool repair -pr fgedudb fgedu_users

# 9. 恢复脚本
#!/bin/bash
# table_restore.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

KEYSPACE=”fgedudb”
TABLE=”fgedu_users”
BACKUP_FILE=”/backup/local/fgedudb_fgedu_users_20240115.tar.gz”
LOG_FILE=”/cassandra/logs/backup/restore_$(date +%Y%m%d).log”

echo “=== 表级恢复开始 ===” | tee -a ${LOG_FILE}
echo “时间: $(date)” | tee -a ${LOG_FILE}
echo “Keyspace: ${KEYSPACE}” | tee -a ${LOG_FILE}
echo “Table: ${TABLE}” | tee -a ${LOG_FILE}

# 检查备份文件
if [ ! -f “${BACKUP_FILE}” ]; then
echo “错误: 备份文件不存在” | tee -a ${LOG_FILE}
exit 1
fi

# 清空表数据
echo “清空表数据…” | tee -a ${LOG_FILE}
rm -rf /cassandra/fgdata/${KEYSPACE}/${TABLE}/*

# 解压备份
echo “解压备份…” | tee -a ${LOG_FILE}
tar -xzf ${BACKUP_FILE} -C /tmp/ 2>&1 | tee -a ${LOG_FILE}

# 复制快照文件
echo “复制快照文件…” | tee -a ${LOG_FILE}
cp -r /tmp/backup_20240115/* /cassandra/fgdata/${KEYSPACE}/${TABLE}/ 2>&1 | tee -a ${LOG_FILE}

# 修改权限
echo “修改权限…” | tee -a ${LOG_FILE}
chown -R cassandra:cassandra /cassandra/fgdata/${KEYSPACE}/${TABLE}/

# 刷新表
echo “刷新表…” | tee -a ${LOG_FILE}
nodetool refresh ${KEYSPACE} ${TABLE} 2>&1 | tee -a ${LOG_FILE}

# 验证数据
echo “验证数据…” | tee -a ${LOG_FILE}
COUNT=$(cqlsh -e “SELECT COUNT(*) FROM ${KEYSPACE}.${TABLE};” | head -4 | tail -1 | tr -d ‘ ‘)
echo “数据量: ${COUNT}” | tee -a ${LOG_FILE}

# 运行repair
echo “运行repair…” | tee -a ${LOG_FILE}
nodetool repair -pr ${KEYSPACE} ${TABLE} 2>&1 | tee -a ${LOG_FILE}

echo “=== 表级恢复完成 ===” | tee -a ${LOG_FILE}

3.3 Cassandra数据库自动化备份脚本

Cassandra数据库自动化备份脚本:

3.3.1 Cassandra数据库全量备份脚本

#!/bin/bash
# full_backup.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

# Cassandra全量备份脚本

# 配置变量
CASSANDRA_HOME=”/cassandra/app/current”
DATA_DIR=”/cassandra/fgdata”
BACKUP_DIR=”/backup/local”
REMOTE_BACKUP_DIR=”/backup/remote”
SNAPSHOT_NAME=”full_backup_$(date +%Y%m%d)”
LOG_FILE=”/cassandra/logs/backup/full_backup_$(date +%Y%m%d).log”
RETENTION_DAYS=30

# 创建日志目录
mkdir -p $(dirname ${LOG_FILE})
mkdir -p ${BACKUP_DIR}

# 日志函数
log() {
echo “[$(date ‘+%Y-%m-%d %H:%M:%S’)] $1″ | tee -a ${LOG_FILE}
}

# 发送告警
send_alert() {
local subject=”Cassandra备份告警: $1″
local message=”$2”
echo “${message}” | mail -s “${subject}” admin@fgedu.net.cn
}

# 主函数
main() {
log “=== Cassandra全量备份开始 ===”

# 1. 检查磁盘空间
log “检查磁盘空间…”
AVAILABLE=$(df -BG ${BACKUP_DIR} | tail -1 | awk ‘{print $4}’ | sed ‘s/G//’)
if [ ${AVAILABLE} -lt 100 ]; then
log “警告: 磁盘空间不足 (${AVAILABLE}GB)”
send_alert “磁盘空间不足” “备份目录剩余空间: ${AVAILABLE}GB”
fi

# 2. 创建快照
log “创建快照: ${SNAPSHOT_NAME}”
nodetool snapshot -t ${SNAPSHOT_NAME} 2>&1 | tee -a ${LOG_FILE}
if [ $? -ne 0 ]; then
log “错误: 快照创建失败”
send_alert “快照创建失败” “快照名称: ${SNAPSHOT_NAME}”
exit 1
fi

# 3. 等待快照完成
sleep 10

# 4. 归档快照
log “归档快照…”
ARCHIVE_DIR=”${BACKUP_DIR}/${SNAPSHOT_NAME}”
mkdir -p ${ARCHIVE_DIR}

# 遍历所有Keyspace和Table
for keyspace_dir in ${DATA_DIR}/*; do
if [ -d “${keyspace_dir}” ]; then
keyspace=$(basename ${keyspace_dir})
log “处理Keyspace: ${keyspace}”

for table_dir in ${keyspace_dir}/*; do
if [ -d “${table_dir}” ]; then
table=$(basename ${table_dir})
snapshot_dir=”${table_dir}/snapshots/${SNAPSHOT_NAME}”

if [ -d “${snapshot_dir}” ]; then
log “归档表: ${keyspace}.${table}”
mkdir -p ${ARCHIVE_DIR}/${keyspace}/${table}
cp -r ${snapshot_dir}/* ${ARCHIVE_DIR}/${keyspace}/${table}/
fi
fi
done
fi
done

# 5. 压缩备份
log “压缩备份…”
cd ${BACKUP_DIR}
tar -czf ${SNAPSHOT_NAME}.tar.gz ${SNAPSHOT_NAME} 2>&1 | tee -a ${LOG_FILE}
if [ $? -ne 0 ]; then
log “错误: 压缩失败”
send_alert “压缩失败” “备份名称: ${SNAPSHOT_NAME}”
exit 1
fi

# 6. 计算MD5
log “计算MD5…”
md5sum ${SNAPSHOT_NAME}.tar.gz > ${SNAPSHOT_NAME}.tar.gz.md5

# 7. 清理临时文件
log “清理临时文件…”
rm -rf ${ARCHIVE_DIR}

# 8. 清理本地快照
log “清理本地快照…”
nodetool clearsnapshot -t ${SNAPSHOT_NAME} 2>&1 | tee -a ${LOG_FILE}

# 9. 传输到远程
log “传输到远程服务器…”
scp ${SNAPSHOT_NAME}.tar.gz ${SNAPSHOT_NAME}.tar.gz.md5 backup-server:${REMOTE_BACKUP_DIR}/ 2>&1 | tee -a ${LOG_FILE}
if [ $? -ne 0 ]; then
log “警告: 远程传输失败”
send_alert “远程传输失败” “备份名称: ${SNAPSHOT_NAME}”
fi

# 10. 清理旧备份
log “清理旧备份…”
find ${BACKUP_DIR} -name “full_backup_*.tar.gz” -mtime +${RETENTION_DAYS} -delete
find ${BACKUP_DIR} -name “full_backup_*.tar.gz.md5” -mtime +${RETENTION_DAYS} -delete

# 11. 验证备份
log “验证备份…”
BACKUP_SIZE=$(du -sh ${BACKUP_DIR}/${SNAPSHOT_NAME}.tar.gz | awk ‘{print $1}’)
log “备份大小: ${BACKUP_SIZE}”

# 12. 记录备份信息
log “记录备份信息…”
echo “${SNAPSHOT_NAME},${BACKUP_SIZE},$(date ‘+%Y-%m-%d %H:%M:%S’)” >> ${BACKUP_DIR}/backup_history.csv

log “=== Cassandra全量备份完成 ===”
}

# 执行主函数
main

3.3.2 Cassandra数据库增量备份脚本

#!/bin/bash
# incremental_backup.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

# Cassandra增量备份脚本

# 配置变量
DATA_DIR=”/cassandra/fgdata”
BACKUP_DIR=”/backup/incremental”
LOG_FILE=”/cassandra/logs/backup/incremental_$(date +%Y%m%d%H%M).log”
RETENTION_DAYS=7

# 创建目录
mkdir -p ${BACKUP_DIR}
mkdir -p $(dirname ${LOG_FILE})

# 日志函数
log() {
echo “[$(date ‘+%Y-%m-%d %H:%M:%S’)] $1” | tee -a ${LOG_FILE}
}

# 主函数
main() {
log “=== Cassandra增量备份开始 ===”

# 备份目录
BACKUP_DATE=$(date +%Y%m%d)
BACKUP_TIME=$(date +%H%M)
BACKUP_PATH=”${BACKUP_DIR}/${BACKUP_DATE}/${BACKUP_TIME}”
mkdir -p ${BACKUP_PATH}

# 遍历所有Keyspace和Table
for keyspace_dir in ${DATA_DIR}/*; do
if [ -d “${keyspace_dir}” ]; then
keyspace=$(basename ${keyspace_dir})

for table_dir in ${keyspace_dir}/*; do
if [ -d “${table_dir}” ]; then
table=$(basename ${table_dir})
backups_dir=”${table_dir}/backups”

if [ -d “${backups_dir}” ] && [ “$(ls -A ${backups_dir})” ]; then
log “备份增量: ${keyspace}.${table}”
mkdir -p ${BACKUP_PATH}/${keyspace}/${table}
cp -r ${backups_dir}/* ${BACKUP_PATH}/${keyspace}/${table}/

# 清空增量备份目录
rm -rf ${backups_dir}/*
fi
fi
done
fi
done

# 压缩增量备份
if [ “$(ls -A ${BACKUP_PATH})” ]; then
log “压缩增量备份…”
cd ${BACKUP_DIR}/${BACKUP_DATE}
tar -czf ${BACKUP_TIME}.tar.gz ${BACKUP_TIME} 2>&1 | tee -a ${LOG_FILE}
rm -rf ${BACKUP_TIME}

# 计算MD5
md5sum ${BACKUP_TIME}.tar.gz > ${BACKUP_TIME}.tar.gz.md5
else
log “无增量数据”
rm -rf ${BACKUP_PATH}
fi

# 清理旧备份
log “清理旧备份…”
find ${BACKUP_DIR} -type d -mtime +${RETENTION_DAYS} -exec rm -rf {} \; 2>/dev/null

log “=== Cassandra增量备份完成 ===”
}

# 执行主函数
main

备份脚本建议:将备份脚本添加到cron定时任务中,实现自动化备份。定期检查备份日志,确保备份正常执行。更多学习教程公众号风哥教程itpux_com

Part04-生产案例与实战讲解

4.1 Cassandra数据库全量备份实战

Cassandra数据库全量备份实战案例:

4.1.1 Cassandra数据库生产环境全量备份

# 生产环境全量备份

# 场景: 3节点集群,数据量500GB

# 1. 检查集群状态
# nodetool status

Datacenter: dc1
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
— Address Load Tokens Owns (effective) Host ID Rack
UN 192.168.1.101 180 GB 256 100.0% a1b2c3d4… RAC1
UN 192.168.1.102 170 GB 256 100.0% e5f6g7h8… RAC1
UN 192.168.1.103 150 GB 256 100.0% i9j0k1l2… RAC2

# 2. 检查磁盘空间
# df -h /backup/local

Filesystem Size Used Avail Use% Mounted on
/dev/sdb1 2.0T 500G 1.5T 25% /backup/local

# 3. 创建快照
# nodetool snapshot -t weekly_backup_20240115

Requested creating snapshot(s) for: all keyspaces
Snapshot directory: weekly_backup_20240115
Snapshot name: weekly_backup_20240115

# 4. 查看快照
# nodetool listsnapshots

Snapshot name Keyspace Table Size Created on
weekly_backup_20240115 fgedudb fgedu_users 60 GB 2024-01-15T02:00:00Z
weekly_backup_20240115 fgedudb fgedu_orders 40 GB 2024-01-15T02:00:00Z
weekly_backup_20240115 fgedudb fgedu_logs 80 GB 2024-01-15T02:00:00Z

Total snapshots: 3

# 5. 归档快照(在各节点执行)
# 在节点1执行
# tar -czf /backup/local/node1_weekly_backup_20240115.tar.gz \
-C /cassandra/fgdata fgedudb/fgedu_users/snapshots/weekly_backup_20240115 \
fgedudb/fgedu_orders/snapshots/weekly_backup_20240115

# 输出
tar: Removing leading `/’ from member names

# 6. 验证备份
# ls -lh /backup/local/node1_weekly_backup_20240115.tar.gz

-rw-r–r– 1 root root 70G Jan 15 02:30 /backup/local/node1_weekly_backup_20240115.tar.gz

# 7. 计算MD5
# md5sum /backup/local/node1_weekly_backup_20240115.tar.gz > /backup/local/node1_weekly_backup_20240115.tar.gz.md5

# 8. 传输到远程
# scp /backup/local/node1_weekly_backup_20240115.tar.gz* backup-server:/backup/remote/node1/

# 输出
node1_weekly_backup_20240115.tar.gz 100% 70GB 50.0MB/s 23:20
node1_weekly_backup_20240115.tar.gz.md5 100% 64 10.2KB/s 00:00

# 9. 清理本地快照
# nodetool clearsnapshot -t weekly_backup_20240115

Snapshot weekly_backup_20240115 cleared

# 10. 记录备份日志
# echo “$(date),weekly_backup_20240115,70GB,success” >> /cassandra/logs/backup_history.log

4.2 Cassandra数据库增量备份实战

Cassandra数据库增量备份实战案例:

4.2.1 Cassandra数据库增量备份配置

# 增量备份配置

# 1. 启用增量备份
# 修改cassandra.yaml
# vim /cassandra/app/current/conf/cassandra.yaml

# 找到并修改
incremental_backups: true

# 2. 重启Cassandra服务
# nodetool drain
# systemctl restart cassandra

# 3. 验证配置
# grep incremental_backups /cassandra/app/current/conf/cassandra.yaml

incremental_backups: true

# 4. 检查增量备份目录
# ls -la /cassandra/fgdata/fgedudb/fgedu_users/backups/

total 0
drwxr-xr-x 2 cassandra cassandra 6 Jan 15 10:00 .

# 5. 执行写入操作
# cqlsh -e “INSERT INTO fgedudb.fgedu_users (user_id, user_name) VALUES (uuid(), ‘test_user’);”

# 6. 检查增量备份文件
# ls -la /cassandra/fgdata/fgedudb/fgedu_users/backups/

total 1000
-rw-r–r– 1 cassandra cassandra 100000 Jan 15 10:05 na-1-big-Data.db
-rw-r–r– 1 cassandra cassandra 1000 Jan 15 10:05 na-1-big-Index.db

# 7. 配置定时增量备份
# crontab -e

# 每小时执行增量备份
0 * * * * /cassandra/scripts/incremental_backup.sh

# 8. 增量备份执行
# /cassandra/scripts/incremental_backup.sh

=== Cassandra增量备份开始 ===
时间: 2024-01-15 11:00:00
备份增量: fgedudb.fgedu_users
备份增量: fgedudb.fgedu_orders
压缩增量备份…
=== Cassandra增量备份完成 ===

4.3 Cassandra数据库灾难恢复实战

Cassandra数据库灾难恢复实战案例:

4.3.1 Cassandra数据库灾难恢复场景

# 灾难恢复场景

# 场景: 数据中心故障,需要在新数据中心恢复数据

# 1. 准备恢复环境
# 新数据中心配置
– 3个新节点
– 相同Cassandra版本
– 相同配置参数

# 2. 安装Cassandra
# 在各节点执行
# tar -xzf apache-cassandra-4.1.0-bin.tar.gz -C /cassandra/app/
# ln -s /cassandra/app/apache-cassandra-4.1.0 /cassandra/app/current

# 3. 配置Cassandra
# 修改cassandra.yaml
cluster_name: ‘fgedu_cluster’
seeds: “192.168.2.101,192.168.2.102”
listen_address: 192.168.2.101
rpc_address: 192.168.2.101
endpoint_snitch: GossipingPropertyFileSnitch

# 4. 启动新集群
# /cassandra/app/current/bin/cassandra

# 5. 创建Keyspace和表结构
# cqlsh -f /backup/schema/fgedudb_schema.cql

# 输出
CREATE KEYSPACE fgedudb WITH replication = {‘class’: ‘NetworkTopologyStrategy’, ‘dc2’: 3};
CREATE TABLE fgedudb.fgedu_users (…);
CREATE TABLE fgedudb.fgedu_orders (…);

# 6. 恢复数据
# 停止Cassandra
# nodetool drain
# systemctl stop cassandra

# 解压备份
# tar -xzf /backup/remote/node1_weekly_backup_20240115.tar.gz -C /cassandra/fgdata/

# 修改权限
# chown -R cassandra:cassandra /cassandra/fgdata/

# 启动Cassandra
# systemctl start cassandra

# 7. 验证数据
# cqlsh -e “SELECT COUNT(*) FROM fgedudb.fgedu_users;”

count
——-
100000

(1 rows)

# 8. 运行repair
# nodetool repair -pr

# 9. 验证集群状态
# nodetool status

Datacenter: dc2
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
— Address Load Tokens Owns (effective) Host ID Rack
UN 192.168.2.101 180 GB 256 100.0% a1b2c3d4… RAC1
UN 192.168.2.102 170 GB 256 100.0% e5f6g7h8… RAC1
UN 192.168.2.103 150 GB 256 100.0% i9j0k1l2… RAC2

# 10. 更新应用配置
# 修改应用连接地址为新集群

风哥提示:灾难恢复是备份的最终目的。定期进行灾难恢复演练,验证备份的有效性和恢复流程的可行性。from Cassandra视频:www.itpux.com

Part05-风哥经验总结与分享

5.1 Cassandra数据库备份最佳实践

Cassandra数据库备份最佳实践总结:

  • 定期备份:建立定期备份计划,全量备份每周一次,增量备份每天或每小时一次
  • 异地备份:备份文件存储到远程服务器或云存储,实现异地容灾
  • 备份验证:定期验证备份的完整性和可恢复性,确保备份有效
  • 文档记录:详细记录备份操作和恢复流程,便于问题处理
  • 监控告警:监控备份执行状态,设置告警机制
  • 定期演练:定期进行恢复演练,验证恢复流程

5.2 Cassandra数据库备份问题排查

# 备份问题排查

# 1. 快照创建失败
# 症状: nodetool snapshot报错
# 原因: 磁盘空间不足、权限问题

# 排查步骤
# 检查磁盘空间
df -h /cassandra/fgdata

# 检查权限
ls -la /cassandra/fgdata/fgedudb/fgedu_users/

# 检查日志
tail -100 /cassandra/logs/system.log | grep -i snapshot

# 2. 备份文件损坏
# 症状: 恢复时报错
# 原因: 传输错误、存储故障

# 排查步骤
# 验证MD5
md5sum -c backup.tar.gz.md5

# 检查文件完整性
tar -tzf backup.tar.gz

# 3. 恢复失败
# 症状: 恢复后数据不完整
# 原因: 备份不完整、版本不兼容

# 排查步骤
# 检查备份文件数量
find /backup -type f | wc -l

# 检查Cassandra版本
nodetool version

# 检查表结构
cqlsh -e “DESCRIBE TABLE fgedudb.fgedu_users;”

# 4. 备份空间不足
# 症状: 备份失败
# 原因: 备份文件过多、空间规划不合理

# 排查步骤
# 检查备份空间
df -h /backup/local

# 清理旧备份
find /backup/local -name “*.tar.gz” -mtime +30 -delete

# 检查快照
nodetool listsnapshots

# 5. 增量备份不工作
# 症状: 增量备份目录为空
# 原因: 未启用增量备份

# 排查步骤
# 检查配置
grep incremental_backups /cassandra/app/current/conf/cassandra.yaml

# 检查增量备份目录
ls -la /cassandra/fgdata/*/backups/

5.3 Cassandra数据库备份工具推荐

Cassandra数据库备份工具推荐:

5.3.1 Cassandra数据库备份工具

# 备份工具

# 1. nodetool snapshot
# 官方快照工具
# 特点: 简单易用、可靠

# 使用
nodetool snapshot -t backup_name

# 2. nodetool clearsnapshot
# 快照清理工具

# 使用
nodetool clearsnapshot -t backup_name

# 3. medusa
# Cassandra备份管理工具
# 特点: 支持多种存储后端、自动化管理

# 安装
pip install cassandra-medusa

# 使用
medusa backup –backup-name backup_20240115
medusa restore –backup-name backup_20240115

# 4. tablesnap
# 快照管理工具
# 特点: 自动化快照管理

# 使用
tablesnap –keyspace fgedudb –table fgedu_users

# 5. 自定义脚本
# 根据需求编写备份脚本
# 特点: 灵活、可控

# 6. 第三方工具
# – DataStax OpsCenter
# – Instaclustr
# – Astra Backup

# 工具选择建议
# 小型环境: nodetool snapshot + 自定义脚本
# 中型环境: medusa
# 大型环境: DataStax OpsCenter

工具建议:根据实际需求选择合适的备份工具。小型环境使用官方工具和自定义脚本即可,大型环境建议使用专业的备份管理工具。

本文档详细介绍了Cassandra数据库备份恢复实战,包括备份概述、备份类型、备份策略、备份计划制定、备份存储规划、备份验证策略、快照备份实战、快照恢复实战、自动化备份脚本、全量备份实战、增量备份实战、灾难恢复实战、备份最佳实践、备份问题排查、备份工具推荐等内容。通过学习本文档,读者可以掌握Cassandra数据库备份恢复技能,为生产环境应用打下坚实基础。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息