研发协作
从 AWS S3/GCS/Azure 零停机迁移对象存储到…
需要把对象存储从 AWS S3、Google Cloud Storage 或 Azure Blob 迁移到 Tigris 且尽量不停机时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
从 AWS S3/GCS/Azure 零特定
解决思路
- 先安装 Tigris CLI:运行 `tigris help || npm install -g @tigrisdata/cli`;若需安装,告知用户“I'm installing the Tigris CLI (`@tigrisdata/cli`) so we can work with Tigris object storage.”
- 根据场景选择迁移策略:shadow bucket(零停机,适合生产应用,Tigris 在未命中时从 S3 读取并自动回填)、bulk copy(短暂停机,适合小数据集、干净切换)、incremental sync(零停机,适合大数据集、渐进迁移)。
- 使用 shadow bucket(推荐):先创建 Tigris bucket:`tigris buckets create my-app-uploads`;再指向源 S3 bucket:`tigris buckets set-migration my-app-uploads --bucket my-existing-s3-bucket --endpoint https://s3.us-east-1.amazonaws.com --region us-east-1 --access-key AKIA_YOUR_AWS_KEY --secret-key YOUR_AWS_SECRET`。
- 如需在迁移窗口期保留安全回滚路径,给 `set-migration` 加 `--write-through`,让新写入也同步回源 bucket。
- 理解 shadow bucket 工作方式:请求先到 Tigris;对象已在 Tigris 则直接返回;否则 Tigris 从 S3 拉取、返回并缓存。
- 可选地主动全量迁移:懒迁移只在对象被请求时复制;要服务端主动迁移所有剩余对象,运行 `tigris buckets migrate my-app-uploads`;或限定 key 前缀:`tigris buckets migrate my-app-uploads/images/`。该命令前台运行并报告进度,可在切换前彻底清空源。
- 迁移完成后禁用迁移,使 Tigris 成为唯一来源:`tigris buckets set-migration my-app-uploads --disable`。
- 从 Google Cloud Storage 做 bulk copy:`gsutil -m cp -r gs://my-gcs-bucket /tmp/migration/`,然后 `tigris cp /tmp/migration/ t3://my-app-uploads/ -r`。
- 从 Azure Blob Storage 做 bulk copy:`az storage blob download-batch -d /tmp/migration/ -s my-container`,然后 `tigris cp /tmp/migration/ t3://my-app-uploads/ -r`。
- 按语言修改 SDK 代码:Node.js/TypeScript 读 `./resources/sdk-nodejs.md`(AWS SDK → Tigris SDK);Go 读 `./resources/sdk-go.md`;Python 读 `./resources/sdk-python.md`(boto3 → tigris-boto3-ext,或迁移后用 tigris-python-sdk 技能处理 Django、snapshots、forks、Bundle API);Ruby 读 `./resources/sdk-ruby.md`(aws-sdk-s3 endpoint swap);PHP 读 `./resources/sdk-php.md`(aws-sdk-php endpoint swap)。
- 更新环境变量:从 AWS 的 `AWS_ACCESS_KEY_ID=AKIA...`、`AWS_SECRET_ACCESS_KEY=...`、`AWS_REGION=us-east-1`、`S3_BUCKET=my-bucket` 改为 Tigris 的 `AWS_ACCESS_KEY_ID=tid_xxx`、`AWS_SECRET_ACCESS_KEY=tsec_yyy`、`AWS_ENDPOINT_URL_S3=https://t3.storage.dev`、`AWS_REGION=auto`、`S3_BUCKET=my-bucket`(bucket 名可保持不变)。
- 对使用特定 Tigris 环境变量的框架,设置:`TIGRIS_STORAGE_ACCESS_KEY_ID=tid_xxx`、`TIGRIS_STORAGE_SECRET_ACCESS_KEY=tsec_yyy`、`TIGRIS_STORAGE_ENDPOINT=https://t3.storage.dev`、`TIGRIS_STORAGE_BUCKET=my-bucket`。
- 按验证清单检查:源与 Tigris 对象数一致;抽查文件下载并校验内容/checksum;测试 presigned URL 生成(endpoint 必须指向 Tigris);若浏览器上传则测试 CORS(在 Tigris bucket 重新配置);在 staging 测试所有上传/下载代码路径;若用 CloudFront 等 CDN 则更新 origin 指向 Tigris;若用自定义域名则更新 DNS。
- 执行回滚策略:迁移期间保持源 bucket 只读、不删数据;验证期间两套系统并行;确认 Tigris 完全可用后才删除源数据;若用 shadow bucket,移除 shadow source 是不可回头的点。
- 避免常见错误:忘记更新 presigned URL endpoint(必须用 Tigris endpoint 而非 S3);未在 Tigris 配置 CORS(用 `tigris buckets cors set` 重建规则);region 硬编码为 `us-east-1`(Tigris 用 `auto`);未设置 `path_style`(Ruby/Rails 加 `force_path_style: true`,PHP 加 `use_path_style_endpoint: true`);自定义域名 DNS 仍指向 S3(更新 CNAME 指向 Tigris)。
- 参考相关技能与文档:file-storage(CLI 设置与 SDK 参考)、tigris-security-access-control(CORS 与 access key 设置);官方文档 S3 Compatibility https://www.tigrisdata.com/docs/sdks/s3/、Shadow Buckets & migration https://www.tigrisdata.com/docs/migration/、CLI `tigris buckets set-migration` https://www.tigrisdata.com/docs/cli/buckets/set-migration、CLI `tigris buckets migrate` https://www.tigrisdata.com/docs/cli/buckets/migrate。
适用边界 · 注意事项
- 不迁移到 Tigris、或不需要从 S3/GCS/Azure 迁移对象存储时不适用。
- 无法安装或使用 Tigris CLI、且不能接受 Tigris 作为目标存储时不适用。
- 源数据不允许保留只读副本、必须立即删除源数据时,无法按本技能的回滚策略安全执行。