FastDFS——分布式文件系统
FastDFS用在哪里
比如可以作为图片服务器,专门放照片,用来上传和下载图片
图片服务器要求
- 图片服务器存储容量是可以拓展的,不能说这台服务器存满了再换一台服务器。存满了之后加服务器
- 可以实现高可用,这台服务器挂了,还有另外一台可以接着用
- 提供一个统一的访问方式
什么是FastDFS
FastDFS是用c语言编写的一款开源的分布式文件系统。FastDFS为互联网量身定制,充分考虑了冗余备份(高可用)、负载均衡、线性扩容(存储容量不够了)等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务
FastDFS结构
- FastDFS架构包括 Tracker server和Storage server。客户端请求Tracker server进行文件上传、下载,通过Tracker server调度最终由Storage server完成文件上传和下载
- Tracker server作用是负载均衡和调度,通过Tracker server在文件上传时可以根据一些策略找到Storage server提供文件上传服务。可以将tracker称为追踪服务器或调度服务器
- Storage server作用是文件存储,客户端上传的文件最终存储在Storage服务器上,Storage server没有实现自己的文件系统而是利用操作系统 的文件系统来管理文件。可以将storage称为存储服务器
- 服务端两个角色:
Tracker server:管理集群,tracker也可以实现集群。每个tracker节点地位平等。用来收集Storage集群的状态。如果只有一台tracker服务器,挂了以后,client也是找不到storage的
Storage server:实际保存文件
Storage分为多个组,每个组之间保存的文件是不同的,实现扩容。每个组内部可以有多个成员,组成员内部保存的内容是一样的,实现备份,组成员的地位是一致的,没有主从的概念
文件上传、下载过程
- storage定期向tracker发送自己的状态信息,汇报自己的健康状态、存储情况、负载情况,因此tracker记录了storage集群每一台服务器的状态信息
- 当客户端上传和下载图片的时候,知道该往哪个服务器上上传、下载图片吗?client不知道就去问tracker,这时候tracker就会挑一台空闲的、还有存储空间的服务器,返回给client一个IP和端口号,client知道这个IP和端口号以后就可以把信息存储到某个storage上了
- 目前只是存到了某组的某一台服务器上,一个组的服务器之间同步线程,只要一台服务器上存储了,其他都会自动同步内容
上传
客户端上传文件后存储服务器将文件ID返回给客户端,此文件ID用于以后访问该文件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。
- 组名:文件上传后所在的storage组名称,在文件上传成功后有storage服务器返回,需要客户端自行保存
- 虚拟磁盘路径:storage配置的虚拟路径,与磁盘选项store_path*对应。如果配置了store_path0则是M00,如果配置了store_path1则是M01,以此类推
- 数据两级目录:storage服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件
- 文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器IP地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息
下载
FastDFS搭建
如果要自己去搭建一个最小FastDFS文件系统,非常复杂,至少要一天时间,所以不推荐,直接使用下面有人做好的
FastDFS+Nginx实现文件服务器
通过http方式可以访问图片,FastDFS只是解决了图片保存的问题,你要想访问服务器里面的图片,必须安装nginx
图片服务器的安装使用
image-server.7z,这是一个vmware的虚拟机
-
把图片服务器在Windows的某个文件夹下解压缩
-
把图片服务器添加到Vmware中
-
打开image-server虚拟机的时候会出现如下报错情况,原因是两者的vmware版本号不一致
自己的vmware版本号是9
- 一定要选择I moved it,如果选择I copied it将会生成新的Mac地址和网卡,原来的网络配置全都作废,图片服务器即便起来了也不能用。第一次加进来要选择I moved it,第二次要选I copied it
-
192.168.25.133初始是root、itcast,密码改成123456
-
命令startx启动图形界面
-
IP地址为192.168.25.133,更改网络配置
- 这时候因为修改为了25,其他的虚拟机是连不上的,需要修改其他虚拟机的IP地址
FastDFS客户端的使用
- 将fastdfs_client工程导入eclipse,mvn install,添加相关依赖
- 创建配置文件,配置文件中的内容就是tracker服务的地址
tracker_server=192.168.25.133:22122
- 写测试代码
import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.StorageClient;
import org.csource.fastdfs.StorageServer;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;
import org.junit.Test;
public class FastDFSTest {
@Test
public void testFileUpload() throws Exception {
// 1、加载配置文件,配置文件中的内容就是tracker服务的地址。
ClientGlobal.init("D:/workspaces-itcast/e3-manager-web/src/main/resources/resource/client.conf");
// 2、创建一个TrackerClient对象。直接new一个。
TrackerClient trackerClient = new TrackerClient();
// 3、使用TrackerClient对象创建连接,获得一个TrackerServer对象。
TrackerServer trackerServer = trackerClient.getConnection();
// 4、创建一个StorageServer的引用,值为null
StorageServer storageServer = null;
// 5、创建一个StorageClient对象,需要两个参数TrackerServer对象、StorageServer的引用
StorageClient storageClient = new StorageClient(trackerServer, storageServer);
// 6、使用StorageClient对象上传图片。
//扩展名不带“.”
String[] strings = storageClient.upload_file("D:/Documents/Pictures/images/200811281555127886.jpg", "jpg", null);
// 7、返回数组。包含组名和图片的路径。
for (String string : strings) {
System.out.println(string);
}
}
}
-
运行测试代码以后,控制台出现如下的结果
-
通过http可以访问图片服务器
输入的地址如下图