一、FastDFS 原理
1.基本概述
FastDFS是一个开源的轻量级分布式文件系统,纯C实现,目前提供了C、Java和PHP API。功能包括:文件存储,文件同步,文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务。
2.FastDFS架构
(1)tracker server
跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的Storage server和group,每个storage在启动后会连接Tracker,告知自己所属group等信息,并保持周期性心跳。
(2) storage server
存储服务器,主要提供容量和备份服务;以group为单位,每个group内部可以有多台storage server,数据互为备份。
(3)client
客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。
3.文件上传
(1)选择tracker server
当集群中不止一个tracker server时,由于tracker之间是完全对等无状态的关系,当集群中不止一个tracker server时,由于tracker之间是完全对等的关系,客户端在upload文件时可以任意选择一个trakcer。 选择存储的group 当tracker接收到upload file的请求时,会为该文件分配一个可以存储该文件的group,支持如下选择group的规则:
- Round robin,所有的group间轮询
- Specified group,指定某一个确定的group
- Load balance,剩余存储空间多group优先
(2)选择storage server
当选定group后,tracker会在group内选择一个storage server给客户端,支持如下选择storage的规则:
- Round robin,在group内的所有storage间轮询
- First server ordered by ip,按ip排序
- First server ordered by priority,按优先级排序(优先级在storage上配置)
(3)选择storage path
当分配好storage server后,客户端将向storage发送写文件请求,storage将会为文件分配一个数据存储目录,支持如下规则:
- Round robin,多个存储目录间轮询
- 剩余存储空间最多的优先
(4)生成Fileid
选定存储目录之后,storage会为文件生一个Fileid,由storage server ip、文件创建时间、文件大小、文件crc32和一个随机数拼接而成,然后将这个二进制串进行base64编码,转换为可打印的字符串。 选择两级目录 当选定存储目录之后,storage会为文件分配一个fileid,每个存储目录下有两级256*256的子目录,storage会按文件fileid进行两次hash(猜测),路由到其中一个子目录,然后将文件以fileid为文件名存储到该子目录下。
(5)生成文件名
当文件存储到某个子目录后,即认为该文件存储成功,接下来会为该文件生成一个文件名,文件名由group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。
4.文件的下载
(1)定位文件
客户端上传文件后存储服务器将文件ID返回给客户端,此文件ID用于以后访问该文件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。
- 组名:文件上传后所在的storage组名称,在文件上传成功后有storage服务器返回,需要客户端自行保存。
- 虚拟磁盘路径:storage配置的虚拟路径,与磁盘选项store_path*对应。如果配置了store_path0则是M00,如果配置了store_path1则是M01,以此类推。
- 数据两级目录:storage服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件
- 文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器IP地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。
(2)定位文件所在group
通过组名tracker能够很快的定位到客户端需要访问的存储服务器组,并将选择合适的存储服务器提供客户端访问。
(3)定位文件所在位置
存储服务器根据“文件存储虚拟磁盘路径”和“数据文件两级目录”可以很快定位到文件所在目录,并根据文件名找到客户端需要访问的文件。
二、实验分析
1.环境要求
IP | ||
192.168.10.101 | Tracker server | libfastcommon, fastdfs, fastdfs-nginx-module, |
192.168.10.102 | Tracker server | libfastcommon, fastdfs, fastdfs-nginx-module, |
192.168.10.103 | Storage server | libfastcommon, fastdfs, fastdfs-nginx-module, nginx-1.18.0 |
192.168.10.104 | Storage server | libfastcommon, fastdfs, fastdfs-nginx-module, nginx-1.18.0 |
192.168.10.105 | nginx反向代理 | nginx-1.18.0 |
安装前的准备
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum -y install gcc* zlib-devel libtool pcre-devel libevent
<安装libfastcommon-1.0.36>
[root@localhost ~]#tar zxvf libfastcommon-1.0.36.tar.gz
[root@localhost libfastcommon-1.0.36]# ./make.sh 执行该脚本
[root@localhost libfastcommon-1.0.36]# ./make.sh install
[root@localhost libfastcommon-1.0.36]# cd /usr/lib64/
[root@localhost lib64]# cp libfastcommon.so /usr/lib
<安装fastdfs>主程序
[root@localhost ~]# tar zxvf fastdfs-5.11.tar.gz
[root@localhost ~]# cd fastdfs-5.11
[root@localhost fastdfs-5.11]# ./make.sh
[root@localhost fastdfs-5.11]# ./make.sh install
查看安装后的效果
[root@localhost ~]# ll /etc/fdfs/ 查看FastDFS的配置文件
[root@localhost ~]# ll /usr/bin/fdfs* # 查看FastDFS相关的可执行程序
2.tracker server 服务器端 101 ,102
[root@localhost ~]# cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
[root@localhost ~]# vim /etc/fdfs/tracker.conf
base_path=/fastdfs/tracker 修改
store_group=group1 修改,与storage配置文件相一致
[root@localhost ~]# mkdir -p /fastdfs/tracker 创建文件目录
[root@localhost ~]# /etc/init.d/fdfs_trackerd start 启动——启动成功
Reloading systemd: [ 确定 ]
Starting fdfs_trackerd (via systemctl): [ 确定 ]
[root@localhost ~]# ps -ef | grep trackerd 进程号查询
3. Storage server 103,104
[root@localhost ~]# cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
[root@localhost ~]# vim /etc/fdfs/storage.conf
disabled=false 启用
base_path=/fastdfs/storage #41行
tracker_server=192.168.10.101:22122 #119行
tracker_server=192.168.10.101:22122
[root@localhost ~]# mkdir -p /fastdfs/storage
[root@localhost ~]# /etc/init.d/fdfs_storaged start
Reloading systemd: [ 确定 ]
Starting fdfs_storaged (via systemctl): [ 确定 ]
[root@localhost ~]# ps -ef | grep storaged
客户端上传文件测试
[root@localhost ~]# cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
[root@localhost ~]# vim /etc/fdfs/client.conf
base_path=/fastdfs/tracker #10
tracker_server=192.168.10.101:22122 #15
tracker_server=192.168.10.102:22122
[root@localhost ~]# mkdir -p /fastdfs/tracker
方法一:
[root@localhost ~]# fdfs_upload_file /etc/fdfs/client.conf logo.jpg 上传logo.jpg图片
group1/M00/00/00/wKgKZ2aeJ46AHEpfAAFMnKMUrMI326.jpg
方法二:
[root@localhost ~]# fdfs_test /etc/fdfs/client.conf upload logo.jpg
url: http://192.168.10.103/group1/M00/00/00/wKgKZ2aeKTmAXssfAAFMnKMUrMI345_big.jpg
安装<fastdfs-nginx-module_v1.16.tar.gz>
[root@localhost ~]# tar zxvf fastdfs-nginx-module_v1.16.tar.gz
[root@localhost ~]# cd fastdfs-nginx-module
[root@localhost fastdfs-nginx-module]# ls
HISTORY INSTALL src
[root@localhost fastdfs-nginx-module]# cd src/
[root@localhost src]# ls
common.c common.h config mod_fastdfs.conf ngx_http_fastdfs_module.c
[root@localhost src]# vim config
安装<nginx>
[root@localhost ~]# tar zxvf nginx-1.19.5.tar.gz
[root@localhost nginx-1.19.5]# useradd -M -s /sbin/nologin nginx
[root@localhost nginx-1.19.5]# cd /usr/include/
[root@localhost include]# cd fastcommon/
[root@localhost include]# cp fastcommon/* fastdfs
[root@localhost ~]# cd nginx-1.19.5
[root@localhost nginx-1.19.5]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --add-module=/root/fastdfs-nginx-module/src
[root@localhost nginx-1.19.5]# make && make install
[root@localhost nginx-1.19.5]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
[root@localhost nginx-1.19.5]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost ~]# cp fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
[root@localhost ~]# vim /etc/fdfs/mod_fastdfs.conf
tracker_server=192.168.10.101:22122 #40行
tracker_server=192.168.10.102:22122
url_have_group_name = true #50行
store_path0=/fastdfs/storage #64行
[root@localhost ~]# cd fastdfs-5.11
[root@localhost fastdfs-5.11]# ls
client COPYING-3_0.txt init.d php_client stop.sh tracker
common fastdfs.spec INSTALL README.md storage
conf HISTORY make.sh restart.sh test
[root@localhost fastdfs-5.11]# cd conf/
[root@localhost conf]# ls
anti-steal.jpg http.conf storage.conf tracker.conf
client.conf mime.types storage_ids.conf
[root@localhost conf]# cp http.conf mime.types /etc/fdfs
[root@localhost conf]# ln -s /fastdfs/storage/data/ //fastdfs/storage/data/M00
[root@localhost ~]# cd /usr/local/nginx/conf/
[root@localhost conf]# vim nginx.conf
location /group1/M00 {
ngx_fastdfs_module;
}
[root@localhost conf]# nginx -s stop
ngx_http_fastdfs_set pid=7872
nginx: [error] invalid PID number "" in "/usr/local/nginx/logs/nginx.pid"
[root@localhost conf]# nginx
ngx_http_fastdfs_set pid=7873
测试:
安装<nginx>做反向代理105
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum -y install gcc* zlib-devel pcre-devel
[root@localhost ~]# tar zxvf nginx-1.19.5.tar.gz
cd nginx-1.19.5
useradd nginx
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
make && make install
[root@localhost ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
[root@localhost ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost ~]#vim /usr/local/nginx/conf/nginx.conf
http
upstream storage_server_group1 {
server 192.168.10.103:80 weight=1;
server 192.168.10.104:80 weight=1;
}
server
location / {
proxy_pass http://storage_server_group1;
}
[root@localhost ~]# nginx
测试