对象存储
对象存储是云计算中最基础的存储服务之一,以扁平化的键值方式存储数据,具有高可用、高扩展性和低成本的特点。AWS S3 协议已成为对象存储的事实标准,几乎所有云厂商(阿里云 OSS、腾讯云 COS、华为云 OBS)都提供 S3 兼容接口。
对象存储核心概念
Section titled “对象存储核心概念”| 概念 | 说明 |
|---|---|
| Bucket(存储桶) | 对象的容器,全局唯一命名 |
| Object(对象) | 存储的基本单元,包含数据和元数据 |
| Key(键) | 对象在桶中的唯一标识,类似文件路径 |
| Region(区域) | 桶所在的地理区域 |
| ACL | 访问控制列表 |
| Presigned URL | 带签名的临时访问链接 |
使用 AWS CLI 操作对象存储
Section titled “使用 AWS CLI 操作对象存储”安装 AWS CLI
Section titled “安装 AWS CLI”# 方法一:通过 pip 安装sudo dnf install -y python3 python3-pippip3 install --user awscli
# 方法二:通过官方安装包curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"sudo dnf install -y unzipunzip awscliv2.zipsudo ./aws/install
# 验证安装aws --version# 交互式配置aws configure# AWS Access Key ID: YOUR_ACCESS_KEY# AWS Secret Access Key: YOUR_SECRET_KEY# Default region name: ap-northeast-1# Default output format: json
# 配置文件位于cat ~/.aws/credentialscat ~/.aws/config
# 使用 Named Profile 管理多个账号aws configure --profile aliyun-oss对于 S3 兼容服务(如阿里云 OSS),需要指定 endpoint:
# 阿里云 OSSaws configure set default.s3.endpoint_url https://oss-cn-hangzhou.aliyuncs.com
# 或在每次命令中指定aws s3 ls --endpoint-url https://oss-cn-hangzhou.aliyuncs.com# 创建存储桶aws s3 mb s3://my-backup-bucket
# 列出所有存储桶aws s3 ls
# 列出桶中的内容aws s3 ls s3://my-backup-bucket/aws s3 ls s3://my-backup-bucket/logs/ --recursive
# 查看桶的大小统计aws s3 ls s3://my-backup-bucket --recursive --summarize --human-readable
# 删除空桶aws s3 rb s3://my-backup-bucket
# 删除桶及其所有内容aws s3 rb s3://my-backup-bucket --force文件上传与下载
Section titled “文件上传与下载”# 上传单个文件aws s3 cp /var/log/messages s3://my-backup-bucket/logs/messages
# 下载单个文件aws s3 cp s3://my-backup-bucket/logs/messages /tmp/messages
# 上传整个目录aws s3 cp /var/www/html/ s3://my-backup-bucket/website/ --recursive
# 下载整个目录aws s3 cp s3://my-backup-bucket/website/ /var/www/html/ --recursive
# 使用排除和包含过滤aws s3 cp /var/log/ s3://my-backup-bucket/logs/ \ --recursive \ --exclude "*" \ --include "*.log"s3 sync 只传输有变化的文件,类似 rsync:
# 将本地目录同步到 S3aws s3 sync /var/www/html/ s3://my-backup-bucket/website/
# 将 S3 同步到本地aws s3 sync s3://my-backup-bucket/website/ /var/www/html/
# 同步并删除目标中多余的文件aws s3 sync /var/www/html/ s3://my-backup-bucket/website/ --delete
# 排除特定文件aws s3 sync /data/ s3://my-backup-bucket/data/ \ --exclude "*.tmp" \ --exclude ".git/*"
# 模拟运行(不实际传输)aws s3 sync /data/ s3://my-backup-bucket/data/ --dryrun# 移动文件aws s3 mv s3://my-bucket/old-path/file.txt s3://my-bucket/new-path/file.txt
# 删除文件aws s3 rm s3://my-backup-bucket/logs/old.log
# 递归删除aws s3 rm s3://my-backup-bucket/logs/ --recursive
# 生成预签名 URL(有效期 3600 秒)aws s3 presign s3://my-backup-bucket/files/report.pdf --expires-in 3600
# 设置对象 ACLaws s3api put-object-acl \ --bucket my-backup-bucket \ --key public/image.png \ --acl public-readMinIO 自建对象存储
Section titled “MinIO 自建对象存储”MinIO 是一个高性能的 S3 兼容对象存储服务器,适合私有云和本地环境。
安装 MinIO 服务端
Section titled “安装 MinIO 服务端”# 下载 MinIO 二进制文件wget https://dl.min.io/server/minio/release/linux-amd64/miniochmod +x miniosudo mv minio /usr/local/bin/
# 创建数据目录sudo mkdir -p /data/minio
# 创建 MinIO 系统用户sudo useradd -r -s /sbin/nologin minio-usersudo chown minio-user:minio-user /data/minio配置 MinIO 环境变量
Section titled “配置 MinIO 环境变量”sudo cat > /etc/default/minio << 'EOF'# MinIO 数据目录MINIO_VOLUMES="/data/minio"
# 管理员凭证MINIO_ROOT_USER=minioadminMINIO_ROOT_PASSWORD=ChangeThisStrongPassword123
# 监听地址MINIO_OPTS="--console-address :9001"EOF创建 Systemd 服务
Section titled “创建 Systemd 服务”sudo cat > /etc/systemd/system/minio.service << 'EOF'[Unit]Description=MinIO Object StorageDocumentation=https://min.io/minio/linux/index.htmlAfter=network-online.targetWants=network-online.target
[Service]User=minio-userGroup=minio-userEnvironmentFile=/etc/default/minioExecStart=/usr/local/bin/minio server $MINIO_VOLUMES $MINIO_OPTSRestart=alwaysRestartSec=10LimitNOFILE=65536
[Install]WantedBy=multi-user.targetEOF
# 启动 MinIOsudo systemctl daemon-reloadsudo systemctl enable --now minio
# 查看状态sudo systemctl status minio# 开放 MinIO API 端口(9000)和控制台端口(9001)sudo firewall-cmd --permanent --add-port=9000/tcpsudo firewall-cmd --permanent --add-port=9001/tcpsudo firewall-cmd --reloadMinIO 控制台访问地址:http://your-server-ip:9001
安装 MinIO 客户端
Section titled “安装 MinIO 客户端”# 下载 mc 客户端wget https://dl.min.io/client/mc/release/linux-amd64/mcchmod +x mcsudo mv mc /usr/local/bin/
# 配置连接到本地 MinIOmc alias set local http://localhost:9000 minioadmin ChangeThisStrongPassword123
# 也可以配置连接到其他 S3 兼容服务mc alias set myaws https://s3.amazonaws.com YOUR_ACCESS_KEY YOUR_SECRET_KEYmc alias set aliyun https://oss-cn-hangzhou.aliyuncs.com YOUR_ACCESS_KEY YOUR_SECRET_KEY
# 验证连接mc admin info local使用 MinIO 客户端
Section titled “使用 MinIO 客户端”# 创建存储桶mc mb local/my-bucketmc mb local/backups
# 列出桶mc ls local
# 上传文件mc cp /etc/hosts local/my-bucket/hostsmc cp --recursive /var/log/ local/backups/logs/
# 下载文件mc cp local/my-bucket/hosts /tmp/hosts-backup
# 同步目录mc mirror /var/www/html/ local/my-bucket/website/
# 持续监听同步mc mirror --watch /var/www/html/ local/my-bucket/website/
# 查看对象信息mc stat local/my-bucket/hosts
# 设置桶策略mc anonymous set download local/my-bucket/public/
# 管理用户mc admin user add local newuser newpassword123mc admin policy attach local readwrite --user newuser
# 查看服务信息mc admin info localMinIO 多磁盘部署(纠删码)
Section titled “MinIO 多磁盘部署(纠删码)”# 在生产环境中,建议使用多磁盘实现纠删码保护# 至少需要 4 块磁盘sudo mkdir -p /data/minio-disk{1..4}sudo chown minio-user:minio-user /data/minio-disk{1..4}
# 修改环境变量sudo sed -i 's|MINIO_VOLUMES=.*|MINIO_VOLUMES="/data/minio-disk{1...4}"|' /etc/default/minio
# 重启服务sudo systemctl restart miniorclone 多云存储管理
Section titled “rclone 多云存储管理”rclone 被称为”云存储的 rsync”,支持超过 70 种存储后端。
安装 rclone
Section titled “安装 rclone”# 方法一:官方安装脚本curl https://rclone.org/install.sh | sudo bash
# 方法二:手动安装RCLONE_VERSION="1.67.0"wget https://downloads.rclone.org/v${RCLONE_VERSION}/rclone-v${RCLONE_VERSION}-linux-amd64.rpmsudo dnf install -y ./rclone-v${RCLONE_VERSION}-linux-amd64.rpm
# 验证rclone version配置存储后端
Section titled “配置存储后端”# 交互式配置rclone config
# 配置文件位于cat ~/.config/rclone/rclone.conf也可以直接编辑配置文件:
cat > ~/.config/rclone/rclone.conf << 'EOF'[aws-s3]type = s3provider = AWSaccess_key_id = YOUR_AWS_ACCESS_KEYsecret_access_key = YOUR_AWS_SECRET_KEYregion = ap-northeast-1
[aliyun-oss]type = s3provider = Alibabaaccess_key_id = YOUR_ALICLOUD_ACCESS_KEYsecret_access_key = YOUR_ALICLOUD_SECRET_KEYendpoint = oss-cn-hangzhou.aliyuncs.com
[tencent-cos]type = s3provider = TencentCOSaccess_key_id = YOUR_TENCENT_SECRET_IDsecret_access_key = YOUR_TENCENT_SECRET_KEYendpoint = cos.ap-guangzhou.myqcloud.com
[local-minio]type = s3provider = Minioaccess_key_id = minioadminsecret_access_key = ChangeThisStrongPassword123endpoint = http://localhost:9000EOFrclone 基本操作
Section titled “rclone 基本操作”# 列出所有配置的远端rclone listremotes
# 列出桶rclone lsd aws-s3:
# 列出桶内文件rclone ls aws-s3:my-bucket/rclone lsl aws-s3:my-bucket/ # 包含时间和大小
# 复制文件rclone copy /var/log/messages aws-s3:my-bucket/logs/
# 复制目录rclone copy /var/www/html/ aws-s3:my-bucket/website/ --progress
# 同步(镜像,会删除目标多余文件)rclone sync /var/www/html/ aws-s3:my-bucket/website/ --progress
# 移动文件rclone move /tmp/uploads/ aws-s3:my-bucket/uploads/
# 删除rclone delete aws-s3:my-bucket/old-logs/rclone purge aws-s3:my-bucket/temp-bucket/ # 删除路径及所有内容# 从 AWS S3 复制到阿里云 OSSrclone copy aws-s3:source-bucket/data/ aliyun-oss:dest-bucket/data/ --progress
# 从阿里云 OSS 同步到本地 MinIOrclone sync aliyun-oss:my-bucket/ local-minio:backup-bucket/ --progress
# 对比两个远端的差异rclone check aws-s3:my-bucket/ aliyun-oss:my-bucket/rclone 高级功能
Section titled “rclone 高级功能”# 带宽限制rclone copy /data/ aws-s3:my-bucket/ --bwlimit 10M
# 加密存储(创建加密远端)rclone config# 选择 "crypt" 类型,指定底层远端
# 挂载为本地文件系统sudo dnf install -y fuse3rclone mount aws-s3:my-bucket /mnt/s3 --daemon --allow-other --vfs-cache-mode full
# 以服务方式运行挂载cat > ~/.config/systemd/user/rclone-mount.service << 'UNIT'[Unit]Description=rclone S3 mountAfter=network-online.target
[Service]ExecStart=/usr/bin/rclone mount aws-s3:my-bucket /mnt/s3 --allow-other --vfs-cache-mode fullExecStop=/bin/fusermount -uz /mnt/s3Restart=on-failure
[Install]WantedBy=default.targetUNIT
systemctl --user enable --now rclone-mount
# 查看远端使用空间rclone about aws-s3:备份到对象存储
Section titled “备份到对象存储”数据库备份脚本
Section titled “数据库备份脚本”#!/bin/bash# MySQL/MariaDB 备份到对象存储
set -euo pipefail
# 配置BACKUP_DIR="/tmp/db-backup"BUCKET="s3://my-backup-bucket/database"DB_NAME="myapp"DATE=$(date +%Y%m%d-%H%M%S)RETENTION_DAYS=30
# 创建临时目录mkdir -p "${BACKUP_DIR}"
# 执行备份echo "[$(date)] 开始备份数据库 ${DB_NAME}..."mysqldump --single-transaction \ --routines \ --triggers \ --databases "${DB_NAME}" | \ gzip > "${BACKUP_DIR}/${DB_NAME}-${DATE}.sql.gz"
# 上传到对象存储echo "[$(date)] 上传备份到对象存储..."aws s3 cp "${BACKUP_DIR}/${DB_NAME}-${DATE}.sql.gz" \ "${BUCKET}/${DB_NAME}-${DATE}.sql.gz"
# 清理本地临时文件rm -f "${BACKUP_DIR}/${DB_NAME}-${DATE}.sql.gz"
# 清理远端过期备份echo "[$(date)] 清理 ${RETENTION_DAYS} 天前的备份..."CUTOFF_DATE=$(date -d "-${RETENTION_DAYS} days" +%Y%m%d)aws s3 ls "${BUCKET}/" | while read -r line; do FILE_DATE=$(echo "$line" | grep -oP '\d{8}' | head -1) FILE_NAME=$(echo "$line" | awk '{print $NF}') if [[ -n "${FILE_DATE}" && "${FILE_DATE}" < "${CUTOFF_DATE}" ]]; then echo " 删除过期备份: ${FILE_NAME}" aws s3 rm "${BUCKET}/${FILE_NAME}" fidone
echo "[$(date)] 备份完成"系统文件增量备份
Section titled “系统文件增量备份”#!/bin/bash# 使用 rclone 增量备份到对象存储
set -euo pipefail
REMOTE="aliyun-oss"BUCKET="server-backups"HOSTNAME=$(hostname)LOG_FILE="/var/log/backup-files.log"
echo "[$(date)] 开始文件备份..." >> "${LOG_FILE}"
# 同步配置文件rclone sync /etc/ "${REMOTE}:${BUCKET}/${HOSTNAME}/etc/" \ --exclude "shadow" \ --exclude "gshadow" \ --log-file="${LOG_FILE}" \ --log-level INFO
# 同步网站数据rclone sync /var/www/ "${REMOTE}:${BUCKET}/${HOSTNAME}/www/" \ --log-file="${LOG_FILE}" \ --log-level INFO
# 同步用户数据rclone sync /home/ "${REMOTE}:${BUCKET}/${HOSTNAME}/home/" \ --exclude ".cache/**" \ --exclude ".local/share/Trash/**" \ --log-file="${LOG_FILE}" \ --log-level INFO
echo "[$(date)] 备份完成" >> "${LOG_FILE}"设置定时备份
Section titled “设置定时备份”# 设置数据库每日备份sudo chmod +x /usr/local/bin/backup-db.shsudo cat > /etc/cron.d/db-backup << 'EOF'# 每天凌晨 2 点执行数据库备份0 2 * * * root /usr/local/bin/backup-db.sh >> /var/log/backup-db.log 2>&1EOF
# 设置文件每日增量备份sudo chmod +x /usr/local/bin/backup-files.shsudo cat > /etc/cron.d/file-backup << 'EOF'# 每天凌晨 3 点执行文件备份0 3 * * * root /usr/local/bin/backup-files.shEOF使用生命周期策略自动清理
Section titled “使用生命周期策略自动清理”对于 AWS S3 或兼容服务,可以配置生命周期策略自动清理旧备份:
# 创建生命周期规则配置cat > /tmp/lifecycle.json << 'EOF'{ "Rules": [ { "ID": "DeleteOldBackups", "Status": "Enabled", "Filter": { "Prefix": "database/" }, "Expiration": { "Days": 30 } }, { "ID": "ArchiveOldFiles", "Status": "Enabled", "Filter": { "Prefix": "files/" }, "Transitions": [ { "Days": 90, "StorageClass": "GLACIER" } ], "Expiration": { "Days": 365 } } ]}EOF
# 应用生命周期策略aws s3api put-bucket-lifecycle-configuration \ --bucket my-backup-bucket \ --lifecycle-configuration file:///tmp/lifecycle.json对象存储是云时代的基础存储方案。掌握 AWS CLI、MinIO 和 rclone 这几个工具后,可以灵活地在公有云、私有云和混合云环境中管理数据,并构建可靠的备份策略。