Nova RDS 跨云灾备系统是一个专为阿里云和AWS RDS设计的数据库备份解决方案,旨在提供一个简单、高效的方式来管理和自动化跨云数据库备份。支持通过REST API接口进行备份管理,并提供企业微信告警通知,确保备份过程的可靠性和及时性。
- 自动备份:自动化备份阿里云和AWS RDS数据库
- 跨云管理:支持在阿里云和AWS之间进行备份数据的迁移和管理
- 灵活的备份策略:通过REST API接口自定义备份频率、备份时间等
- 监控与报警:实时监控备份状态,并在备份失败时发送企微报警通知
- 失败重试:针对SDK获取实例支持自动重试机制
- API文档:集成Swagger文档,便于接口调试和集成
- Go: v1.22+ (主要开发语言)
- Gin: v1.9.x (Web框架)
- 路由管理、参数验证、错误处理
- AWS SDK for Go v2
- S3 存储服务、RDS 数据库服务、KMS
- Aliyun SDK for Go
- RDS 数据库服务、OSS 对象存储
-
Cobra: CLI命令行框架
-
Viper: 配置管理
- Zap: 高性能日志库
- Swagger UI
-
企业微信机器人
-
多环境支持:支持多个环境,可独立配置
-
备份验证:自动验证备份的完整性和可用性
- Go 1.22+
- 阿里云访问密钥
- AWS访问密钥
- 企业微信机器人 Token(用于告警)
-
代码结构
backuprds/ ├── cmd/ # 命令行入口,包含服务启动和配置 │ ├── root.go # 主命令入口 │ └── server.go # HTTP服务器配置 │ ├── config/ # 配置文件目录 │ ├── config.yaml # 主配置文件 │ └── logger.yaml # 日志配置文件 ├── docs/ # swagger API文档 │ ├── api/ │ └── swagger/ ├── internal/ # 内部包 │ ├── config/ # 配置管理 │ ├── handlers/ # HTTP处理器 │ ├── logger/ # 日志管理 │ ├── models/ # 数据模型 │ ├── service/ # 业务逻辑 ├── static/ # 静态文件 └── main.go # 程序入口
-
克隆仓库到本地
git clone xxx
cd backuprds
- 安装依赖
go mod tidy
-
配置环境变量
export
使变量对当前 Shell 和其子进程可见, 确保key的安全性。
export AWS_ACCESS_KEY_ID=your_aws_access_key
export AWS_SECRET_ACCESS_KEY=your_aws_secret_key
export ALIYUN_ACCESS_KEY_ID=your_aliyun_access_key
export ALIYUN_ACCESS_KEY_SECRET=your_aliyun_access_key_secret
export WEWORK_BOT_KEY=your_wework_bot_key
- 修改配置文件
# 编辑 config.yaml 添加必要的配置
cp config/config.example.yaml config/config.yaml
- 编译
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -installsuffix cgo -ldflags "-w" -o backuprdsv1.1.1
- 运行
./backuprdsv1.1.6 --help
Nova RDS 跨云灾备系统支持阿里云和AWS RDS的备份管理
Usage:
backuprds [flags]
Flags:
--config string 配置文件路径 (default "config/config.yaml")
-h, --help help for backuprds
--log.config string 日志配置文件路径 (default "config/logger.yaml")
--log.level string 日志级别
-p, --port string Web服务端口号 (default "8080")
# 指定18888端口启动,日志为info级别
./backuprdsv1.1.6 -p 18888 --log.leve=info
server:
port: 8080
mode: release
rds:
aliyun:
instances:
prod:
id: "rm-xxx"
region: "cn-hangzhou"
s3export:
region: "ap-southeast-1"
bucketname: "backup-bucket"
aws:
instances:
prod:
id: "db-xxx"
region: "ap-southeast-1"
alert:
wework:
enabled: true
botkey: "xxx"
retry_times: 3
more config/logger.yaml
level: "info" # 默认日志级别
format: "text" # 日志格式 (json/text)
output:
console: true # 是否输出到控制台
files: # 文件输出配置
- level: "debug"
path: "logs/debug.log"
max_size: 100 # MB
max_age: 7 # 天
max_backups: 10 # 保留的旧文件个数
- level: "info"
path: "logs/info.log"
max_size: 100
max_age: 7
max_backups: 10
- level: "error"
path: "logs/error.log"
max_size: 100
max_age: 7
max_backups: 10
hooks:
wecom: # 企业微信告警配置
enabled: true
levels: ["error", "fatal"]
webhook_url: "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=XXXXX"
GET /alirds/{env}
- 获取指定环境的RDS备份列表POST /alirds/export/s3/{env}
- 将RDS备份上传至S3GET /alirds/s3config
- 获取S3配置信息
GET /awsrds/{env}
- 获取指定环境的RDS快照列表POST /awsrds/export/{env}
- 导出RDS快照
GET /health
- 健康检查接口GET /instances
- 获取所有实例配置
- ERROR: 备份失败、上传失败等严重错误
- WARN: 备份延迟、性能警告等
- INFO: 备份完成通知
RDS跨云异地备份任务报告
执行时间: 2024-11-25 05:00:01
执行统计
- 成功: 10
- 失败: 2
失败任务
阿里云
- ❌ XXXX: 导出失败
成功任务
- 阿里云: 6 个环境
- AWS: 4 个环境
- 检查AWS凭证是否正确
- 确认S3存储桶权限配置
- http payload太大,exceeded total allowed configured MaxUploadParts (10000). Adjust PartSize to fit in this limit。 调整分片大小
-
检查RDS实例状态以及配置
-
确认访问密钥权限
-
viper解析问题,无法识别下划线和中划线,需要使用驼峰
- 合理配置备份时间窗口
- 适当调整并发上传数
- 根据实际需求配置重试策略
- 定期清理过期备份,节省成本(S3和oss 配置保留策略,保留3天)
- 安装开发依赖
go install github.com/swaggo/swag/cmd/swag@latest
- 生成API文档
swag init
- 运行测试
go test ./...
- 遵循Go标准项目布局
- 使用gofmt格式化代码
- 添加必要的注释