一、分布式文件系统的应用场景
可以解决高效存储;用户量访问大时,怎么保证下载速度?
二、文件系统是什么?
总结:文件系统是负责管理和存储文件的系统软件,它是操作系统和硬件驱动之间的桥梁,操作系统通过文件系统 提供的接口去存取文件,用户通过操作系统访问磁盘上的文件。如下图:
常见的文件系统:FAT16/FAT32、NTFS(前两者都是微软开发的)、HFS(苹果开发的文件系统)、UFS(UNix)、APFS(苹果文件系统)、XFS(硅谷图形公司开发的高性能日志式文件系统)、Ext4(Linux系统下的日志文件系统)等 。
三、什么是分布式文件系统?
分布式文件系统是文件系统管理的物理存储不一定在本地节点上,而是通过计算机网路与节点相连。换句话说,通过计算机网络,将分布在网络各个节点的文件系统,组织成一个网络文件系统。
四、为什么要有分布式文件系统?
采用分布式文件系统可以将多个地点的文件系统通过网络连接起来,组成一个文件系统网络,结点之间通过网络进 行通信,一台文件系统的存储和传输能力有限,我们让文件在多台计算机上存储,通过多台计算共同传输。如下 图:
好处:
1、一台计算机的文件系统处理能力扩充到多台计算机同时处理。
2、一台计算机挂了还有另外副本计算机提供数据。
3、每台计算机可以放在不同的地域,这样用户就可以就近访问,提高访问速度。
五、fastDFS
5.1、介绍
fastDFS是C语言编写的,由淘宝资深架构师余庆编写,并开源。网络通信用socket,特别快。其他的通用性比较高,但是性能差。而fastDFS是开发体验性差,但是性能高。
5.2、架构
5.3、上传流程
Storage Server 定时上报状态信息给Tracker Server,Client发送上传请求到Tracker Server,Tracker Server给Client 返回一个IP+端口的信息,然后Client根据这个服务器地址上传到对应的服务器后,将文件存储到服务器,返回一个file_id(组名+路径信息+文件名),然后Client将file_id存储到本地。
这里是直接用的余庆老师的fastdfs-client-java,可以使用fastdfs-client,具体操作点击链接
上传代码
配置 文件
在classpath:config下创建fastdfs-client.properties文件
fastdfs.connect_timeout_in_seconds = 5 #http连接超时时间
fastdfs.network_timeout_in_seconds = 30 #tracker与storage网络通信超时时间
fastdfs.charset = UTF‐8 #字符编码
fastdfs.tracker_servers = 192.168.101.64:22122 #tracker服务器地址,多个地址中间用英文逗号分隔
API
TrackerClient , TrackerServer , StorageClient(StorageClient1) , StorageServer ;
private static void uploadFile() throws IOException, MyException {
//1.加载fastDFS配置文件
ClientGlobal.initByProperties("config/fastdfs-client.properties");
//2. 构造TrackerClient
TrackerClient trackerClient = new TrackerClient();
//3. 获取TrackerServer
TrackerServer trackerServer = trackerClient.getConnection();
//4. 构造StorageClient
StorageClient1 storageClient1 = new StorageClient1(trackerServer,null);
//5. 上传文件
String uploadFile1 = storageClient1.upload_file1("D:/1.jpg", "jpg", null);
System.out.println(uploadFile1);
}
5.4、下载流程
Client 携带文件名请求Tracker Server,然后Tracker Server返回一个IP+端口,Client根据服务器地址,找到服务器,再根据file_id(组名+路径+文件名)找到目标文件,然后下载到本地。
下载代码
private static void downloadFile() throws Exception {
//1.加载fastDFS配置文件
ClientGlobal.initByProperties("fastdfs-client.properties");
//2. 构造TrackerClient
TrackerClient trackerClient = new TrackerClient();
//3. 获取TrackerServer
TrackerServer trackerServer = trackerClient.getConnection();
//4. 构造StorageClient
StorageClient1 storageClient1 = new StorageClient1(trackerServer,null);
//5. 下载
byte[] bytes = storageClient1.download_file1("group1/M00/00/06/wKjAhF28-ieABjbwAAIz-JD1R5o403.jpg");
FileOutputStream outputStream = new FileOutputStream(new File("D:/2.jpg"));
outputStream.write(bytes);
outputStream.flush();
outputStream.close();
}
5.5、删除文件
private static void deleteFile() throws Exception {
//1.加载fastDFS配置文件
ClientGlobal.initByProperties("fastdfs-client.properties");
//2. 构造TrackerClient
TrackerClient trackerClient = new TrackerClient();
//3. 获取TrackerServer
TrackerServer trackerServer = trackerClient.getConnection();
//4. 构造StorageClient
StorageClient1 storageClient1 = new StorageClient1(trackerServer,null);
//5. 删除
int i = storageClient1.delete_file1("group1/M00/00/06/wKjAhF28-ieABjbwAAIz-JD1R5o403.jpg");
System.out.println(i);
}