赞
踩
FastDFS 是一个开源的高性能分布式文件系统(DFS)。 它的主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡。主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务。
FastDFS 系统有三个角色:跟踪服务器(Tracker Server)、存储服务器(Storage Server)和客户端(Client)。
Tracker Server:跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的 storage server和 group,每个 storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳。
Storage Server:存储服务器,主要提供容量和备份服务;以 group 为单位,每个 group 内可以有多台 storage server,数据互为备份。
Client:客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。
为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。
在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。
FastDFS向使用者提供基本文件访问接口,比如upload、download、append、delete等,以客户端库的方式提供给用户使用。
Storage Server会定期的向Tracker Server发送自己的存储信息。当Tracker Server Cluster中的Tracker Server不止一个时,各个Tracker之间的关系是对等的,所以客户端上传时可以选择任意一个Tracker。
当Tracker收到客户端上传文件的请求时,会为该文件分配一个可以存储文件的group,当选定了group后就要决定给客户端分配group中的哪一个storage server。当分配好storage server后,客户端向storage发送写文件请求,storage将会为文件分配一个数据存储目录。然后为文件分配一个fileid,最后根据以上的信息生成文件名存储文件。
写文件时,客户端将文件写至group内一个storage server即认为写文件成功,storage server写完文件后,会由后台线程将文件同步至同group内其他的storage server。
每个storage写文件后,同时会写一份binlog,binlog里不包含文件数据,只包含文件名等元信息,这份binlog用于后台同步,storage会记录向group内其他storage同步的进度,以便重启后能接上次的进度继续同步;进度以时间戳的方式进行记录,所以最好能保证集群内所有server的时钟保持同步。
storage的同步进度会作为元数据的一部分汇报到tracker上,tracke在选择读storage的时候会以同步进度作为参考。
客户端uploadfile成功后,会拿到一个storage生成的文件名,接下来客户端根据这个文件名即可访问到该文件。
跟upload file一样,在downloadfile时客户端可以选择任意tracker server。tracker发送download请求给某个tracker,必须带上文件名信息,tracke从文件名中解析出文件的group、大小、创建时间等信息,然后为该请求选择一个storage用来服务读请求。
为避免出现版本不兼容问题,此处的文件均使用最新版本!
下载完成后一次将这些压缩包上传至服务器的指定目录(随意)下,本案例是放到/etc/local目录下,本案例系统环境为CenterOS 64位!
yum -y install perl
yum install gcc-c++
使用unzip命令解压libfastcommon-master.zip并编译安装:
unzip libfastcommon-master.zip # 解压
cd libfastcommon-master # 进入libfastcommon-master目录下
./make.sh # 编译
./make.sh install # 安装
使用unzip命令解压fastdfs-master.zip并编译安装:
unzip fastdfs-master.zip # 解压
cd fastdfs-master # 进入libfastcommon-master目录下
./make.sh # 编译
./make.sh install # 安装
将fastdfs安装目录下的conf下的文件拷贝到/etc/fdfs/下
cp -r conf/* /etc/fdfs/
ll /usr/bin/fdfs*
配置本地域名解析的目的是因为后边的配置文件中常用到ip,如果ip变了,则需要对每一个配置文件都修改!配置本地域名解析,就可以达到一次修改,全部通用的目的!配置如下:
vim /etc/hosts
在文件中加入:
192.168.1.135 file.test.com
mkdir -p /etc/local/data/fastdfs
cd /etc/fdfs/
vim tracker.conf
# the base path to store data and log files
将base_path=/home/yuqing/fastdfs
改成
base_path=/etc/local/data/fastdfs
// 修改服务端口
http.server_port=80
/usr/bin/fdfs_trackerd tracker.conf restart
ps -ef|grep trackerd
如下图表示启动成功:
5. 设置Tracker开机启动
chkconfig fdfs_trackerd on
或者:
vim /etc/rc.d/rc.local
加入配置:
/etc/init.d/fdfs_trackerd start
mkdir /etc/local/data/fastdfs/storage
// 编辑storage.conf vim storage.conf 将base_path=/home/yuqing/fastdfs 改为 base_path=/etc/local/data/fastdfs 将store_path0=/home/yuqing/fastdfs 改为 store_path0=/etc/local/data/fastdfs/storage 将tracker_server=192.168.209.121:22122 改为 tracker_server=file.test.com:22122 (ip改成自己的) // 修改服务端口 http.server_port=80
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
ps -ef|grep storage
如下图表示启动成功:
3. 设置 Storage 开机启动
chkconfig fdfs_storaged on
或者:
vim /etc/rc.d/rc.local
加入配置:
/etc/init.d/fdfs_storaged start
// 添加端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --zone=public --add-port=22122/tcp --permanent
firewall-cmd --zone=public --add-port=23000/tcp --permanent
// 重启防火墙
firewall-cmd --reload
// 查看结果
firewall-cmd --zone=public --list-ports
如下图证明放行成功:
解压:fastdfs-client-java-master.zip(本地解压)
解压后将工程导入IDE工具中,本案例使用Eclipse!
package com.lee.fastdfs.test; import org.csource.common.NameValuePair; import org.csource.fastdfs.*; import org.junit.Test; import java.io.FileNotFoundException; import java.io.IOException; public class FastdfsClientTest { //客户端配置文件 public String conf_filename = "fdfs_client.conf"; //本地文件,要上传的文件 // C:\\Users\\Administrator\\Pictures\\img\\20190626111759_294.jpg // public String local_filename = "G:\\IdeaProjects\\fastdfs\\src\\main\\resources\\mygirl.jpg"; public String local_filename = "C:\\Users\\Administrator\\Pictures\\img\\20190626111759_294.jpg"; //上传文件 @Test public void testUpload() { for(int i=0;i<10;i++){ try { ClientGlobal.init(conf_filename); TrackerClient tracker = new TrackerClient(); TrackerServer trackerServer = tracker.getConnection(); StorageServer storageServer = null; StorageClient storageClient = new StorageClient(trackerServer, storageServer); NameValuePair nvp [] = new NameValuePair[]{ new NameValuePair("item_id", "100010"), new NameValuePair("width", "80"), new NameValuePair("height", "90") }; String fileIds[] = storageClient.upload_file(local_filename, null, nvp); System.out.println(fileIds.length); System.out.println("组名:" + fileIds[0]); System.out.println("路径: " + fileIds[1]); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } } }
connect_timeout = 2
network_timeout = 30
charset = UTF-8
http.tracker_http_port = 80
http.anti_steal_token = no
http.secret_key = FastDFS1234567890
tracker_server = file.test.com:22122
fastdfs-client.properties
## fastdfs-client.properties
fastdfs.connect_timeout_in_seconds = 5
fastdfs.network_timeout_in_seconds = 30
fastdfs.charset = UTF-8
fastdfs.http_anti_steal_token = false
fastdfs.http_secret_key = FastDFS1234567890
fastdfs.http_tracker_http_port = 80
fastdfs.tracker_servers = file.test.com:22122
其中ip均为你配置FastDFS时设置好的ip!
通过Junit测试得下图:
回到服务器端通过以下命令查看是否上传成功:
cd /etc/local/data/fastdfs/storage/data/00/00
如下图则上传成功:
// 解压fastdfs-nginx-module-master.zip unzip fastdfs-nginx-module-master.zip // 进入fastdfs-nginx-module-master cd fastdfs-nginx-module-master/src // 拷贝配置文件 cp mod_fastdfs.conf /etc/fdfs/ // 进入fdfs目录 cd /etc/fdfs/ // 编辑mod_fastdfs.conf配置文件 vim mod_fastdfs.conf // 超时时间 connect_timeout=10 将base_path=/tmp 改成: base_path=/etc/local/data/fastdfs 将tracker_server=tracker:22122 改成: tracker_server=file.test.com:22122 将url_have_group_name = false 改成: url_have_group_name = true;#url中包含group名称 将store_path0=/home/yuqing/fastdfs 改成: store_path0=/etc/local/data/fastdfs/storage
nginx的下载可前往官网:http://nginx.org/,下载后将压缩包上传至/etc/local目录下!
cd /opt
yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-devel
// 解压nginx-1.16.0.tar.gz
tar -zxvf nginx-1.16.0.tar.gz
cd nginx-1.16.0
./configure --prefix=/etc/local/nginx --add-module=/etc/local/fastdfs-nginx-module-master/src
// 编译
make
// 安装
make install
查看是否把fastdfs模块添加进去了?
cd /etc/local/nginx/sbin
./nginx -v
如果结果如下图则证明添加成功:
4. 配置nginx配置文件
cd /etc/local/nginx/conf
// 新建一个配置文件
vim nginx-fdfs.conf
内容如下:
events { use epoll; worker_connections 1024; } http { server { listen 80; server_name file.test.com; location /group1/M00/{ #root /home/FastDFS/fdfs_storage/data; ngx_fastdfs_module; } } server { listen 80; server_name file.test.com; location / { root html; index index.html index.htm; } } }
注意:ip地址需要更换成自己的!
cd /etc/local/nginx/sbin/
./nginx -c /etc/local/nginx/conf/nginx-fdfs.conf
启动后如图所示:
至此,本教程的所有配置结束,如果亲们有发现什么不对的地方,还请多多指正!
1、用FastDFS一步步搭建文件管理系统:https://www.cnblogs.com/chiangchou/p/fastdfs.html#_label0_0
2、详细的最新版fastdfs单机版搭建:https://www.cnblogs.com/youzhibing/p/9160690.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。