赞
踩
FastDFS 是用 c语言
编写的一款开源分布式文件系统。充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用高性能等指标,使用 FastDFS 很容易搭建一套高性能的文件服务器集群
,并提供文件上传下载等服务。
FastDFS 支持 Linux、FreeBSD 等 UNIX 系统类 google FS,不是通用的文件系统,只能通过专有API访问,目前提供了 C
、Java
和PHP
语言的API,FastDFS 可以看做是基于文件的 key-value(键值对)
存储系统,称作分布式文件存储服务更为合适。
TrackerServer:跟踪服务器。记录 Storage server 的状态
并做调度
工作,就像公交站里面的调务员一样,它负责通过负载均衡
选出最优的存储节点,是连接客户端和存储服务器的枢纽。
Storage server:存储服务器(存储节点)。用于存储文件和文件相关属性。
group:组(卷)。同组内服务器上的文件是完全相同的。
文件标识:由组名和文件名(包含路径)构成。
meta data:文件相关属性。以 key-value 方式存储,如:name=filename,size=1024
fastDFS 架构图如下:
解读:
Client 就是我们的 java 项目,用来写 java 代码,调用 FastDFS API 控制文件上传下载层,开发人员只需要关心这一部分如何写即可。
例如 Client 发送一个写操作的需求,Tracker 跟踪器会去 Storage 存储器中调度一个最优的存储器(存储空间足够或此时无写操作的存储器),并返回可用的 Storage 存储器的 ip 和 端口号给 Client。这种行为类似于我们要在电脑保存一个文件,我们需要先知道哪个盘的空间足够存放这个文件
。
Storage 集群由多个卷(组) 组成,卷与卷之间的资源不同,Storage 存储器的资源是所有卷上资源的组合。
Storage 服务器如需扩容则增加卷即可。
一个卷内又可以分成多个服务器,卷内的服务器资源都是相同的。类似于主备服务器。当文件上传至某个卷时,卷内的服务器都会去同步一份此文件,保证卷内的每个服务器资源一致,以达到备份效果。
可以理解为 Storage 是我们的磁盘,卷(组) 是磁盘中的分区,如C盘、D盘,盘与盘之间的文件各不相同,但是为了备份,C盘内可以创建多个文件夹,每个文件夹中的文件相同。其中一个文件夹坏了还有其他的备份文件夹。
安装包下载地址:https://github.com/happyfish100/
注意
:别全下最新版,会出现版本不对应导致安装缺少东西的问题。建议下载稳定版本
:
fastdfs 6.06
libfastcommon 1.0.43
fastdfs-nginx-module 1.22
nginx 1.16.1
fastdfs下载地址:https://github.com/happyfish100/fastdfs/tree/V6.06
libfastcommon下载地址:https://github.com/happyfish100/libfastcommon/tree/V1.0.43
fastdfs-nginx-module下载地址:https://github.com/happyfish100/fastdfs-nginx-module/tree/V1.22
nginx下载地址:http://nginx.org/en/download.html
准备好的安装包如下:
由于FastDFS 是用 c语言 编写的,所以我们需要准备相关的编译依赖。
[root@localhost ~]# yum install git gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl-devel wget vim -y
[root@localhost ~]# yum -y install unzip
[root@localhost ~]# mkdir /usr/local/src/fastdfs
[root@localhost ~]# mkdir /home/dfs/tracker
[root@localhost ~]# mkdir /home/dfs/storage
[root@localhost ~]# mkdir /home/dfs/storage/store
libfastcommon
为FastDFS操作的基础库,FastDFS没有使用标准的库,而是封装了一 套和FastDFS相关的库。
[root@localhost ~]# cd /usr/local/src/fastdfs
[root@localhost fastdfs]# unzip libfastcommon-1.0.43.zip -d /usr/local/src/fastdfs/
[root@localhost fastdfs]# cd libfastcommon-1.0.43
[root@localhost libfastcommon-1.0.43]# ./make.sh
[root@localhost libfastcommon-1.0.43]# ./make.sh install
至此核心类库安装完成。
[root@localhost ~]# cd /usr/local/src/fastdfs
[root@localhost fastdfs]# unzip fastdfs-6.06.zip -d /usr/local/src/fastdfs/
[root@localhost fastdfs]# cd fastdfs-6.06
[root@localhost fastdfs-6.06]# ./make.sh
[root@localhost fastdfs-6.06]# ./make.sh install
安装后 fastDFS 主程序所在的位置如下:
- 可执行文件:默认 /usr/bin
- 配置文件:默认 /etc/fdfs
- 主程序代码:默认 /usr/bin
- 插件组:默认/usr/include/fastdfs
安装完成后,可进入对应的资源位置查看,是否安装成功。
服务脚本位置:
/etc/init.d 目录下,有脚本文件 fdfs-storaged
和 fdfs-trackerd
配置文件位置:
/etc/fdfs 目录下,有四个配置文件模板,分别是
client.conf.sample
:客户端配置
storage.conf.sample
:存储节点配置
storage_ids.conf.sample
:如果 storage 使用id来标识,而不是 IP,则配置此文件
tracker.conf.sample
:跟踪器配置
内置命令位置:
/usr/bin 目录下,有 fastdfs 的内置命令。
安装 fastdfs-nginx-module 可以使文件通过 http 协议直接在网页输入IP + 端口 + 卷名 + 文件名
的形式直接访问。
[root@localhost ~]# cd /usr/local/src/fastdfs
[root@localhost fastdfs]# unzip fastdfs-nginx-module-1.22.zip -d /usr/local/src/fastdfs/
[root@localhost fastdfs]# cd fastdfs-nginx-module-1.22/src/
[root@localhost src]# vim config
配置 fastdfs 模块组(函数库)的位置
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/
保存退出。
[root@localhost ~]# cd /usr/local/src/fastdfs
[root@localhost fastdfs]# tar zxvf nginx-1.16.1.tar.gz -C /usr/local/src/fastdfs/
[root@localhost fastdfs]# cd nginx-1.16.1/
[root@localhost nginx-1.16.1]# ./configure --add-module=/usr/local/src/fastdfs/fastdfs-nginx-module-1.22/src/
[root@localhost nginx-1.16.1]# make
[root@localhost nginx-1.16.1]# make install
至此 nginx 安装完成。
一般情况下,TrackerServer 跟踪服务器和 Storage server 存储服务器部署在不同的机子上。如果设备条件不允许,也可以一台机子同时作为跟踪器和存储器。
[root@localhost ~]# cd /etc/fdfs
[root@localhost fdfs]# cp tracker.conf.sample tracker.conf
[root@localhost fdfs]# vim tracker.conf
base_path = /home/dfs/tracker
参数名 | 说明 | 默认值 | 备注 |
---|---|---|---|
bind_addr | 是否绑定IP | 无 | 常用于服务器有多个IP但只希望一个IP提供服务,如果不填则表示所有(一般不填) |
port | TrackerServer服务端口号 | 22122 | |
base_path | 存储StorageServer服务器卷下所有端口和节点信息 | /home/yuqing/fastdfs | 根目录必须存在,子目录会自动创建 |
store_server | 选择storage server 进行上传操作时的调度策略 | 0 | 0: 轮询方式 1: 根据ip 地址进行排序选择第一个服务器(IP地址最小者) 2: 根据优先级进行排序,上传优先级由storage server来设置 |
store_path | 选择storage server 中的哪个目录进行上传的调度策略 | 0 | 0: 轮流方式,多个目录依次存放文件 2: 选择剩余空间最大的目录存放文件 |
download_server | 选择哪个 storage server 作为下载服务器的调度策略 | 0 | 0: 轮询方式,可以下载当前文件的任一storage server 1: 哪个为源storage server 就用哪一个 |
[root@localhost ~]# cd /etc/fdfs
[root@localhost fdfs]# cp storage.conf.sample storage.conf
[root@localhost fdfs]# vim storage.conf
base_path = /home/dfs/storage
store_path0 = /home/dfs/storage/store
tracker_server = 192.168.X.X:22122 #你的TrackerServer服务的IP和端口
http.server_port = 8080
参数名 | 说明 | 默认值 | 备注 |
---|---|---|---|
group_name | 组(卷)名称 | group1 | |
port | StorageServer服务端口号 | 23000 | |
base_path | 存放StorageServer数据及日志位置 | /home/yuqing/fastdfs | 根目录必须存在,子目录会自动创建 |
store_path0 | 真正存放上传文件的目录位置 | /home/yuqing/fastdfs | |
tracker_server | TrackerServer 追踪服务器的IP地址及端口 | 192.168.209.121:22122 192.168.209.122:22122 | TrackerServer 是集群就配多个,单机则配一个即可 |
http.server_port | http访问文件的端口 | 8888 | 看情况修改,和nginx中保持一致即可 |
[root@localhost src]# cd /usr/local/src/fastdfs/fastdfs-nginx-module-1.22/src
[root@localhost src]# cp mod_fastdfs.conf /etc/fdfs
[root@localhost src]# cd /etc/fdfs
[root@localhost fdfs]# vim mod_fastdfs.conf
tracker_server=192.168.100.10:22122 #TrackerServer服务器的IP和端口号
url_have_group_name = true #url中是否包含组名
store_path0=/home/dfs/storage/store #文件资源存储位置
保存并退出。
参数名 | 说明 |
---|---|
tracker_server | TrackerServer服务器的IP和端口号 |
storage_server_port | StorageServer服务器的端口号 |
group_name | 组名 |
url_have_group_name | url中是否包含组名 |
store_path0 | 文件资源存储位置 |
[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
# user nobody 改成 user root
user root;
server {
#此端口是storage.conf中的http.server_port端口号
listen 8080;
server_name localhost;
location ~/group[0-9]/ {
ngx_fastdfs_module;
}
}
[root@localhost ~]# cp /usr/local/src/fastdfs/fastdfs-6.06/conf/http.conf /etc/fdfs/
[root@localhost conf]# cp /usr/local/src/fastdfs/fastdfs-6.06/conf/mime.types /etc/fdfs/
[root@localhost ~]# /etc/init.d/fdfs_trackerd restart
[root@localhost ~]# /etc/init.d/fdfs_storaged restart
[root@localhost ~]# /usr/local/nginx/sbin/nginx -s reload
进入 /usr/local/nginx/sbin 目录下,重启 nginx
[root@localhost ~]# cd /usr/local/nginx/sbin
[root@localhost sbin]# ./nginx
服务脚本位置在**/etc/init.d**目录下,进入 init.d 目录
[root@localhost ~]# cd /etc/init.d
[root@localhost ~]# /etc/init.d/fdfs_trackerd start
/etc/init.d 目录下
[root@localhost init.d]# ./fdfs_trackerd status
[root@localhost init.d]# ps -ef|grep fdfs
[root@localhost ~]# /etc/init.d/fdfs_trackerd stop
[root@localhost ~]# /etc/init.d/fdfs_trackerd restart
[root@localhost init.d]# vim /etc/rc.d/rc.local
/etc/init.d/fdfs_trackerd start
[root@localhost ~]# /etc/init.d/fdfs_storaged start
/etc/init.d 目录下
[root@localhost init.d]# ./fdfs_storaged status
[root@localhost init.d]# ps -ef|grep fdfs
[root@localhost ~]# /etc/init.d/fdfs_storaged stop
[root@localhost ~]# /etc/init.d/fdfs_storaged restart
不建议设置 Storage 开机自启,由于Storage服务的启动,前提需要先启动Tracker服务,否则会启动报错。一般手动启动即可。如能够保证Tracker服务长运行,设置Storage自启动也可以。
[root@localhost init.d]# vim /etc/rc.d/rc.local
/etc/init.d/fdfs_storaged start
使用 fastdfs 作者提供的 java API即可。
<dependency>
<groupId>net.oschina.zcx7878</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27.0.0</version>
</dependency>
在 resource 文件夹下创建文件并配置 fastdfs 连接参数
#连接超时
connect_timeout=60
#网络超时
network_timeout=60
#编码格式
charset=UTF-8
#tracker端口号
http.tracker_http_port=8080
#tracker服务器IP+端口号
tracker_server=192.168.100.10:22122
package com.fastdfs.fastdfspro.entity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; /** * 文件信息的封装类 */ @Data @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) public class FastdfsFile { //文件名称 private String name; //文件的内容 private byte[] content; //文件扩展名 private String ext; //文件的摘要 private String md5; //文件作者 private String author; public FastdfsFile(String name, byte[] content, String ext) { this.name = name; this.content = content; this.ext = ext; } }
package com.fastdfs.fastdfspro.utils; import com.fastdfs.fastdfspro.entity.FastdfsFile; import org.csource.common.NameValuePair; import org.csource.fastdfs.ClientGlobal; import org.csource.fastdfs.StorageClient; import org.csource.fastdfs.TrackerClient; import org.csource.fastdfs.TrackerServer; import org.springframework.core.io.ClassPathResource; /** * 文件上传工具类 */ public class FastdfsUtil { //初始化Tracker的信息 static{ try { //获取了fastdfs配置文件 String filePath=new ClassPathResource("fdfs_client.conf").getPath(); //加载tracker的配置信息 ClientGlobal.init(filePath); } catch (Exception e) { e.printStackTrace(); } } //获取TrackerServer对象 private static TrackerServer _getTrackerServer() throws Exception{ return new TrackerClient().getConnection(); } //获取StorageClient客户端 private static StorageClient _getStorageClient() throws Exception{ return new StorageClient(_getTrackerServer(),null); } /** * 文件上传 * @param file 要上传的文件 * @return 返回文件存入的位置(组名+虚拟磁盘路径+文件名) */ public static String[] upload(FastdfsFile file){ //文件信息键值对数组 NameValuePair[] meta_list=new NameValuePair[1]; //文件作者 meta_list[0]=new NameValuePair(file.getAuthor()); String[] uploadResults=null; try { StorageClient storageClient = _getStorageClient(); //三个参数分别为 文件内容byte[]、文件扩展名、文件信息列表 uploadResults = storageClient.upload_file(file.getContent(),file.getExt(),meta_list); } catch (Exception e) { e.printStackTrace(); } return uploadResults; } }
package com.fastdfs.fastdfspro.controller; import com.fastdfs.fastdfspro.entity.FastdfsFile; import com.fastdfs.fastdfspro.utils.FastdfsUtil; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; @RestController public class FastdfsController { //文件上传 @PostMapping("/upload") public String upload(@RequestParam(value = "file") MultipartFile file) throws Exception{ FastdfsFile fastDFSFile=new FastdfsFile( file.getOriginalFilename(), file.getBytes(), StringUtils.getFilenameExtension(file.getOriginalFilename())); String[] upload = FastdfsUtil.upload(fastDFSFile); String url="http://192.168.100.10:8080/"+upload[0]+"/"+upload[1]; return url; } }
注意:虚拟机必须关闭防火墙,不关无法使用。
[root@localhost ~]# systemctl stop firewalld.service
进入虚拟机中文件存储的路径查看,上传成功,后缀-m的文件是自动生成的备份文件。
浏览器输入 url,可以访问。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。