FastDFS

来源:互联网 发布:淘宝店铺会员设置折扣 编辑:程序博客网 时间:2024/05/26 08:41

  最近项目中用到了图片的上传和下载,用到了FastDFS。


一、简介


   互联网上要存储大量的图片、文件信息, 刚开始是简单的静态资源的读写分离,但是随着网站数量的增减,图片服务器成为整个网站的短板。所以催生了fastdfs.
   fastdfs是开源的、高性能的分布式文件系统。主要功能包括:文件存储、同步和访问,设计基于高可用和负载均衡。Fastdfs非常适合于文件服务的站点。例如图片分享和视频分享网站。

   fastdfs有两个角色:跟踪服务和存储服务,(1)跟踪服务控制,调用以负责均衡的方式来访问。(2)存储服务包括,文件存储、文件同步,提供文件访问接口,同时以key value的方式管理文件的元数据。

二、特色


1.轻量级


    轻量级,FastDFS分为两个角色,Tracker Server和Store Server,Tracker Server作为中心的节点,主要的作用是负载均衡和调度。Tracker在内存中只是记录分组和Storeage Server的状态等信息,并不记录索引信息,占用的信息很少。
    另外,客户端(应用)和Storage Server访问Tracker Server 时,Tracker会扫描内存中的分组和Storage Server信息,然后给出应答。
   在FastDFS中,客户端上传之后,文件的Id并不是由客户端指定,而是由Storage server生成之后,返回给客户端的。文件Id中包含了组名/文件相对路径和文件名称。Storage Server可以根据文件的Id直接定位到文件,因此FastDFS中不需要存储文件索引信息,这是FastDFS比较轻量级的一个例证。而其他系统需要存储文件索引信息,所以比较受限。


2.分组存储


    FastDFS采用了分组存储方式。集群由一个或者多个组构成。集群存储的总容量为集群中所有组的存储容量之和。一个组由一台多多太存储服务器组成。一个组内的多台Storage Server之间是互备关系。同组存储服务器上的文件是完全一致的。文件的上传/下载和删除等操作可以在组内任意一台Storage Server上进行。类似于木桶短板效用,一个组的存储容量是组内存储服务器上容量最小的那个,因此组内存储服务器的软硬件配置最好是一致的。

   采用分组存储的好处是灵活/可扩展性比较好。比如:上传文件时,可以由客户端直接上传到指定的组。一个分组的存储服务器访问压力比较大时候,可以直接在改组增加存储服务器来扩充服务器的能力。当系统容量不足的时候,可以增加组来扩充存储容量。

3.对等结构


                         

    从图中看出,Tracker Server之间相互独立 ,Storage Server主动向Tracker Server报告其状态信息,包括磁盘剩余情况/文件同步情况/文件上传下载次数等信息。Storage server会连接集群中所有的Tracker Server,向他们报告自己的状态。Storage Server会启动一个单独的线程来完成对一台Tracker Server的连接和定时报告。需要说明的是,一个组内的Storage server不是通过配置文件设定的,而是通过Tracker Server来获取的。
不同组之间不能够通信,一个组内的Storage Server之间会相互连接进行文件同步。


三、上传和下载流程


1.上传流程



上传的过程如下:
1.client询问Tancker Server 要上传到的Storage Server;
2.Tracker server返回一台可以使用的Storage Server,返回的数据包含Storage Server 的ip地址和端口号。
3.Client直接和该Storage Server建立连接,进行文件上传。Storage Server返回新生成的文件Id,文件上传完成。


2.下载流程




下载的过程如下:
1.Client询问Trancker server 可以下载制定文件的Storage Server,参数为文件Id(包含组名河文件名称)
2.Tracker Server 返回一台可用的Storage Server;
3.Client 直接和该Storage Server建立连接,完成文件下载。


3.文件存储路径




四、上传文件代码


 1.引入FastDFS提供的jar包引入到工程中。




 2.添加client.conf文件。

tracker_server=192.168.25.***:22122


3.测试代码如下:


备份/** * 测试fastdfs * @throws Exception */@Testpublic void testUpload() throws Exception {// 初始化全局配置,加载client.conf文件。ClientGlobal.init("F:\\ceshi\\dmsd-itoo-vb-web\\src\\profiles\\local\\Client.conf");           // 创建TranckerClient对象         TrackerClient trackerClient = new TrackerClient();// 创建一个TrackerServer对象。TrackerServer trackerServer = trackerClient.getConnection();// 声明一个StorageServer对象,null。StorageServer storageServer = null;// 获得StorageClient对象。StorageClient storageClient = new StorageClient(trackerServer, storageServer);// 直接调用StorageClient对象方法上传文件即可。String[] strings = storageClient.upload_file("C:\\Users\\lizhenjuan\\Desktop\\图片设计参考\\logo添加到最上面_副本.jpg", "jpg", null);for (String string : strings) {System.out.println(string);}}


4.访问路径,测试是否上传成功。


访问效果如下图:



五、参考连接


FastDFS介绍和配置过程

FastDFS海量数据分布式存储方案

分布式文件系统FastDFS架构剖析


 




原创粉丝点击