FastDFS
来源:互联网 发布:淘宝店铺会员设置折扣 编辑:程序博客网 时间:2024/05/26 08:41
最近项目中用到了图片的上传和下载,用到了FastDFS。
一、简介
互联网上要存储大量的图片、文件信息, 刚开始是简单的静态资源的读写分离,但是随着网站数量的增减,图片服务器成为整个网站的短板。所以催生了fastdfs.
fastdfs是开源的、高性能的分布式文件系统。主要功能包括:文件存储、同步和访问,设计基于高可用和负载均衡。Fastdfs非常适合于文件服务的站点。例如图片分享和视频分享网站。
fastdfs有两个角色:跟踪服务和存储服务,(1)跟踪服务控制,调用以负责均衡的方式来访问。(2)存储服务包括,文件存储、文件同步,提供文件访问接口,同时以key value的方式管理文件的元数据。
二、特色
1.轻量级
轻量级,FastDFS分为两个角色,Tracker Server和Store Server,Tracker Server作为中心的节点,主要的作用是负载均衡和调度。Tracker在内存中只是记录分组和Storeage Server的状态等信息,并不记录索引信息,占用的信息很少。
另外,客户端(应用)和Storage Server访问Tracker Server 时,Tracker会扫描内存中的分组和Storage Server信息,然后给出应答。
在FastDFS中,客户端上传之后,文件的Id并不是由客户端指定,而是由Storage server生成之后,返回给客户端的。文件Id中包含了组名/文件相对路径和文件名称。Storage Server可以根据文件的Id直接定位到文件,因此FastDFS中不需要存储文件索引信息,这是FastDFS比较轻量级的一个例证。而其他系统需要存储文件索引信息,所以比较受限。
2.分组存储
FastDFS采用了分组存储方式。集群由一个或者多个组构成。集群存储的总容量为集群中所有组的存储容量之和。一个组由一台多多太存储服务器组成。一个组内的多台Storage Server之间是互备关系。同组存储服务器上的文件是完全一致的。文件的上传/下载和删除等操作可以在组内任意一台Storage Server上进行。类似于木桶短板效用,一个组的存储容量是组内存储服务器上容量最小的那个,因此组内存储服务器的软硬件配置最好是一致的。
采用分组存储的好处是灵活/可扩展性比较好。比如:上传文件时,可以由客户端直接上传到指定的组。一个分组的存储服务器访问压力比较大时候,可以直接在改组增加存储服务器来扩充服务器的能力。当系统容量不足的时候,可以增加组来扩充存储容量。
3.对等结构
从图中看出,Tracker Server之间相互独立 ,Storage Server主动向Tracker Server报告其状态信息,包括磁盘剩余情况/文件同步情况/文件上传下载次数等信息。Storage server会连接集群中所有的Tracker Server,向他们报告自己的状态。Storage Server会启动一个单独的线程来完成对一台Tracker Server的连接和定时报告。需要说明的是,一个组内的Storage server不是通过配置文件设定的,而是通过Tracker Server来获取的。
不同组之间不能够通信,一个组内的Storage Server之间会相互连接进行文件同步。
三、上传和下载流程
1.上传流程
上传的过程如下:
1.client询问Tancker Server 要上传到的Storage Server;
2.Tracker server返回一台可以使用的Storage Server,返回的数据包含Storage Server 的ip地址和端口号。
3.Client直接和该Storage Server建立连接,进行文件上传。Storage Server返回新生成的文件Id,文件上传完成。
2.下载流程
下载的过程如下:
1.Client询问Trancker server 可以下载制定文件的Storage Server,参数为文件Id(包含组名河文件名称)
2.Tracker Server 返回一台可用的Storage Server;
3.Client 直接和该Storage Server建立连接,完成文件下载。
3.文件存储路径
四、上传文件代码
1.引入FastDFS提供的jar包引入到工程中。
2.添加client.conf文件。
tracker_server=192.168.25.***:22122
3.测试代码如下:
备份/** * 测试fastdfs * @throws Exception */@Testpublic void testUpload() throws Exception {// 初始化全局配置,加载client.conf文件。ClientGlobal.init("F:\\ceshi\\dmsd-itoo-vb-web\\src\\profiles\\local\\Client.conf"); // 创建TranckerClient对象 TrackerClient trackerClient = new TrackerClient();// 创建一个TrackerServer对象。TrackerServer trackerServer = trackerClient.getConnection();// 声明一个StorageServer对象,null。StorageServer storageServer = null;// 获得StorageClient对象。StorageClient storageClient = new StorageClient(trackerServer, storageServer);// 直接调用StorageClient对象方法上传文件即可。String[] strings = storageClient.upload_file("C:\\Users\\lizhenjuan\\Desktop\\图片设计参考\\logo添加到最上面_副本.jpg", "jpg", null);for (String string : strings) {System.out.println(string);}}
4.访问路径,测试是否上传成功。
访问效果如下图:
五、参考连接
FastDFS介绍和配置过程
FastDFS海量数据分布式存储方案
分布式文件系统FastDFS架构剖析
- fastdfs
- fastdfs
- FastDFS
- FastDFS
- fastdfs
- FastDFS
- fastdfs
- FastDFS
- FastDFS
- FASTDFS
- FastDFS
- fastdfs
- FastDFS
- fastdfs
- fastDFS
- FastDFS
- FastDFS
- fastDFS
- 2456: mode
- Java进击C#——应用开发之Asp.net
- C++中cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
- Phoenix二级索引
- 深入理解Java虚拟机之高效并发(读书笔记)
- FastDFS
- ajax基础
- centos编译安装nginx,及其编译参数解析
- 项目进度(六)
- java 在o(1)时间内删除链表结点
- 数据库
- c++ primer 9.2.5节练习
- 基础算法题-数组相关
- MyFlag Step6:app详细页面设计与代码编写