1.fastDFS介绍
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
分布式文件系统:
基于客户端/服务器的文件存储系统
对等特性允许一些系统扮演客户端和服务器的双重角色,可供多个用户访问的服务器,比如,用户可以“发表”一个允许其他客户机访问的目录,一旦被访问,这个目录对客户机来说就像使用本地驱动器一样
fastDFS是由三部分组成基于客户端/服务器的文件存储系统
对等特性允许一些系统扮演客户端和服务器的双重角色,可供多个用户访问的服务器,比如,用户可以“发表”一个允许其他客户机访问的目录,一旦被访问,这个目录对客户机来说就像使用本地驱动器一样
1.客户端Client
主要是上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。每个客户端服务器都需要安装Nginx
2.管理服务器Tracker Server
追踪服务器负责接收客户端的请求,选择合适的组合storage server ,tracker server 与 storage server之间也会用心跳机制来检测对方是否活着。
Tracker需要管理的信息也都放在内存中,并且里面所有的Tracker都是对等的(每个节点地位相等),很容易扩展
客户端访问集群的时候会随机分配一个Tracker来和客户端交互。
Tracker需要管理的信息也都放在内存中,并且里面所有的Tracker都是对等的(每个节点地位相等),很容易扩展
客户端访问集群的时候会随机分配一个Tracker来和客户端交互。
3.Storage server 储存服务器
实际存储数据,分成若干个组(group),实际traker就是管理的storage中的组,而组内机器中则存储数据,group可以隔离不同应用的数据,不同的应用的数据放在不同group里面,
优点:
- 海量的存储:主从型分布式存储,存储空间方便拓展,
- fastDFS对文件内容做hash处理,避免出现重复文件
- 然后fastDFS结合Nginx集成, 提供网站效率
FastDFS的特性
- 分组存储,灵活简洁、对等结构,不存在单点
- 文件ID由FastDFS生成,作为文件访问凭证,FastDFS不需要传统的name server
- 和流行的web server无缝衔接,FastDFS已提供apache和nginx扩展模块
- 大、中、小文件均可以很好支持,支持海量小文件存储
- 支持多块磁盘,支持单盘数据恢复
- 支持相同文件内容只保存一份,节省存储空间
- 存储服务器上可以保存文件附加属性
- 下载文件支持多线程方式,支持断点续传
系统架构-上传文件流程图
1》client询问tracker上传到的storage; 2》tracker返回一台可用的storage; 3》client直接和storage通信完成文件上传,storage返回文件ID。
系统架构-下载文件流程图
1》client询问tracker下载文件的storage,参数为文件ID(组名和文件名); 2》tracker返回一台可用的storage; 3》client直接和storage通信完成文件下载。
入门Demo
我们在Linux上安装好fastDFS 记录对应的ip
在maven中引入
<dependencies> <dependency> <groupId>org.csource.fastdfs</groupId> <artifactId>fastdfs</artifactId> <version>1.2</version> </dependency> </dependencies>
配置文件
# connect timeout in seconds
# default value is 30s
connect_timeout=30
# network timeout in seconds
# default value is 30s
network_timeout=60
# the base path to store log files
base_path=/home/fastdfs
# tracker_server can ocur more than once, and tracker_server format is
# "host:port", host can be hostname or ip address
tracker_server=192.168.200.128:22122
#standard log level as syslog, case insensitive, value list:
### emerg for emergency
### alert
### crit for critical
### error
### warn for warning
### notice
### info
### debug
log_level=info
# if use connection pool
# default value is false
# since V4.05
use_connection_pool = false
# connections whose the idle time exceeds this time will be closed
# unit: second
# default value is 3600
# since V4.05
connection_pool_max_idle_time = 3600
# if load FastDFS parameters from tracker server
# since V4.05
# default value is false
load_fdfs_parameters_from_tracker=false
# if use storage ID instead of IP address
# same as tracker.conf
# valid only when load_fdfs_parameters_from_tracker is false
# default value is false
# since V4.05
use_storage_id = false
# specify storage ids filename, can use relative or absolute path
# same as tracker.conf
# valid only when load_fdfs_parameters_from_tracker is false
# since V4.05
storage_ids_filename = storage_ids.conf
#HTTP settings
http.tracker_server_port=80
#use "#include" directive to include HTTP other settiongs
##include http.conf
代码
public class TestFastDFS { public static void main(String[] args)throws Exception { //1读取配置文件 ClientGlobal.init("E:\ideaProject\fastDFSdemo\src\main\resources\fdfs_client.conf"); //2 创建管理对象 TrackerClient trackerClient = new TrackerClient(); //3 通过管理对象获取链接 TrackerServer connection = trackerClient.getConnection(); //4 创建存储端对象 StorageClient1 storageClient = new StorageClient1(connection, null); // 5 上传文件 NameValuePair[] meta_list = new NameValuePair[3]; meta_list[0] = new NameValuePair("fileName", "huangjunan"); meta_list[1] = new NameValuePair("ExtName", "jpg"); meta_list[2] = new NameValuePair("zuozhe", "hank"); String path = storageClient.upload_file1("F:\ujiuye\1.jpg", "jpg", meta_list); //6 打印文件地址 //sout System.out.println(path); } }
结果 将结果输入URL栏 我们就可以获取我们上传的图片
控制台打印
group1/M00/00/01/wKjIgF391_GAZwwPAAAuCIHAgDA714.jpg