一、分布式文件系统
通过独立文件服务器可以解决一些问题,如果某天存储文件的那台服务突然down了怎么办?可能你会说,定时将文件系统备份,这台down机的时候,迅速切换到另一台就OK了,但是这样处理需要人工来干预。另外,当存储的文件超过100T的时候怎么办?单台服务器的性能问题?这个时候我们就应该考虑分布式文件系统了。
业务继续发展,单台服务器存储和响应也很快到达了瓶颈,新的业务需要文件访问具有高响应性、高可用性来支持系统。分布式文件系统,一般分为三块内容来配合,服务的存储、访问的仲裁系统,文件存储系统,文件的容灾系统来构成,仲裁系统相当于文件服务器的大脑,根据一定的算法来决定文件存储的位置,文件存储系统负责保存文件,容灾系统负责文件系统和自己的相互备份。
优点:扩展能力: 毫无疑问,扩展能力是一个分布式文件系统最重要的特点;高可用性: 在分布式文件系统中,高可用性包含两层,一是整个文件系统的可用性,二是数据的完整和一致性;弹性存储: 可以根据业务需要灵活地增加或缩减数据存储以及增删存储池中的资源,而不需要中断系统运行。
缺点:系统复杂度稍高,需要更多服务器
二、什么是FastDFS
FastDFS是一个开源的轻量级分布式文件系统。FastDFS为互联网量身定制,充分考虑了冗余备份(组成员和组成员之间存的数据是一样的,地位相同),负载均衡,线性扩容(加组即可)等机制,并注重高可用、高性能的指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件的上传、下载等服务。
特性:
- 文件不分块存储,上传的文件和OS文件系统中的文件一一对应
- 支持相同内容的文件只保存一份,节约磁盘空间
- 下载文件支持HTTP协议,可以使用内置Web Server,也可以和其他Web Server配合使用
- 支持在线扩容
- 支持主从文件
- 存储服务器上可以保存文件属性(meta-data)V2.0网络通信采用libevent,支持大并发访问,整体性能更好
- FastDFS的一些概念:
- FastDFS服务端有三个角色:跟踪服务器(tracker server)、存储服务器(storage server)和客户端(client)。
Tracker server:作用是负载均衡和调度,通过Tracker server在文件上传时可以根据一些策略找到Storage server提供文件上传服务。可以将tracker称为追踪服务器或调度服务器
Storage server:作用是文件存储,客户端上传的文件最终存储在Storage服务器上,Storage server没有实现自己的文件系统而是利用操作系统 的文件系统来管理文件。可以将storage称为存储服务器。
服务端的两个角色:
Tracker:管理集群,tracker也可以实现集群。每个tracker节点地位平等。收集Storage集群的状态。
Storage:实际保存文件。
Storage分为多个组,每个组之间保存的文件是不同的。每个组内部可以有多个成员,组成员内部保存的内容是一样的,组成员的地位是一致的,没有主从的概念。
client:客户端,作为业务请求的发起方,通过专有接口,使用TCP/IP协议与跟踪器服务器或存储节点进行数据交互。FastDFS向使用者提供基本文件访问接口,比如upload、download、append、delete等,以客户端库的方式提供给用户使用。
Storage群的作用是定期向Tracker集群汇报自己的状态信息,当前的健康状态,存储情况,负载情况。
当客户端(相当于我们的程序)需要上传或者下载图片时,不知道往哪个服务器上传图片,则会询问Tracker(Tracker之间也会同步自己的信息,保证里边的数据是一致的),Tracker则会找一台不忙的并且还有存储空间的服务器,之后返回给客户端IP和端口号,客户端拿到服务器的IP和端口号,就会将图片存到这台服务器上,但是只会存到一台服务器上,组成员之间有一个同步线程,他会自动同步,只要上传到一台服务器,去他的服务器就会自动同步,保证组成员内容一致。
搭建需求:
- FastDFS提供了一个java客户端,也就是一个jar包。
- Storage集群。
- Tracker集群。
三、文件上传下载的流程
- 文件上传的流程:
客户端上传文件后存储服务器将文件ID返回给客户端,此文件ID用于以后访问该文件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。
- 组名:文件上传后所在的storage组名称,在文件上传成功后有storage服务器返回,需要客户端自行保存。
- 虚拟磁盘路径:storage配置的虚拟路径,与磁盘选项store_path*对应。如果配置了store_path0则是M00,如果配置了store_path1则是M01,以此类推。
- 数据两级目录:storage服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。
- 文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器IP地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。
- 文件下载的流程:
四、搭建一个简单的FastDFS
-
五、下载FastDFS的jar包
- 我的FastDFSjar包:https://pan.baidu.com/s/1bnyskO1kt-hSEUP1U5r2Cg
- 提取码:66fd
- 下载好之后将下载的文件fastdfs_client文件放在Maven架包仓库,我上传的文件已经进行了编译,如果不放心可以在进行编译一次,打开cmd进入到fastdfs_client,输入命令mvn clean install进行编译成功之后,就可以在IDEA中使用了
- 不显示报错,说明安装成功
六、测试
//client.conf文件的虚拟机路径,这个虚拟机安装了FastDFS tracker_server=192.168.25.133:22122
package cn.e3mall.fast; import org.csource.fastdfs.*; import org.junit.Test; public class FastDfsTest { @Test public void testUpload() throws Exception{ //前提是连接好的虚拟机配置好FastDFS //创建一个配置文件。文件名任意。内容就是tracker服务器的地址。 //使用全局对象加载配置文件。 ClientGlobal.init("client.conf的全路径名称"); //创建一个TrackerClient对象 TrackerClient trackerClient = new TrackerClient(); //通过TrackClient获得一个TrackerServer对象 TrackerServer trackerServer = trackerClient.getConnection(); //创建一个StrorageServer的引用,可以是null StorageServer storageServer = null; //创建一个StorageClient,参数需要TrackerServer和StrorageServer StorageClient storageClient = new StorageClient(trackerServer, storageServer); //使用StorageClient上传文件。 String[] strings = storageClient.upload_file("所要上传图片的全路径名称", "jpg", null); for (String string : strings) { System.out.println(string); } } }
- 运行结果为:
-
- 直接在网页上测试:
-
- 测试成功