记一次服务器图片迁移腾讯云对象存储

摘要:记一次服务器图片迁移腾讯云对象存储的经历,图片大概 100 多万张,占用了 370G 资源,虽说已经完成,但是总感觉方法不是那么的好。

具体需求如下

一次服务器图片迁移腾讯云对象存储的经历,用户每次提交的图片都放在了服务器上,现在手机像素都比较高,一个图片随便一拍都好几兆,虽说上传的时候,PC 端、安卓、iOS 端都是压缩后上传的,但是挡不住量大啊,平均下来一天 2000 多图片上传。老大的意思是把图片都迁移到腾讯云对象存储中。

但是有个问题是,这 100 多万的图片当时存储在 2 个文件夹中,这里分别用 ask1,ask2 来表示两个文件夹,ask1 文件夹中图片存储路径 /ask1/4c56ff4ce4aaf9573aa5dff913df997a.jpg,ask2 文件夹中图片存储路径 /ask2/a/4c56ff4ce4aaf9573aa5dff913df997a.jpg,而且这些图片当中还有许多是已经失效图片(图片存在,但是数据库中图片路径已经是了),所以在迁移的过程中过滤掉这些无效图片。

迁移到腾讯云后,要在存储桶中建立一个文件夹,然后再分两级子文件夹,图片的名称都是MD5加密码后的,比如一个图片的名称是4c56ff4ce4aaf9573aa5dff913df997a.jpg,那它在腾讯的存储路径就是 /bucket/ask/7/a/4c56ff4ce4aaf9573aa5dff913df997a.jpg,所以这次迁移也需要完成两个任务,一个是过滤失效的图片,另一个就是重新建立文件夹分层存储。


我的思路是

1、首先将改变上传方式,将以后的图片都上传到腾讯云

2、然后修改图片访问链接,改变之前的访问服务器,改变之后的访问腾讯云

3、开始迁移服务器图片至腾讯云

4、迁移完成后将所有图片访问链接全部换成访问腾讯云

5、删除之前的图片资源

其实 1、2、4、5 步都比较好做,主要是第 4 步。既然过滤掉失效的图片,所以必须要走数据库了,因为数据量太大,程序肯定是要放后台跑的,而且不能一次跑完,用脚本分批次处理。


主要操作逻辑如下

<?php
//1、每次从数据库中获取部分数据,然后遍历检测这些图片是否还存在服务器上,不存在不迁移,存在就拼接路径,上传到腾讯云
//2、遍历当前数据组获取最后一个图片id,存入缓存中
//3、下次循环从缓存中获取id,执行(id > 缓存中id)下一批次的处理
//4、写一个shell在后台执行这个php文件,每次执行完sleep 2秒

大概一天可以迁移 30 多万图片,用了 3 天左右迁移完成。

本来想的是把图片重新按照文件夹分类,然后用腾讯云的 COSBrowser 工具上传上去,但是考虑到有的图片已经失效,所以必须要跑一遍数据库来检测,就用的分批次处理来完成。

或许有更好的方法,但是当时可能没有想到......

结束语:感谢您对本网站文章的浏览,欢迎您的分享和转载,但转载请说明文章出处。
Top