• DFS架构


    话说到今天为止,使用FDFS已经有一年零2天时间了,在fish和测试兄弟小黑的帮助下一年下来算是没出啥岔子,目前DFS可以说是公司内最稳定的服务之一(其实可以把之一去掉)。最近FDFS在fish的主导下越做越大,论坛起来了,群也起来了,版本迭代也更快了。不过这篇文章是应群中几个朋友的邀约,写下当初自己在使用FDFS时的架构和一些想法。随便,这篇文章是在我女儿出生24小时后在医院抽女儿睡觉时间写下的,在此我先谢谢我可爱的大眼睛女儿给爸爸写这篇bloger的时间。

          首先来一张图:

    fdfs

          这张图其实是一个组内部署的简单示意图,组间的架构示意图其实没有什么好画的,无非就是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

  • 相关阅读:
    每日总结3.8
    Go中定时器实现原理及源码解析
    Go语言实现布谷鸟过滤器
    详解Go语言调度循环源码实现
    Go语言中时间轮的实现
    详解Go语言I/O多路复用netpoller模型
    详解Go中内存分配源码实现
    Go中由WaitGroup引发对内存对齐思考
    【分享】java精品实战教程
    nginx实战教程
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/1908821.html
Copyright © 2020-2023  润新知