01-简介
GitHub:happyfish100 (YuQing) · GitHub
FastDFS高性能的分布式文件系统,主要功能包含文件的存储、同步、访问(上传和下载),特别适用于以文件为主体的网络站点(图片分享和视频分享)。
FastDFS包含两个角色:
-
Tracker(追踪器 调度服务器):调度和文件访问的负载均衡
-
Storage(存储器 存储服务器):文件的管理(存储、同步、访问接口)和文件的元数据支持水平扩展,不会对在线服务造成任何影响
存储服务器通过卷/组组织管理,不同的卷管理不同的文件,一个卷管理一台或者多台存储服务器,并且这些存储服务器之间互相备份。
存储容量=所有卷容量之和
文件在集群中标示=卷名+文件名
结构图:
02-环境搭建(单机)
在安装fastdfs之前,准备环境
yum -y install zlib zlib-devel pcre pcre-devel gcc gcc-c++ openssl openssl-devel libevent libevent-devel perl unzip net-tools wget
开始安装
#1.下载安装包,可根据自己所需要的的版本下载(官网可供选择),先安装libfastcommon再安装fastdfs
#libfastcommon下载地址
https://github.com/happyfish100/libfastcommon
#fastdfs下载地址
https://github.com/happyfish100/fastdfs
#2.上传并解压libfastcommon压缩包
unzip libfastcommon.zip
#3.进入解压好的文件目录,查看是否有make.sh文件,然后并执行该文件进行安装
cd libfastcommon/
./make.sh && ./make.sh install
#4.上传并解压fastdfs压缩包
unzip fastdfs.zip
#5.进入解压好的文件目录,查看是否有make.sh文件,然后并执行该文件进行安装
cd fastdfs/
./make.sh && ./make.sh install
#6.安装完成之后,查看/usr/bin目录下是否有fdfs开头的文件,这些执行文件在这个目录下的好处就是不用配置环境变量
find /usr/bin/ -name 'fdfs*'
例如:
/usr/bin/fdfs_upload_appender
/usr/bin/fdfs_append_file
/usr/bin/fdfs_appender_test1
/usr/bin/fdfs_download_file
/usr/bin/fdfs_test
/usr/bin/fdfs_delete_file
/usr/bin/fdfs_test1
/usr/bin/fdfs_crc32
/usr/bin/fdfs_upload_file
/usr/bin/fdfs_storaged
/usr/bin/fdfs_trackerd
/usr/bin/fdfs_appender_test
/usr/bin/fdfs_file_info
/usr/bin/fdfs_monitor
#7.修改配置文件,进入/etc/fdfs目录下,然后将以下三个文件进行重命名,如果名字已经.conf结尾,就不用修改名字,可以跳过这一步
cd /etc/fdfs
client.conf.sample storage.conf.sample tracker.conf.sample
mv client.conf.sample client.conf
mv storage.conf.sample storage.conf
mv tracker.conf.sample tracker.conf
#8.修改配置文件
#修改tracker.conf配置文件
base_path=/data/tracker #数据存储位置,填写自己的路径(可以自己创建一个新目录)
#修改storage.conf配置文件
base_path=/data/storage #数据存储位置,填写自己的路径(可以自己创建一个新目录)
store_path0=/data/storage #根据数据存储位置一样就行
tracker_server=192.168.209.121:22122 #指定tracker服务地址和端口
#9.启动服务,以下启动命令可以在任意目录执行
fdfs_trackerd /etc/fdfs/tracker.conf start #启动tracker
fdfs_storaged /etc/fdfs/storage.conf start #启动storage
#10.测试
#修改client.conf配置文件
base_path=/storage #存储位置,存放位置自己可以创建一个新目录
tracker_server=192.168.0.197:22122 #指定tracker服务地址和端口
#上传文件
fdfs_upload_file /etc/fdfs/client.conf /root/1.png
#下载文件
fdfs_download_file /etc/fdfs/client.conf 上传的文件名 下载目录
03-java集成Fastdfs
1.添加依赖,我们可以在maven厂库去寻找,也可以在Fastdfs的作者github找到 fastdfs-client-java项目,下载到自己本地然后打包
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.27.2</version>
</dependency>
注意:如果在maven远程厂库下载的依赖报版本冲突错误,需要自己手动下载项目打包
2.配置
fdfs.so-timeout=1501
fdfs.connect-timeout=601
fdfs.tracker-list=101.42.151.107:22122
3.测试
@SpringBootTest(classes = FastdfsApplication.class)
@RunWith(SpringRunner.class)
public class Test {
@Autowired
private FastFileStorageClient fastFileStorageClient;
/**
*@Description: 下载
*@Date: 2022/8/23 20:27
**/
@org.junit.Test
public void test1() throws IOException {
byte[] group1s = fastFileStorageClient.downloadFile("group1", "M00/00/00/CgAQBGMDiZWAZSSPAAAKYireMTk031.gif", new DownloadByteArray());
FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\86041\\Desktop\\f\\fastdfs\\fastdfs_springboot\\src\\main\\resources\\1.gif");
fileOutputStream.write(group1s);
}
/**
*@Description: 上传
*@Date: 2022/8/23 20:29
**/
@org.junit.Test
public void test2() throws FileNotFoundException {
File file = new File("F:\\picture\\donde\\geju.jpg");
FileInputStream fileInputStream = new FileInputStream(file);
StorePath jpg = fastFileStorageClient.uploadFile(fileInputStream, file.length(), "jpg", null);
System.out.println(jpg.getGroup());//组名
System.out.println(jpg.getPath());//存放位置
}
}
04-FastDFs集成Nginx
#1.上传nginx和fastdfs-nginx-module,fastdfs-nginx-module下载地址
https://github.com/happyfish100/fastdfs-nginx-module
#2.解压并修改fastdfs-nginx-module的配置文件
unzip fastdfs-nginx-module.zip
vi /usr/fastdfs-nginx-module/src/config
#修改如下
if test -n "${ngx_module_link}"; then
ngx_module_type=HTTP
ngx_module_name=$ngx_addon_name
ngx_module_incs="/usr/include/fastdfs /usr/include/fastcommon/"
ngx_module_libs="-lfastcommon -lfdfsclient"
ngx_module_srcs="$ngx_addon_dir/ngx_http_fastdfs_module.c"
ngx_module_deps=
CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64 -DFDFS_OUTPUT_CHUNK_SIZE='256*1024' -DFDFS_MOD_CONF_FILENAME='\"/etc/fdfs/mod_fastdfs.conf\"'"
. auto/module
else
HTTP_MODULES="$HTTP_MODULES ngx_http_fastdfs_module"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_fastdfs_module.c"
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
CORE_LIBS="$CORE_LIBS -lfastcommon -lfdfsclient"
CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64 -DFDFS_OUTPUT_CHUNK_SIZE='256*1024' -DFDFS_MOD_CONF_FILENAME='\"/etc/fdfs/mod_fastdfs.conf\"'"
#3.进入nginx解压好的目录,并执行configure连同fastdfs-nginx-module
cd /usr/nginx-1.11.1/
./configure --add-module=/usr/fastdfs-nginx-module/src/ --prefix=/usr/nginx
#指定自己fastdfs-nginx-module路径,同时指定你要安装nginx的路径
#4.执行nginx安装命令,(在解压好的nginx目录里执行)(这里很容易出错,如果出错就更换fastdfs-nginx-module)
make && make install
#5.拷贝fastdfs-nginx-module的mod_fastdfs.conf配置文件到/etc/fdfs目录下
cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs
#6.拷贝fastdfs的conf目录下的http.conf和mime.types文件到/etc/fdfs目录下
cp fastdfs-5.11/conf/http.conf /etc/fdfs
cp fastdfs-5.11/conf/mime.types /etc/fdfs
#7.修改nginx的nginx.conf配置文件
vi /usr/local/nginx/conf/nginx.conf
#修改nginx的监听端口,该端口跟storage.conf中的http.server_port保持一样
#修改location,注释掉之前的location,添加如下location
server {
listen 8888;
server_name localhost;
location ~/group[0-9]/ {
ngx_fastdfs_module;
}
}
#8.修改/etc/fdfs/mod_fastdfs.conf配置文件
vi /etc/fdfs/mod_fastdfs.conf
#修改如下内容
tracker_server=192.168.128.141:22122 #指定自己的tracker服务地址和端口
url_have_group_name = true #是否允许用组名访问,设置为true
group_name=group1 #组名,默认为group1,不用修改
store_path0=/data/fastdfs/storage/store #指定自己的文件目录
#9.启动nginx服务
./nginx -c /usr/local/nginx/conf/nginx.conf
#10.启动FastDFS服务
fdfs_trackerd /etc/fdfs/tracker.conf start
fdfs_storaged /etc/fdfs/storage.conf start
注意:fastdfs_v5.0与 fastdfs-nginx-module_v1.16安装正常,与1.20版本安装会报错:错误:在非结构或联合中请求成员‘path’
05-集成 FastDHT(文件去重)
排重原理:
FastDFS本身支持文件的排重处理机制(fdfd_crc32 效率高于MD5),但需要FastDHT作为文件hash的索引存储。FastDHT是同一个作者的开源key-value数库。
FastDFS的storage server每次上传均计算文件的hash值,然后从FastDHT服务器上进行查找比对,如果没有返回,则写入hash,并将文件保存如果有返回,则建立一个新的文件链接(软连接 ln -s),不保存文件。
环境搭建
#1.安装BerkeleyDB,并上传到服务器然后解压,下载地址: http://download.oracle.com/berkeley-db/db-6.0.30.tar.gz
tar -zxvf db-6.0.30.tar.gz
#2.进入到解压好的目录db-4.7.25/build_unix/,并执行configure命令
cd db-6.0.30/build_unix/
../dist/configure --prefix=/usr/db-6.0.30
#3.执行make
make && make install
#4.安装FastDHT,并上传到服务器然后解压,下载地址:GitHub - happyfish100/fastdht: FastDHT is a high performance distributed hash table (DHT) which based key value pairs. It can store mass key value pairs such as filename mapping, session data and user related data.
unzip fastdht-master.zip
#5.进入解压好的目录,然后修改make.sh,蓝色为增加内容,BerkeleyDB存放位置根据自己安装的目录填写
cd fastdht/
vi make.sh
CFLAGS='$CFLAGS -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -I/usr/db-6.0.30/include/ -L/usr/db-6.0.30/lib/'
if [ "$DEBUG_FLAG" = "1" ]; then
CFLAGS="$CFLAGS -g -O -DDEBUG_FLAG"
else
CFLAGS="$CFLAGS -O3"
#5.执行make,安装完成之后会在/usr/local/bin/目录下生成fdht执行文件
./make.sh && ./make.sh install
#6.安装完成后在/etc目录下产生fdht文件夹,并进行修改
ls /etc/fdht/
fdht_client.conf fdhtd.conf fdht_servers.conf
#先创建一个目录用来存储资源
mkdir fastdht
#修改fdht_client.conf
base_path=/data/fastdht
keep_alive=1
#include /etc/fdht/fdht_servers.conf (此处是需要加上#,##关闭,#打开)
#修改fdht_servers.conf
group_count = 1 #fastdht个数
group0 = 192.168.145.150:11411 #fastdht服务器地址和端口
#修改fdhtd.conf
port=11411
bash_path=/data/fastdht
#include /etc/fdht/fdht_servers.conf
#7.修改/etc/fdfs/storage.conf
check_file_duplicate=1
key_namespace=FastDFS
keep_alive=1
#include /etc/fdht/fdht_servers.conf
#8.拷贝libdb.so到/usr/lib目录
cp /usr/db-6.0.30/lib/libdb-6.0.so /usr/lib/
cp /usr/db-6.0.30/lib/libdb-6.0.so /usr/lib64/
#9.启动,分别启动fdhtd和fastdfs
/usr/local/bin/fdhtd /etc/fdht/fdhtd.conf start
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf start
#10.测试
上传相同文件,发现原始文件只会保留一份,相同文件上传都会变为快捷方式
06-fastdfs分布式文件系统集群环境搭建
搭建步骤:
(1)准备四台机器(仅测试)
tracker:2台(192.168.80.145,192.168.80.146)
storage:3台,分两组(192.168.80.147,192.168.80.148,192.168.80.149)
注意:五台机器的服务均已安装了fastdfs,nginx,fastdht,还有就是注意关闭所有机器的防火墙
(2)配置tracker( 两台tracker)
#1.进入/etc/fdfs/,修改tracker.conf
base_path=/home/fastdfs/tracker (确保路径存在,不存在先创建)
#负载均衡策略:0: 轮训,每个组上传一次,1: 指定组上传,2: 负载均衡,选择上传文件的最大空闲空间组
#当store_lookup=1时,store_group必须指定组名
store_lookup=2
#2.进入nginx,修改nginx.conf
upstream fastdfs_group1_server {
server 192.168.80.147:8888;
server 192.168.80.148:8888;
}
upstream fastdfs_group2_server {
server 192.168.80.149:8888;
}
server{
listen 8888;
server_name localhost;
location ~ /group1/M0[0-9] {
proxy_pass http://fastdfs_group1_server;
}
location ~ /group2/M0[0-9] {
proxy_pass http://fastdfs_group2_server;
}
}
(3)配置storage(三台storage)
#1.进入/etc/fdfs/,修改storage.conf
a)、group1(192.168.80.147,192.168.80.148):
配置:
tracker_server=192.168.80.145:22122 (配置tracker)
tracker_server=192.168.80.146:22122
group_name=group1
base_path=/data/fastdfs/storage (确保路径存在,不存在先创建)
store_path0=/data/fastdfs/storage (确保路径存在,不存在先创建)
b)、group2(192.168.80.149):
配置:
tracker_server=192.168.80.145:22122 (配置tracker)
tracker_server=192.168.80.146:22122
group_name=group2
base_path=/data/fastdfs/storage (确保路径存在,不存在先创建)
store_path0=/data/fastdfs/storage (确保路径存在,不存在先创建)
注释:除了组名称不一样,其余都一样
#2.进入/etc/fdfs/,修改mod_fastdfs.conf
配置文件:
base_path=/home/fastdfs/mod_fastdfs #保存日志目录
tracker_server=192.168.80.145:22122 #tracker服务器的IP地址以及端口号
tracker_server=192.168.80.146:22122
group_name=group1 #当前服务器的group名(147 148 group1,149 group2)
url_have_group_name=true #文件url中是否有group名
store_path0=/home/fastdfs/storage #存储路径
group_count = 2 #设置组的个数
#3.在末尾增加2个组的具体信息:(有几组就填写几组)
[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/home/fastdfs/storage
[group2]
group_name=group2
storage_server_port=23000
store_path_count=1
store_path0=/home/fastdfs/storage
#4.进入nginx,修改nginx.conf
server{
listen 8888; #storage 配置中, 有http.server_post=8888的配置信息,必须一致
server_name localhost;
location ~ /group[1-9]/M0[0-9] {
ngx_fastdfs_module;
}
}
(4)查看集群信息
#在三台storage服务器中 找一台服务器更改client.conf
#1.进入/etc/fdfs/,修改client.conf
base_path = /data/fastdfs/client
tracker_server = 192.168.80.145:22122 (有几个tracker机器配置几个tracker)
tracker_server = 192.168.80.146:22122
#2.执行fdfs_monitor命令,就可以得到集群信息
fdfs_monitor /etc/fdfs/client.conf
(5)测试
#在其中一台机器中,更改client.conf,然后执行上传
#修改client.conf