不同场景下的文件服务选型
文件服务是一个非常基础的功能,一般来说,每个系统都会有类似上传头像、上传图片、上传办公文件等等类似的图片或文件上传功能。
每个项目的这部分功能其实是相似的,要说不同,也就是上传的文件类型不同,大小的限制不一样,访问的权限控制的力度不同,如果一个公司中有多个不同的项目,就非常有必要设计一个通用的文件服务来满足所有的类似的文件上传的功能。
在设计文件服务中,有以下几个关键属性需要我们考虑:
- 文件内容的敏感程度
- 文件平均大小
- 文件的使用方式、使用频率
- 文件的访问控制
- 文件的重要程度
上面列举的文件属性都是从文件本身和使用方面考虑的,属性的不同决定着必须采取不同的方式来对待:
文件内容的敏感程度
什么是内容的敏感程度?敏感数据主要包括个人隐私信息、密码/密钥、敏感图片等高价值数据。用大白话来说就是上传的这个文件,在上传者匿名的情况下,文件的内容会不会暴露上传者或其他人/事物/公司的敏感信息。例如,在金融或支付之类的系统中,文件中包含银行卡号码、电话号码、用户身份证号码,或是企业的合同等等,包含这类信息的文件就可以说是敏感文件。反之像是用户随手发到博客的图片,即使被人无意中看到也没关系,这就不敏感。
在我们设计文件服务服务的时候,如果需要存储敏感文件,那么就要充分的考虑文件内容的保密性。可以采取的常见措施为:
敏感数据识别:接接收到用户上传的数据时,能够有相应的算法实别到该文件属于较为敏感的数据,以便在存储时加以区别对待。
分块存储:即将文件切为很多个块。放在不同的地方,即使得到一块也无法还原文件内容。
加密存储:在文件写入到磁盘保存之前,对文件字节进行加密。如果当年冠希哥懂点安全的话,那观众就少了一个大瓜。
混淆存储:保存文件的时候,用一定的规则将文件内容打乱重排,窃取或看到的人也就看不懂了,从而起到保护文件中机密的作用
同城冗余存储:在同一个城市的多个分区数据中心对文件保存多份副本。当某个可用区不可用时,仍然能够保障数据的正常访问。
跨区域复制:跨越多个不同的地域数据中心之间复制数据,让重要数据一次保存到多个城市,从而实现更高的可用性。
文件平均大小
文件的体积决定着文件的访问和存储的效率。那是不是小文件相对于大文件是不是在读取速度、保存的写入速度等各方面都要快呢?并不是的。
在淘宝系统中,由于商品图片、装修图片、描述图片都属于小图片,系统中就存在海量的小文件,或是在机器学习中,同样的也会用到大量的小文件。对于这些海量的小文件,如果采用常规的存储和访问方式,效率将会极其低下。反过来,大量的大文件也存在相应的问题,于是在这样的背景下,就诞生了各种不同的文件存储系统来适配不同的场景,如:小文件适用的 TFS,大文件适用的 GridFS,还有 HDFS、FastDFS 等等,这里就不做展开了。整理了一些参考,如下。
小文件存储:
大文件存储:
使用方式和频率
保存的文件的访问方式和访问频率通常由使用场景决定,在实际中,我们需要根据工作的负载和访问模式来确定最佳的存储方案。
归档存储:因其价格低廉、通常为离线冷数据存储,非常适合海量、非结构化数据长时间备份。
低频访问:低频访问存储价于标准化的存储和归档存存之间,支持数据实时访问,适用于较低访问频率(平均每月访问频率1到2次)的业务场景。
文件的访问控制
文件是否能公开访问?能否授权给其他人访问?组织内的其他人否访问?
通常情况下,在设计文件服务时,除了默认只有资源拥有者或者被授权的用户允许访问外,还应支持用户授权他人访问或使用自己的上传的文件资源,需要考虑权限控制策略以解决向他人授予特定权限的问题。
重要程度
在现在信息化社会中,数据和文件就是最为重要的资产,如果要保存重要的文件,意味着在存储和使用的过程中需要做好充分的防丢失、防止损坏的措施。应对丢失最常见的方式就是异地、多城、多云同步备份,保持多份文案拷贝,此外文件版本控制机制也能比较好的防止文件意外损坏。
最后,现在处于一个云时代,在实际的工作实践中,我们在做文件系统的设计选型时,通常会考虑在底层使用云存储,例如各平台的对象存储服务(OSS)。那么此时在价格因素之外,还要充分的评估云产品的特性能否匹配到我们系统的使用场景和要求,系统评估后再做决策。