话说到今天为止,使用FDFS已经有一年零2天时间了,在fish和测试兄弟小黑的帮助下一年下来算是没出啥岔子,目前DFS可以说是公司内最稳定的服务之一(其实可以把之一去掉)。最近FDFS在fish的主导下越做越大,论坛起来了,群也起来了,版本迭代也更快了。不过这篇文章是应群中几个朋友的邀约,写下当初自己在使用FDFS时的架构和一些想法。随便,这篇文章是在我女儿出生24小时后在医院抽女儿睡觉时间写下的,在此我先谢谢我可爱的大眼睛女儿给爸爸写这篇bloger的时间。
首先来一张图:
这张图其实是一个组内部署的简单示意图,组间的架构示意图其实没有什么好画的,无非就是copy一份相同的而已。那么下面开始讲解这个架构。
DFS的用处:我们主要把DFS用在存放客户上传的图片或者是系统自己生成的一些单例可http访问文件。其中,99%是客户上传的图片文件。现在DFS基本上已经存储了TB级别的数据。
流程:当用户上传文件时,首先客户端提交图片到Web服务器,然后Web服务器通过socket链接的方式链接tracker,取得接纳上传文件的storage服务器ip和port,然后再链接storage服务器上传文件,最后storage服务器返回文件路径,Web程序将其保存到数据库;当用户访问图片时,首先需要从数据库中取得这个文件的路径,然后通过http的方式直接访问图片即可。
组内部署:2台tracker;2台storage,每台storage配备一个存储(不要太贵的,比最差稍微好一点点就行);2台Squid。其中每台机器都对应启动两个进程,例如一台storage服务器启动了两个fdfs的storage进程,然后两台机器之间正好可以做互备(钱就是这么省的)。
其实差不多就这些,然后讲一下DFS的策略。
1.文件存储:首先我们没有使用FDFS提供的多硬盘存储,原因是不符合我们的需求。FDFS返回值是一个string的数组,0是groupname,1是路径。这里我其实有一个疑问:这个groupname到底是否真的有用?可能是我们当初没有用到,反正我认为当你上传文件和浏览文件时,你肯定知道了这个文件所代表的业务意义,那么也就能确定他的分组,为什么还要返回一个groupname呢?难道就是为了一个tracker配置多个group的storage?其实这个功能并不是非常实用。文件上传时,返回的路径是“/硬盘符/path”,这个路径我们无法直接使用http方式访问,所以只能把前面的“硬盘符”干掉,干掉的话那么服务器的硬盘分区功能将无法使用,还好linux中有挂载磁盘的“挂载点”(真是“谢谢”windows的分盘),所以我们就修改了fdfs的程序,将挂载点和我们的配置结合,我们就可以脱离fdfs中的多硬盘功能,自己完成多硬盘+http访问功能;
2.上传方式:对于分布式的系统而言,延迟是无法避免的。fdfs上传文件的方式有很多种,比如轮询,最小ip等等。考虑到互备和延迟,首先排除轮询。为了达到我们系统的并发量,我们必须要对web服务器做集群,如果上传方式还是用轮询的话,就会出现web方式访问时,文件未同步的问题。虽然这个时间差不多有1分钟而已,但是这种速度对已我们的系统而言已经是无法接受的了,所以我们只能采取上传到一个地方,然后从这个地方取,所以选择“上传到最小IP”方式。但是问题又来了,你上传到一个地方,又从一个地方拿,那么这台机器是不是会负载过量?因为我们的PV在6kw/day以上,所以80%会出问题。所以我们需要使用Squid。Squid有两个作用,第一,它可以作为http的缓存使用,第二,它本身可以存储文件,所以他起到了读写分离的作用。我们没有在Squid上放存储是因为我们的文件有过期,如果大家的文件没有过期的限制,那么这个地方其实可以放存储,这样读写分离做了,而且没有时间的延迟(不到2s,可以忽略不计);
3.我们的集群都是链接到F5上的,这个不讨论;
4.在fdfs的客户端程序中,我们使用的是短链接,目地是为了提高程序的网络连接并发性。但是net或者java都是有GC机制的,所以短链接的情况会在并发量大时出现瓶颈(时间为2-3s),原因是程序把大部分的资源用于GC,而处理链接会被搁置。所以我们使用了连接池,这样即能提高网络链接并发,又能避免GC机制的管理;客户端连接tracker是使用轮询+异常获取方式;
5.安全:我们使用了防止盗链的方式进行安全管理。在互联网上,有防止盗链基本上能防止大部分的问题。还有另外的一些方案,其实都差不多,没有多大的实际用处。比如文件分片,分段,这些其实都治标不治本,而且访问上都会出现一定性能的损耗;
6.http服务器我们选择apache,没有什么理由,唯一的理由就是这个东西用的人比较多,熟悉的人比较多而已。http服务器需要架设到storage服务器上,这样squid才能对其进行反向代理。
当时使用FDFS时,FDFS还是1.21版本,这个版本虽然比较旧,但还是比较稳定的。大家现在使用2.0X版本,我没有用过,所以没有多大的发言权。不过这部分的架构可以参考一下。
上文只供参考,如因此文章引起的“后果”,概不负责。
在抱了我女儿一个晚上后,再抱电脑。眼睛都睁不开,有不通顺的地方请大家见谅。
今天基本上处在睡觉状态,有疑问的请别群里留言,联系xvhfeng@gmail.com。我会在今天晚上统一处理。
http://www.cnblogs.com/Seapeak/archive/2010/12/17/1908772.html