这篇文章主要介绍了如何安装部署分布式文件系统FastDFS,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
一、FastDFS简介
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage)。跟踪器主要做调度工作,在访问上起负载均衡的作用。
存储节点存储文件,完成文件管理的所有功能:就是这样的存储、同步和提供存取接口,FastDFS同时对文件的metadata进行管理。所谓文件的meta data就是文件的相关属性,以键值对(key value)方式表示,如:width=1024,其中的key为width,value为1024。文件metadata是文件属性列表,可以包含多个键值对。
跟踪器和存储节点都可以由一台或多台服务器构成。跟踪器和存储节点中的服务器均可以随时增加或下线而不会影响线上服务。其中跟踪器中的所有服务器都是对等的,可以根据服务器的压力情况随时增加或减少。
为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。
在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。
当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。
FastDFS中的文件标识分为两个部分:卷名和文件名,二者缺一不可。
二、原理介绍
1.文件上传
FastDFS以客户端库的方式提供基本的文件访问接口如upload、download、append、delete等,Storage 服务会定时的向Tracker服务发送自己的存储信息。当Tracker 服务集群中的Tracker 服务是多个时,各个Tracker服务之间的关系是对等的,因此客户端上传时会任意选择一个Trackre服务。当Tracker服务收到客户端上传文件请求时,会为该文件分配一个可以存储文件的group,当选定了group后就要决定给客户端分配group中的哪一个storage服务。当分配好storage 服务后,客户端向storage发送写文件请求,storage将会为文件分配一个数据存储目录。然后为文件分配一个文件ID标示,然后根据以上的信息生成文件名存储文件。
2.文件同步
上传文件后,客户端将文件写到group内的一个storage 服务即为上传文件成功,storage服务写完文件后,会由后台线程将文件同步至同group内的其他的storage 服务节点上。 每个storage服务写文件后,会同时写一份binlog,binlog里不包含文件数据,只包含文件名等元信息,这份binlog用于后台同步,storage会记录向group内其他storage同步的进度,以便重启后能接上次的进度继续同步;进度以时间戳的方式进行记录,所以最好能保证集群内的所有server的始终保持同步。最后Storage服务的同步进度会作为元数据的一部分汇报到tracker服务上,tracker服务在选择读storage的时候会以同步进度作为参考指标。
3.下载文件
当下载文件时,客户端先询问tracker服务下载文件的storage,参数为文件标识(卷名和文件名);然后tracker向客户端返回一台可用的storage;最后客户端直接和storage通讯完成文件下载。
三、环境准备
1.软件环境
libevent下载地址:http://libevent.org/
libfasttcommon下载地址:https://github.com/happyfish200/libfastcommon/releases
fastdfs下载地址:https://github.com/happyfish200/fastdfs/releases
fastdfs-nginx-module下载地址:https://github.com/happyfish200/fastdfs-nginx-module/releases
2.机器及网络环境
Tracker Server1: 192.168.100.101
Storage Group1 Node1: 192.168.100.102
Storage Group1 Node2: 192.168.100.103
Tracker节点需要安装的组件:libevent、libfasttcommon、fastdfs
Storage节点需要安装的组件:libfasttcommon、fastdfs、nginx、fastdfs-nginx-module
四、部署Tracker服务(192.168.100.101)
1.安装libevent依赖
注:如果机器有外网环境直接yum -y install libevent,本文使用源码包编译安装
解压libevent源码包:tar -zxvf libevent-2.1.11-stable.tar.gz
编译安装前配置:./configure
编译安装:make && make install
默认安装位置:/usr/local/lib
2.安装libfasttcommon依赖
解压libfasttcommon源码包:tar -zxvf libfastcommon-1.0.41.tar.gz
编译安装:./make.sh && ./make.sh install
默认安装位置:/usr/lib64
3.安装FastDFS Tracker服务
解压fastdfs源码包:tar -zxvf fastdfs-6.01.tar.gz
编译安装:./make.sh && ./make.sh install
安装完成后服务及脚本都拷贝到/usr/bin 目录了:
安装完成后配置文件都拷贝到/etc/fdfs目录下了:
将/etc/init.d/fdfs_storaged删掉,因为这台机器只安装Tracker服务
注:编译安装fastdfs需要perl库依赖
设置Tracker服务开机自启动:
chkconfig --add fdfs_trackerd
chkconfig fdfs_trackerd on
五、部署Storage服务(192.168.100.102/103)
1.安装libfasttcommon依赖
解压libfasttcommon源码包:tar -zxvf libfastcommon-1.0.41.tar.gz
编译安装:./make.sh && ./make.sh install
默认安装位置:/usr/lib64
2.安装FastDFS Storage服务
解压fastdfs源码包:tar -zxvf fastdfs-6.01.tar.gz
编译安装:./make.sh && ./make.sh install
安装完成后服务及脚本都拷贝到/usr/bin 目录了:
拷贝/etc/fdfs目录下的Storage配置文件示例:cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
修改 /etc/fdfs/storage.conf中配置项:
base_path=/home/yuqing/fastdfs 改为:base_path=/work/fastdfs/storage(该目录为自己定义,启动时会用,没有会报错)
store_path0=/home/yuqing/fastdfs 改为:store_path0=/work/fastdfs/storage(该目录为自己定义,启动时会用,没有会报错)
tracker_server=192.168.209.121:22122 改为:tracker_server=192.168.100.101:22122
安装完成后启动脚本都拷贝到/etc/init.d目录下了:
启动Storage服务:systemctl start fdfs_storaged
重启Storage服务:systemctl restart fdfs_storaged
停止Storage服务:systemctl stop fdfs_storaged
开放Storage服务端口:
iptables -I INPUT -p tcp --dport 23000 -j ACCEPT
iptables -I INPUT -p tcp --dport 8888 -j ACCEPT
验证当前Storage服务和Tracker服务通信情况:
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
修改各个Storage机器上的nginx服务的配置如下:
六、使用Java客户端测试FastDFS
1.java项目Maven依赖
项目地址:https://github.com/tobato/FastDFS_Client 目前客户端主要依赖于SpringBoot,因此必须引入: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.0.RELEASE</version> <relativePath/> </parent> FastDFS 依赖包: <dependency> <groupId>com.github.tobato</groupId> <artifactId>fastdfs-client</artifactId> <version>1.26.7</version> </dependency> 将FastDFS引入项目: @Import(FdfsClientConfig.class) 在application.yml当中配置Fdfs相关参数: # =================================================================== # 分布式文件系统FDFS配置 # =================================================================== fdfs: so-timeout: 1500 connect-timeout: 600 thumb-image: width: 150 height: 150 tracker-list: - 192.168.100.101:22122 使用接口服务对Fdfs服务端进行操作,主要接口包括: TrackerClient - TrackerServer接口 GenerateStorageClient - 一般文件存储接口 (StorageServer接口) FastFileStorageClient - 为方便项目开发集成的简单接口(StorageServer接口) AppendFileStorageClient - 支持文件续传操作的接口 (StorageServer接口)
2.实际测试案例
package com.maxbill; import com.github.tobato.fastdfs.domain.fdfs.MetaData; import com.github.tobato.fastdfs.domain.fdfs.StorePath; import com.github.tobato.fastdfs.service.FastFileStorageClient; import com.github.tobato.fastdfs.service.TrackerClient; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.util.HashSet; import java.util.Map; import java.util.Set; @Log4j2 @Component public class FdfsClientUtil { private static FdfsClientUtil fdfsClientUtil; @Autowired private TrackerClient trackerClient; @Autowired private FastFileStorageClient storageClient; @PostConstruct public void init() { fdfsClientUtil = this; } private static Set<MetaData> getMetaData(Map<String, String> infoMap) { Set<MetaData> metaDataSet = new HashSet<>(); metaDataSet.add(new MetaData("createUser", "maxbill")); metaDataSet.add(new MetaData("createDate", "2019-11-18")); return metaDataSet; } public static String uploadFile(File file, Map<String, String> infoMap) { try { String fileName = file.getName(); String fileType = fileName.substring(fileName.lastIndexOf("\\") + 1); log.info("upload file name: {}", fileName); StorePath path = fdfsClientUtil.storageClient.uploadFile(new FileInputStream(file), file.length(), fileType, getMetaData(infoMap)); log.info("upload success path: {}", path); Set<MetaData> metaData = fdfsClientUtil.storageClient.getMetadata(path.getGroup(), path.getPath()); log.info("upload success meta: {}", metaData); return path.getFullPath(); } catch (Exception e) { log.error(e.getMessage()); return e.getMessage(); } } }
感谢你能够认真阅读完这篇文章,希望小编分享的“如何安装部署分布式文件系统FastDFS”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。