FastDFS 学习
目录
FastDFS 学习笔记
- FastDFS 简介 FastDFS 服务端有两个角色:跟踪器(tracker)和存储 节点(storage)。跟踪器主要做调度工作,在访问上起负载均衡的作用。 存储节点存储文件,完成文件管理的所有功能:就是这样的存储、同步和提供存取接口,FastDFS 同时对文件的 metadata 进行管理。所谓文件的 meta data 就是文件的相关属性,以键值对(key value)方式表示,如:width=1024,其中的 key 为 width,value 为 1024。文件 metadata 是 文件属性 列表,可以包含多个键值对。 跟踪器和存储节点都可以由一台或多台服务器构成。跟踪器和存储节点中的服务器均可以随时增加或下线而不会影响线上服务。其中跟踪器中的所有服务器都是对等的,可以根据服务器的压力情况随时增加或减少。 为了支持大容量,存储 节点(服务器)采用了分卷(或分组)的组织方式。存储系统 由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台 存储服务器 组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了 冗余备份 和负载均衡的作用。 在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。 当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了 存储系统 的容量。 FastDFS 中的文件标识分为两个部分:卷名和文件名,二者缺一不可。
- 大胆分析 这里在淘淘的后台上传图片的时候用到了,确实好用也是 c 语言开发的 搭配* Nginx 贼方便,确实佩服那些搞* C *的大佬,上面的说法不够直白文字总是苍白的 ( ̄▽ ̄)~让我来强行解释一波!image 上面说到了 FastDFS **主要有两个节点
- 储存节点 Storage
顾名思义就是用来储存文件的服务器这个图中的是比较复杂的情况这里有一个 stroage 群里又分了很多组每个组里又有很多服务器(这里的服务器里面储存的文件是一样的 会自动同步 方便加机器) - 监控节点 Tracker
这个就跟 zookeper 作用有点像先上图
这个是上传的过程可以看到客户端要上传图片都是通过 Tracker 的而储存节点也会定时向 Tracker 发送状态的信息监控 Storage 的状态
可以看出上面 Client 在上传图片成功后 Storage 返回了一个 file_id 然后客户端就会储存这个 id 那客户端是如何通过这个 id 访问到这个图片的呢? ---没错就是 Nginx 用 Nginx 来处理这些静态资源再好不过了
- 使用
说了这么多来实际用用看吧
- 首先我们要在虚拟机上安装 FastDFS 并配置 Nginx 这个过程比较复杂也不是我们重点关心的问题是运维应该关心的问题这里有一个搭建好的最简单的 FastDFS 服务器 开机就可以直接用服务都是开机自启动的
- 然后我们要有客户端这里 FastDFS 作者已经写好了 JAVA 的客户端我们直接拿来用就好了 fastdfs_client 的 jar 包
- 开始使用吧
@Test
public void testUpload() throws Exception {
//1、加载配置文件,配置文件中的内容就是 tracker 服务的地址。
//配置文件内容:tracker_server=192.168.25.133:22122
ClientGlobal.init("D:\\JavaDemo\\taoshop-web\\src\\main\\resources\\conf\\client.conf");
//2、创建一个 TrackerClient 对象。直接 new 一个。
TrackerClient trackerClient =new TrackerClient();
//3、使用 TrackerClient 对象创建连接,获得一个 TrackerServer 对象。
TrackerServer trackerServer = trackerClient.getConnection();
//4、创建一个 StorageServer 的引用,值为 null
StorageServer storageServer =null;
//5、创建一个 StorageClient 对象,需要两个参数 TrackerServer 对象、StorageServer 的引用
StorageClient storageCilent =new StorageClient(trackerServer,storageServer);
//6、使用 StorageCilent 上传文件
String[] strings = storageCilent.upload_file("C:\\Users\\Administrator\\Desktop\\image\\222.jpg","jpg", null);
for (String string : strings) {
System.out.println(string);
}
这里最后也就是为了的到 StorageServer 对象 我们可以写个工具类方便我们上传,将得到的 file 信息直接放在虚拟机 ip/后面 成功访问到了这张图片!还是很方便的。
- 在淘淘商城中的运用 在淘淘中主要是用在后台的图片上传上的 这里用的是 ssm 的组合 SpringMVC 上传图片首先要有 commons.io 和 fileupload 的 jar 包还有配置多媒体解析器 在这里我也遇到了一个小问题 他在这里用的是* KingEditor* 上传图片时要求返回的格式是
//成功时
{
"error" : 0,
"url" : "http://www.example.com/path/to/file.ext"
}
//失败时
{
"error" : 1,
"message" : "错误信息"
}
我直接返回的一个 map 然后前台解析不出来出现了问题后来用 fastJson 把 map 转成 json 后就好了但是其实传还是传到了图片服务器上去了
- 在做这个的时候还遇到了一些奇怪的问题就是如果修改代码后马上重新启动项目会报错 clean 一下就好了。