存储是一个很广泛的概念,有很多种存储技术,比如数据库存储、内存存储、对象存储、块存储、文件存储等。
可以从多个不同的角度进行存储优化,比如
- 存储空间优化
- 存储成本优化
- 存储安全性优化
- 存储可用性优化
- 存储可靠性优化
- 存储性能优化
下面分别介绍每一点,分享一些通用的存储优化手段(不仅仅局限于对象存储这一种存储技术)。
主要的目标是减少存储空间的占用,常用的方法有:
- 压缩:使用压缩算法对数据进行压缩,减小存储空间的占用。常见的压缩算法有 gzip、zstd 等。
- 分区分表:常用于数据库和大数据存储,将大量数据分别存放于不同的分区和表中,从而提高单表查询性能,并减小单表数据量。
- 数据清理(归档):定期清理过期或不再需要的数据。或者将不常用的数据归档到其他存储中。就像我们管理自己的电脑一样,多余的文件可以拷贝到单独的硬盘里。
- 数据去重:去除重复的数据或者复用数据,常用于网盘系统的实现(比如秒传功能)。
顾名思义,减少存储消耗的成本。
存储空间优化一般情况下也会带来存储成本的优化,但是二者的概念不完全相同。
存储成本优化除了空间方面的考虑外,还要考虑存储管理和维护成本、设备成本、使用成本等,目标是在提供足够性能和可用性的前提下,降低整个存储系统的总体成本。
常用的优化方法有:
- 选择合适的存储技术:专业的存储服务特定的业务,比如用图数据库存储关联数据、向量数据库存储向量数据,往往“事半功倍”。
- 合理采购存储资源: 从需求和业务出发,评估存储用量,避免过度购买存储资源。
此外,不同存储的成本优化方式不尽相同,比如本节要讲到的 COS 对象存储,官方提供了一些成本优化的建议。
存储安全性优化的目标是保护存储数据的完整、安全,防止数据泄露等。
常用方法有:
- 数据加密:使用合适的加密算法确保数据在存储过程、存储对象上的安全性。
- 备份恢复:定期备份数据,以便在数据丢失或损坏时能够迅速恢复。
- 访问控制:设置合适的权限和访问控制策略,确保只有授权用户能够访问存储的数据。
- 日志审计:记录关键操作的日志,便于出现问题后的故障定位。还可以通过定期查阅日志,提前发现一些潜在的问题。
此外,不同存储的安全性优化方式不尽相同。比如本节要讲到的 COS 对象存储,官方提供了很多安全优化的建议,后文会带大家实践。
前文提到的几种优化方式是对于开发者来说相对可干预的,此外,还有一些其他的存储优化角度,比如:
- 存储可用性优化:保证存储系统在任何时候都能正常提供服务,常用方法有容错、冗余备份、故障转移、快速故障检测恢复等。
- 存储可靠性优化:保证数据的完整性和系统地稳定性。可以通过在底层选用高可靠的硬件设备来实现。
- 存储性能优化:提高存储系统的读写速度、降低响应延迟等。
- 存储管理优化:提高操作存储、配置和监控存储资源的有效性,可以通过自动化管理工具实现。
- 存储可观测性优化:更好地检测存储系统的运行状态、资源占用和行为。可以通过可视化监控看板、完备的日志和告警系统实现。
对于开发方向的同学,其他优化角度仅做了解即可。实际开发中,我们一般会选用第三方云服务提供的存储,比如腾讯云的 COS 对象存储,已经为我们提供了可用性、可靠性、性能、存储管理、可观测性的支持保障。
所以接下来,以使用 COS 对象存储为前提,主要从以下几个角度对我们自己的项目进行存储优化。
- 存储空间优化
- 存储成本优化
- 存储安全性优化
主要有以下几种方法:
1)文件压缩:可以将多个文件打包为压缩包。还可以对单个文件进行压缩,比如用户头像、帖子封面等。这也是 COS 官方强烈推荐的方式。
官方自带了图像自动压缩处理的功能(数据万象),点几下配置即可。如下图:
2)文件瘦身:除了压缩文件减少文件体积外,还可以精简文件本身的体积。
3)数据去重:可以通过文件的 MD5 值判断是否已存在相同的文件,如果重复就不再上传,而是将新文件的路径指向已有文件。类似秒传的实现原理,但是实现成本比较高,仅做了解即可。
4)文件清理:定期清理项目中不需要的文件,这是业务开发中最常用的一种方式。
前文已经分享了几个成本优化的方法,比如合适的技术选型、按量购买、节约空间等。
如果使用的是第三方云服务,最好参考官方的成本优化方案,比如 COS 对象存储的成本优化解决方案文档:https://cloud.tencent.com/document/product/436/50201,写得非常详细,阅读一遍能收获很多思路。
鱼皮帮大家总结几个重点。
对于大部分企业来说,存储容量费用 和 流量费用 是其云存储成本的主要组成部分。成本优化也可以从这些角度进行。
要根据实际的需求和业务选择对象存储的类型和业务地域。
腾讯云 COS 提供了标准存储、低频存储、归档存储、深度归档存储,后三种存储类型的存储容量费用较低。
官方提供的费用参考表:
我们会发现,存储总费用最低的存储类型未必最合适。如果业务数据下载量较低,则选择归档存储甚至深度归档存储能有效降低存储成本,最冷的深度归档存储相较标准存储可节省 90% 存储费用;但如果业务数据需要频繁下载,则低频存储、归档存储、深度归档存储的取回费用会带来额外的成本开销,导致整体费用反而更高。
具体到业务场景中,官方推荐:
- 频繁读写场景:例如 UGC 场景、电商图片等读多写少的业务,可使用标准存储类型。如果业务对可用性和数据持久性有高要求,则可以考虑使用标准存储(多 AZ)。
- 少量读场景(一个月读一次):例如日志数据分析、网盘数据等业务,读取频率较低,但读取时对性能要求高,可使用低频存储类型。对可用性和数据持久性有高要求的业务可以使用低频存储(多 AZ)。
- 极少量读场景(三个月读一次):例如视频监控、日志数据归档等业务,读取频率极低,对读取性能要求较低,可使用归档存储类型。
- 基本不读取场景(半年读一次):例如医疗影像、档案资料等业务,日常仅做长期备份用途,对读取性能几乎无要求,可使用深度归档存储类型。
对于大部分数据而言,其访问热度一般随着存储时间延长而降低。因此,如果想严格控制成本,需要根据业务数据访问情况的变化,分析调整数据存储类型。
一般情况下,数据沉降分为 2 个阶段:先分析再沉降。
1)先分析:通过对象存储提供的清单 / 访问日志分析,或者业务代码中自行统计分析。
2)再沉降:可以直接通过对象存储提供的 生命周期 功能自动沉降数据,如下图:
我们可以将很久不访问的数据沉降到存储成本更低的低频存储中。除了利用生命周期功能外,也可以通过数据库记录资源的使用和下载时间,自行调用 API 批量沉降数据或者转储到其他服务。
减少访问的目的是降低流量费,比如使用本地文件缓存,减少访问对象存储的文件。
CDN 本质上也是一种缓存,虽然能减少对象存储的访问(回源),但是会有额外的 CDN 流量费用。
存储安全是至关重要的,如果对象存储访问权限为“公有读”,就处于“半裸奔状态”。下面我们通过多种方式优化。
首先阅读官方文档:https://cloud.tencent.com/document/product/436/50200
官方提供了很多种安全方案:
1)KMS 白盒密钥:和设备绑定,安全性极高;但是成本较高。
2)权限隔离:授权 CAM 用户 可以在哪种条件下,通过哪种方式对哪些资源进行哪种操作。
如下图:
3)对象锁定:对于一些核心敏感数据,如金融交易数据、医疗影像数据等,可通过对象锁定功能来防止文件在上传之后被删除或者篡改。配置对象锁定功能后,在配置的有效期内,存储桶内的所有数据将处于只读状态,不可覆盖写或者删除。
4)数据灾备:通过版本控制和存储桶复制实现异地容灾,进一步保证数据持久性,确保数据误删或者被恶意删除时可从备份站点恢复数据。
版本控制:每次操作都会创建一个新版本的文件,通过“删除标记”来区分文件是否被删除(逻辑删除)。可通过指定版本号访问过去任意版本的数据,还可以进行数据回滚,解决数据误删和覆盖的风险。
存储桶复制:当主存储桶中的数据被删除时,可从备份存储桶中通过批量拷贝的方式恢复数据。
冷备份:考虑到版本控制和存储桶复制功能都可能造成文件数增加,用户也可以通过生命周期功能将一些备份数据沉降至低频或者归档存储等更便宜的存储类型,从而实现低成本冷备。
完整的冷备方案如下图:
此外,还可以通过事中监控(操作对象存储时触发事件通知)、事后追溯(查看日志)等手段,帮助我们分析排查安全性问题。
COS 对象存储的控制台中提供了几个安全管理功能,如图:
包括跨域设置、防盗链配置、服务端加密、安全风险检测等。
跨域访问即通过 HTTP 请求,从一个域去请求另一个域的资源。只要协议、域名、端口有任何一个不相同,都会被当作是不同的域。
注意,跨域是浏览器的限制,一般用于前端直传对象存储的场景。
设置跨域访问的官方文档:https://cloud.tencent.com/document/product/436/13318
进入跨域访问设置控制台:
可以自由添加规则,根据自己的域名、请求方法、需要的请求头信息配置即可:
配置完成后,对象存储(服务端)就会允许该域名的跨域请求,可以灵活添加多条规则:
官方文档:https://cloud.tencent.com/document/product/436/13319
盗链是指在网站或应用程序中,直接引用并展示其他网站上的资源(如图片、音频、视频等),而未经该资源拥有者的许可。比如 A 用户有一个壁纸网站,B 用户直接把 A 用户网站的所有图片爬取到自己网站中,并且用 A 网站的图片地址展示,实际消耗的还是 A 网站的流量!这是一种成本极低、危害极大的攻击方式。
如何防盗链呢?
可以通过请求头中的 referer(网站请求来源)来进行校验,如果请求头中没有该字段,或者不是预期的来源,就禁止请求。
可以在控制台中进行防盗链配置。
假设项目上线的前端域名是 yupi.com
,建议配置白名单,仅允许特定范围的域名访问,并且拒绝空 referer。如图:
保存防盗链设置后,再打开本地域名为 localhost
的前端网站,发现图片无法加载:
打开控制台,发现图片加载请求报错 403,访问被禁止,说明防盗链生效:
再次修改防盗链允许的 Referer,增加 localhost
域名:
再次保存,这次图片正常加载:
官方文档:https://cloud.tencent.com/document/product/436/40117
服务端加密又分为:加密存储和加密传输,适用于安全性较高的使用场景。
加密存储:数据写入磁盘之前,对数据进行加密,并在访问数据时自动解密。加密和解密这一操作过程都是在服务端完成,有效保护数据。
加密传输:COS 提供用 HTTPS 部署 SSL 证书实现加密的功能,在传输链路层上建立加密层,确保数据在传输过程中不会被窃取及篡改。
需要注意的是,文件加密会有一定的性能影响,所以要慎重开启。以下是官方原文:
文件加密需要用客户侧密钥,或者 COS 托管密钥,或者 KMS 密钥将文件内容加密成密文,因此会有一定的性能损耗,主要体现在访问延迟增加。这一延迟增加对大文件读写影响不明显,但在小文件读写中会有一定影响。
可以在服务器加密控制台开启:
COS 提供了盗刷风险检测功能,非常实用,可以轻松发现潜在的安全风险。
如下图,我们的存储访问权限存在风险:
我们对系统的预期是,仅允许登录用户下载资源。而现在用户只要知道文件在 COS 的存储地址,不用登录也可以直接访问下载。
测试一下,直接输入存储地址。由于防盗链限制,无法直接得到文件:
但别忘了,请求是可以构造的!比如复制请求信息为 cURL:
然后修改请求代码,自行添加 Referer 请求头,文件是能够被顺利下载的。
为保证安全,COS 对象存储提供了几种权限管理方法,用户的总权限为这三种管理方法的组合。
如下图:
1)存储桶访问权限:可以控制已有账号、子账号操作存储桶的权限。粒度较粗。
2)自定义 policy 权限:可以更灵活地控制某个用户、在某个条件下、对某个资源的、某种操作权限。粒度更细。
实际使用时,建议两者结合。
COS 对象存储权限校验的流程图如下:
参考访问策略评估流程文档:https://cloud.tencent.com/document/product/436/41516
下面我们来实践一下。
首先创建一个子账户,不建议用主账户,因为权限过大、容易出现权限风险。
进入访问管理控制台:https://console.cloud.tencent.com/cam
快速创建子用户:
注意修改访问方式和用户具有的权限:
需要开启编程访问:
选择策略,直接取消所有默认权限,推荐一条一条按需添加:
新建用户成功后,一定要保存好密码和 SecretKey!用于使用腾讯云 API 访问云资源(包括对象存储)。
遵循最小权限原则, 先将公共权限设置为 “私有读写”,保证只有授权用户才能访问。
然后给新建的子用户增加访问存储桶的权限,注意保存:
验证,图像已无法访问:
下面要开放图片的公开读权限,配置 policy 权限:
添加策略:
配置后再进行验证,用户头像和封面能够正常加载。
但是资源文件无法直接通过客户端请求下载,如下图:
至此,对象存储的安全性优化已完成。还有一些保证安全性的方法,比如生成临时操作对象的密钥,然后在前端直传对象存储等。
阿里云 OSS 推荐阅读编程导航嘉宾神光的教程:https://www.codefather.cn/post/1831923810634362881
编程导航的定制化代码生成项目讲解并实战了多种存储优化方法,比如文件清理机制的设计、权限管理实践等。
👉🏻 编程导航原创项目教程系列:https://yuyuanweb.feishu.cn/wiki/SePYwTc9tipQiCktw7Uc7kujnCd