[原]23.app后端如何架设文件系统
现在app展现内容的形式多种多样的,有文字,图片,声音,视频等等,其中文件占了一个很大的比重。随着app不断运营,文件会越来越多,占用的磁盘空间也不断增大,架设一套高效的文件系统,对于整个app架构有着巨大的影响。
1. 如果可能,使用成熟的文件云存储服务
对于创业公司来说,我一直推崇的架构原则是“ 尽量使用成熟的第三方服务和软件,自己只负责业务逻辑”。
架设文件系统,需要牵涉到文件的分布式存储,图片水印,图片缩放,还有CDN等方面,每方面都能耗费掉巨大的开发成本和运维成本。
对于小团队来说,我不觉得得开发人员自己弄这些服务做得比专业的第三方云存储服务好,所以还是别折腾,用第三方云存储服务吧。
而且,我觉得,平均算起来,用第三方云存储服务,比起后端人员开发和运维的成本低多了,想想开发人员钻研和开发这些文件服务所需的时间就知道了。特别是云存储的下载速度,记得我当时第一次使用云存储下载文件吓呆了,居然达到了10M/s的下载速度,大家想想,这么快的下载速度,是多爽的用户体验,带来飞一般的感觉。
2. 架设文件系统
当然了,不一定每个团队内部都同意使用第三方云存储服务,很多老大的想法是要把核心数据掌握在手上,这个时候就只能走架设文件系统之路。
App后端的文件系统,我认为涉及到下面3个方面:
(1)分布式文件存储
对于app的业务来说,分布式文件存储的要求其实很简单:
a. 需要扩容的时候,只需要简单的添加机器就能做到,不需要重启整个文件系统上的机器。
b. 保证高可用,冗余备份,避免某台机器挂掉了,文件服务就停止了。
在移动互联网时代,处了视频类的应用外,其他应用都是以小文件为主,所以我觉得分片式的文件系统不需要考虑,涉及到文件的分片问题,那运维和架构就很复杂了。例如,怎么知道某个文件是否已经损坏了?
这里我向大家推荐的分布式文件存储系统是FastDFS。
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
据我了解,FastDFS已经在UC,56,Kugou等IT企业被广泛使用,其中Kugou用FastDFS保存着500TB的文件。
在生活中的仓库里,有很多货柜用来存放货物,怎么能保证无论增大了多少货柜,都能被合理使用的呢?
核心是每个仓库里都有一个仓库管理员,当增加了货柜,仓库管理员都收到。当工人需要向仓库里放货物,先问仓库管理员哪个货柜有足够的空间存放货物,仓库管理员会告知工人具体哪个货柜,然后工人走到对应的货柜中存放货物。
上面仓库中的仓库管理员和货柜,就是FastDFS在生活中的模型。
FastDFS就是仓库, FastDFS里有两大角色:跟踪器(tracker)和存储节点(storage)。跟踪器(tracker)就是仓库管理员,主要做调度工作,在访问上起负载均衡的作用。存储节点(storage)就是货柜。
存储节点(storage)采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。
上面就是FastDFS的简单介绍,有关FastDFS的具体工作原理,各位可在网络上搜索相关的文章详细了解。
(2)图片水印,缩放和裁剪
图片操作是非常消耗CPU,内存,和大量的磁盘IO,所以在选择图片处理工具要慎重!!!
推荐使用GraphicsMagick,一个久经考验的图片处理软件,支持多个平台,而且支持多种语言的客服端。GraphicsMagick是ImageMagick的一个分支,相对于ImageMagick而言,TA处理速度更快,消耗资源更少,并且大的图片处理网站,如 Flickr and Etsy 已经在使用TA了。
具体的实现方法,可查看我写的两篇博客《app后端设计(12)--图片的处理》,《app后端设计(13)--IM4JAVA+GraphicsMagick实现中文水印》 。
(3)CDN
CDN,最大的作用就是使图片,音频,视频等静态文件下载速度更快,用户体验更好。
在访问量大的时候,通过CDN,把图片,音频,视频等静态文件挡在服务器前,也是一种应付高并发的方法。
不是国内一二线的互联网企业,就不要考虑架设专属的CDN网络啦,乖乖购买CDN服务吧。
现在除了传统的CDN服务商外,阿里云和ucloud也提供了CDN服务,极大地方便了开发者。
另外,很多CDN服务商都提供了图片的水印,缩放和裁剪功能,如果能直接使用就不需要在图片上花费额外的开发成本。
---------------------------------------------------------------------------------------------------------------------------
打开链接 app后端系列文章总目录 总目录 ,能查看本人发表过的所有原创“app后端”文章。
【作者】曾健生
【QQ】190678908
【app后端qq群】254659220
【微信公众号】 appbackend
【新浪微博】 @newjueqi
【博客】http://blog.csdn.net/newjueqi