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:端口