1.介绍FastDFS
1.fastDFS:
是以C语言开发的一项开源轻量级分布式文件系统,他对文件进行管理,
主要功能有:文件存储,文件同步,文件访问(文件上传/下载),特别适合以文件
为载体的在线服务,如图片网站,视频网站等:
2.什么是分布式文件系统:
基于客户端/服务器的文件存储系统,对等特性允许一些系统扮演客户端和服务器的双重角色,
可供多个用户访问的服务器,比如,用户可以“发表”一个允许其他客户机访问的目录,
一旦被访问,这个目录对客户机来说就像使用本地驱动器一样
3.FastDFS架构:
FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage)。
跟踪器主要做调度工作,在访问上起负载均衡的作用。
4.优点:
①海量的存储:主从型分布式存储,存储空间方便拓展,
②fastDFS对文件内容做hash处理,避免出现重复文件
③然后fastDFS结合Nginx集成, 提供网站效率。
2.tracker server 和 storage server
1.Tracker server 追踪服务器
追踪服务器负责接收客户端的请求,选择合适的组合storage server ,tracker server
与 storage server之间也会用心跳机制来检测对方是否活着。Tracker需要管理的信息
也都放在内存中,并且里面所有的Tracker都是对等的(每个节点地位相等),很容易
扩展客户端访问集群的时候会随机分配一个Tracker来和客户端交互。
2.Storage server 储存服务器
实际存储数据,分成若干个组(group),实际traker就是管理的storage中的组,而组内
机器中则存储数据,group可以隔离不同应用的数据,不同的应用的数据放在不同group里面;
3.文件上传和下载分析
1.文件上传过程:
2.文件下载过程:
4.FastDFS工具类
import org
.csource
.common
.NameValuePair
;
import org
.csource
.fastdfs
.*
;
public class FastDfsUtil {
public static String CONF_FILENAME
= FastDfsUtil
.class.getClassLoader()
.getResource("fdfs_client.conf").getFile();
public static String
upload(byte[] file
,String extName
) {
try {
ClientGlobal
.init(CONF_FILENAME
);
TrackerClient tracker
= new TrackerClient();
TrackerServer trackerServer
= tracker
.getConnection();
StorageServer storageServer
= null
;
StorageClient storageClient
= new StorageClient(trackerServer
, storageServer
);
NameValuePair nvp
[] = new NameValuePair[]{};
String fileIds
[] = storageClient
.upload_file(file
,extName
,nvp
);
System
.out
.println(fileIds
.length
);
System
.out
.println("组名:" + fileIds
[0]);
System
.out
.println("路径: " + fileIds
[1]);
return "/"+fileIds
[0]+"/"+fileIds
[1];
} catch (Exception e
) {
e
.printStackTrace();
return null
;
}
}
public static String
upload(String path
,String extName
) {
try {
ClientGlobal
.init(CONF_FILENAME
);
TrackerClient tracker
= new TrackerClient();
TrackerServer trackerServer
= tracker
.getConnection();
StorageServer storageServer
= null
;
StorageClient storageClient
= new StorageClient(trackerServer
, storageServer
);
String fileIds
[] = storageClient
.upload_file(path
, extName
,null
);
System
.out
.println(fileIds
.length
);
System
.out
.println("组名:" + fileIds
[0]);
System
.out
.println("路径: " + fileIds
[1]);
return "/"+fileIds
[0]+"/"+fileIds
[1];
} catch (Exception e
) {
e
.printStackTrace();
return null
;
}
}
public static byte[] download(String groupName
,String fileName
) {
try {
ClientGlobal
.init(CONF_FILENAME
);
TrackerClient tracker
= new TrackerClient();
TrackerServer trackerServer
= tracker
.getConnection();
StorageServer storageServer
= null
;
StorageClient storageClient
= new StorageClient(trackerServer
, storageServer
);
byte[] b
= storageClient
.download_file(groupName
, fileName
);
return b
;
} catch (Exception e
) {
e
.printStackTrace();
return null
;
}
}
public static void delete(String groupName
,String fileName
){
try {
ClientGlobal
.init(CONF_FILENAME
);
TrackerClient tracker
= new TrackerClient();
TrackerServer trackerServer
= tracker
.getConnection();
StorageServer storageServer
= null
;
StorageClient storageClient
= new StorageClient(trackerServer
, storageServer
);
int i
= storageClient
.delete_file(groupName
,fileName
);
System
.out
.println( i
==0 ? "删除成功" : "删除失败:"+i
);
} catch (Exception e
) {
e
.printStackTrace();
throw new RuntimeException("删除异常,"+e
.getMessage());
}
}
}
5.配置文件 fdfs_client.conf
里面配置FastDFS服务器的 ip+端口 -->tracker_server=ip:端口