赞
踩
一、fastDFS是什么
fastDFS是c语言编写的一款开源分布式文件系统,使用fastDFS可以很方便搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
二、fastDFS工作原理
fastDFS包括Tracker server和Storage server,客户端请求Tracker server进行文件上传和下载,Tracker server通过调度Storage server完成上传和下载。如下图所示:
详细解释:
(1)Tracker Server
其作用是负载均衡和调度,通过Tracker可以在文件上传时根据一些策略找到Storage提供文件上传服务,Tracker也就是追踪/调度服务器。
(2)Storage
其作用是文件存储,客户端上传的文件实质上都是保存在Storage服务器上,Storage也就是存储服务器。Storage会连接集群中的所有Tracker,定时向他们报告自己的磁盘剩余空间、文件同步状态、文件上传下载次数等统计信息,Tracker可以根据每组Storage的状态来进行调度。
Storage集群采用分组存储方式,Storage集群由一个或者多个组构成,其存储总量为集群中所有组的存储容量之和。一个组由一台或多台存储器构成,同组内的Storage之间会相互连接进行文件同步,从而保证同组内的每个storage文件完全一样,不同组的storage之间不会相互通信的。一个组的存储容量为该组内存容量最小的那个。
上传文件流程
说明:
客户端上传文件之后,服务器会返回文件id,该id用于之后访问该文件。内容包括:组名、虚拟磁盘路径、数据两级目录、文件名。如下所示:
组名:文件上传之后文件所在的storage组名称,需要客户端自行保存。
虚拟磁盘路径:与配置的store_path*对应。例如配置store_path0则对应M00,配置store_path1则对应M01…
数据两级目录:storage在每个虚拟磁盘路径下创建两级目录,用于存储数据文件。
文件名:不是上传时的文件名,而是存储服务器根据特定信息生成的,文件名包含:原存储服务器ip、文件创建时间戳、文件大小、随机数和文件拓展名等。
下载文件流程:
说明:
tracker根据客户端提供的文件id来快速定义文件,通过组名定位到客户端需要访问的存储器服务器是哪个组,并选择合适的存储服务器提供给客户端访问;虚拟路径可以找到对应文件的存储路径,再根据文件的两级目录和文件名,就可以很快的找到需要下载的文件。
三、fastDFS安装与配置
1、下载地址:https://github.com/happyfish100/fastdfs/releases
选择自己所需要的版本下载,如下所示:
2、安装libfastcommon依赖
由于要从gitbub上clone依赖libfastcommon,所以先安装git
apt install git
克隆
git clone https://github.com/happyfish100/libfastcommon.git
完成之后libfastcommon中包含如下文件:
进入libfastcommon文件夹执行如下命令:
./make.sh
./make.sh install
注:在32位ubuntu中,libfastcommon会安装在/usr/lib 中,64位系统则安装在 /usr/lib64 中,如下图:
根据系统执行如下命令:
export LD_LIBRARY_PATH=/usr/lib64/
或
export LD_LIBRARY_PATH=/usr/lib/
ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so
或
ln -s /usr/lib/libfastcommon.so /usr/local/lib/libfastcommon.so
3、解压并安装fastDFS
tar -zxvf fastdfs-5.11.tar.gz
进入解压目录:
cd fastdfs-5.11
执行以下:
./make.sh
./make.sh install
执行完成之后,进入"/etc/fdfs"目录下,可以看到如下配置示例文件:
接下来,我们将使用storage.conf.sample,tracker.conf.sample两个进行配置。首先将文件的".sample"去掉,也就是重命名一下。
(1)修改tracker.conf 文件
注:以下凡是出现配置目录的地方,必须是存在的目录。
tracker的数据log文件目录(路径必须存在),如下:
服务端口设置:
(2)修改storage.conf文件
组名设置:
虚拟路径映射的路径(路径必须存在):
stroage的数据log文件目录(路径必须存在),如下:
tracker服务器ip和端口:
storage的服务端口:
4、启动tracker和storage
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf
5、使用java测试
FastDFS java client SDK:
https://github.com/happyfish100/fastdfs-client-java
放置在java工程resource目录下:
conf/fastdfs-client.properties
## fastdfs-client.properties
fastdfs.connect_timeout_in_seconds = 5
fastdfs.network_timeout_in_seconds = 30
fastdfs.charset = UTF-8
fastdfs.http_anti_steal_token = false
fastdfs.http_secret_key = FastDFS1234567890
fastdfs.http_tracker_http_port = 80
fastdfs.tracker_servers = ip:22122
上传:
//要上传的文件地址 public static String local_filename = "E:\\test.txt"; public static void testUpload() { try { //加载fastDFS客户端的配置文件 ClientGlobal.initByProperties("conf/fastdfs-client.properties"); //创建tracker的客户端 TrackerClient tracker = new TrackerClient(); TrackerServer trackerServer = tracker.getConnection(); StorageServer storageServer = null; //定义storage客户端 StorageClient storageClient = new StorageClient(trackerServer, storageServer); NameValuePair nvp [] = new NameValuePair[]{ new NameValuePair("fileName", "test.txt"), }; //执行上传 String fileIds[] = storageClient.upload_file(local_filename, "txt", nvp); System.out.println("上传组名:" + fileIds[0]); System.out.println("上传路径: " + fileIds[1]); trackerServer.close(); } catch (Exception e) { e.printStackTrace(); } }
下载:
public static void testDownload() { try { ClientGlobal.initByProperties("conf/fastdfs-client.properties"); TrackerClient tracker = new TrackerClient(); TrackerServer trackerServer = tracker.getConnection(); StorageServer storageServer = null; StorageClient storageClient = new StorageClient(trackerServer, storageServer); byte[] b = storageClient.download_file("group1", "M00/00/00/wKgAA1zWw0eAbML5AAAAFtpUszA462.txt"); String downFile = new String(b, "UTF-8"); System.out.println(downFile); } catch (Exception e) { e.printStackTrace(); } }
删除:
public static void testDelete() {
try {
ClientGlobal.initByProperties("conf/fastdfs-client.properties");
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getConnection();
StorageServer storageServer = null;
StorageClient storageClient = new StorageClient(trackerServer, storageServer);
int i = storageClient.delete_file("group1", "M00/00/00/wKgAA1zWw0eAbML5AAAAFtpUszA462.txt");
System.out.println(i == 0 ? "文件删除成功" : "文件删除失败:" + i);
} catch (Exception e) {
e.printStackTrace();
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。