目录
FastDFS架构Tracker server
Storage server
Client
文件的上传
文件的下载
同步时间管理
集成Nginx
FastDFS部署
基础环境
安装libfastcommon
配置tracker服务器
配置Storage服务
配置client
测试上传文件
在所有storage节点安装fastdfs-nginx-module和nginx
部署代理
FastDFS架构Tracker server
跟踪服务器,主要做调度工作,起到均衡的作用:负责管理所有的Storage server和group
每个storage在启动后会连接Tracker,告知自己所属group等信息,并保持周期性心跳。
tracker上的元信息都是由storage汇报的信息生成的,本身不需要持久化任何数据,这样
使得tracker非常容易扩展,直接增加tracker机器即可扩展为trackercluster来服务,
cluster里每个tracker之间是完全对等的,所有的tracker都接受stroage的心跳信息,
生成元数据信息来提供读写服务,tracker根据storage的心跳信息,建立group==>[storage
serverlist]的映射表。
Storage server
存储服务器,主要提供容量和备份服务:以group为单位,每个group内部可以有多台
storageserver,数据互为备份。客户端上传的文件最终存储存Estorage服务器上,Storageserver没有实现自己的文件系统,而是利用操作系统的文件系统来管理文件,可以将storage称为存储服务器。storage可配置多个数据存储目录,比如有10块磁盘,分别挂载在/data/diskl-/data/disk10,则可将这10个目录都配置为sstorage的数据存储目录。
Client
客户端,上传下载数据的服务器,也就是我们自己的项目所都署在的服务器。FastDFS向使用者提供基本文件访问接口,比如upload、download、append、deelete等,以客户端库的方式提供给用户使用。跟踪服务器和存储节点都可以由一台或多台服务器构成,距跟踪服务器和存储节点均可以随时增加或者下线不会影响线上服务,其中跟踪服务器中所有服务器是对等,可以根据服务器压力情况随时增加或减少。
文件的上传
选择trackerserver
当集群中不止一个tracker server时,由于tracker之间是完全对等的关系,客户端
在upload文件时可以任意选择一个trakcer。当tracker接收到upoload file的请求时,
会为该文件分配一个可以存储该文件的group,支持如下选择group的规则:
Roundrobin,所有的group间轮询
Specified group,指定某一个确定的group
Loadbalance,剩余存储空间多 group优先(2)选择storageserver
当选定group后,tracker会在group内选择一个storageserver给客户端,支持如
下选择storage的规则:
Roundrobin,在group内的所有storage间轮询
Firstserverordered by ip,按ip排序
Firstserverorderedby priority,按优先级排序(优先级在storage上配置
(3)选择storagepath当分配好storageserver后,客户端将向storage发送写文件请求,storage将会为文件分配一个数据存储目录,支持如下规则:
Roundrobin,多个存储目录间轮询剩余存储空间最多的优先(4)生成Fileid(文件标识)
选定存储目录之后,storage会为文件生一个Fileid,由storageserverip、文件创
建时间、文件大小、文件crc32和一个随机数拼接而成,然后将过这个二进制串进行base64编码,转换为可打印的字符串。选择两级目录当选定存储目录之后,storage会为文件分配一个fileid,每个存储目录下有两级256*256的子目录,storage会按文件fileid进行
两次hash(猜测),路由到其中一个子目录,然后将文件以fileid为文件名存储到该子目
录下。(5)生成文件名当文件存储到某个子目录后,即认为该文件存储成功,接下来会为该文件生成一个文件名,文件名由group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。
文件的下载
跟upload file一样,在download file时客户端可以选择任意tracker server. tracker
发送download请求给某个tracker,必须带上文件名信息,tracke从文件名中解析出文件
的group、大小、创建时间等信息,然后为该请求选择一个storage服多器用来读请求
(1)定位文件客户端上传文件后存储服务器将文件ID返回给客户端,此文件ID用于以后访问该文件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。组名:文件上传后所在的storage组名称,在文件上传成功后有storage服务器返
回,需要客户端自行保存。虚拟磁盘路径:storage配置的虚拟路径,与磁盘选项storepath*对应。如果配置了store_path0则是M00,如果配置了store_pathl则是MOI,以此类推。
数据两级目录:storage服务器在每个虚拟磁盘路径下创建的两级目录,用于存储
数据文件。文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器IP地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。知道FastDFSFID的组成后,我们来看看FastDFS是如何通过这个精巧的FID定位到需要访
问的文件:(2)定位文件所在的group通过组名tracker能够很快的定位到客户端需要访问的存服务器组,并将选择合适的存储服务器提供客户端访问
(3)定位文件位置存储服务器根据"文件存储虚拟磁盘路径"和"数据文件两级目录"可以很快定位到文件所在目录,并根据文件名找到客户端需要访问的文件
同步时间管理
当一个文件上传成功后,客户端马上发起对该文件下载请求(或删除请求)时,tracker
是如何选定一个适用的存储服务器呢?其实每个存储服务器都需要定时将自身的信息上报给tracker,这些信息就包括了本地同步时间(即,同步到的最新文件的时间戳)。而tracker根据各个存储服务器的上报情况,就能够知道刚刚上传的文件,在该存储组中是否已完成了写文件时,客户端将文件写至group内一个storageserver即认为写文件成功,storageserver写完文件后,会由后台线程将文件同步至同group内其他的storage server.每个storage写文件后,同时会写一份binlog,binlog里不包含文件数据,只包含文
件名等元信息,这份binlog用于后台同步,storage会记录向group内其他storage同步
的进度,以便重启后能接上次的进度继续同步;进度以时间戳的为方式进行记录,所以最好能保证集群内所有server的时钟保持同步。
storage的同步进度会作为元数据的一部分汇报到 tracker上,tracke在选择读
storage的时候会以同步进度作为参考。比如一个group内有A、B、C三个storage server,A向C同步到进度为TI(TI以前写的文件都已经同步到B上了),B向C同步到时间戳为T2(T2>T1),tracker接收到这些同步进度信息时,就会进行整理,将最小的那个做为C
的同步时间戳,本例中T1即为C的同步时间戳为T1(即所有TI以前写的数据都已经同步
到C上了);同理,根据上述规则,tracker会为A、B生成一个同步时间戳。
集成Nginx
FastDFS通过Tracker服务器,将文件放在Storage服务器存储,但是同组存储服务器
之间需要进入文件复制,有同步延迟的问题。
假设Tracker服务器将文件上传到了192.168.4.125,上传成功后文件ID已经返回给客户
端。此时FastDFS存储集群机制会将这个文件同步到同组存储192.168.4.126,在文件还没有复制完成的情况下,客户端如果用这个文件ID在192.168.4.126上取文件,就会出现文件无法访问的错误。
而fastdfs-nginx-module可以重定向文件连接到文件上传时的的源服务器取文件,避免
客户端由于复制延迟导致的文件无法访问错误。
另外,使用nginx反向代理后,后端可以以HTTP请求的方式来访问文件资源。访问nginx
反向代理+上传文件时的ID
FastDFS部署
基础环境
关闭防火墙关闭内核
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed-i "s/"SELINUX=.*/SELINUX=disabled/g" /etc/selinux/corfig
安装libfastcommon
所有节点安装代理服务器除外
yum -y install zlib-devel gcc* libtool1
pcre-devel
yum -y install libevent
tar zxvf libfastcommon-1.0.36.tar.gz
cd libfastcommon-1.0.36
./make.sh #编译
./make.sh install #安装
cd /usr/lib64
11 libfast*
#查看所有以libfast开头的内容
cp libfastcommon. so /usr/lib
#覆盖原有模块文件
编译安装FastDFS所有节点安装代理服务器除外
tar zxvf fastdfs-5.11.tar. gz
cd fastdfs-5.11
/make.sh
/make. sh install
配置tracker服务器
cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
vi/etc/fdfs/tracker.conf
#修改的内容如下:
disabled=false
#启用配置文件
#tracker服务器端口(默认22122)
port=22122
base_path=/fastdfs/tracker
存储日志和数据的根目录
#设置存储组名称
store_group=groupl
创建base_path指定的目录启动tracker服务器
mkdir -p /fastdfs/tracker
/etc/init.d/fdfs_trackerd start
配置Storage服务
cp/etc/fdfs/storage.conf.sample /etc/fdfs/storage. conf
vi/etc/fdfs/storage.conf
#修改的内容如下:
#启用配置文件
disabled=false
port=23000
#storage服务端口
#数据和日志文件存储根目录
base_path=/fastdfs/storage
#第一个存储目录
store_path0=/fastdfs/storage
tracker_server=192.168.10.101:22122
#tracker服务器IP和端口
tracker_server=192.168.10.102:22122
#tracker服务器IP和端口
#需要和tracker中的组名保持一致
group_name=groupl
http. server_port=88888
#http访问文件的端口
创建基础的数据类型启动storage服务器并检查进程
mkdir -p /fastdfs/storage
/etc/init.d/fdfs_storaged start
ps -ef | grep fdfs_storaged
配置client
cp /etc/fdfs/client.conf.sample/etc/fdfs/client.conf
mkdir -p /fastdfs/tracker
vi/etc/fdfs/client.conf
base_path=/fastdfs/tracker
tracker_server=192.168.10.101:22122
tracker服务器IP和端口
tracker_server=192.168.10.102:22122
# tracker服务器IP和端口
测试上传文件
[root@localhost ~]# fdfs_upload_file /etc/fdfs/client.conf logo.jpg
groupl/M00/00/00/wKgKaGadD5aAZBiJAAFMnKMUrMI833.jpg
[root@localhost ~]#fdfs_test /etc/fdfs/client.conf upload logo.jpg
在所有storage节点安装fastdfs-nginx-module和nginx
FastDFS 通过 Tracker服务器,将文件放在Storage服务器存储,但是同组存储
服务器之间需要进入文件复制,有同步延迟的问题。假设 Traicker服务器将文件上传到
了 storage0l,上传成功后文件 ID 已经返回给客户端。此时 FastDFS存储集群机制
会将这个文件同步到同组存储storage02,在文件还没有复制完成的情况下,客户端如果用
这个文件 ID在 storage02上取文件,就会出现文件无法访问的错误。
而fastdfs-nginx-module可以重定向文件连接到源服务器取文件,避免客户端由于复制
安装时使延迟导致的文件无法访问错误。(解压后的fastdfs-nginx-module在nginx
用)storage上的nginx是用于访问具体的文件,并且需要使用fasstdfs模块。
修改并解压fastdfs-nginx-module的配置文件
tar zxvf fastdfs-nginx-module_vl.16.tar.ggz
cd fastdfs-nginx-module/src
vi config
ngx_addon_name=ngx_http_fastdfs_module
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
-L/usr/lib -lfastcommon -lfdfsclient"
CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64_-DFDFS_OUTEUT_CHUNK SIZE= 256 1024' -DFDFS_MOD_CONF_FIL
编译安装nginx
tar zxvf nginx-1.19.5.tar.gz
useradd nginx
cd nginx-1.19.5
cp /usr/include/fastcommon/* /usr/include/fastdfis/
/configure\
rprefix=/usr/local/nginx\
add-module=/root/fastdfs-nginx-module/src/
--with-cc-opt="-Wno-error=format-truncation"
目录
make
make install
ln -s /usr/local/nginx/sbin/* /usr/local/sbin/
配置FastDFS
将fastdfs-nginx-module模块下的mod_fastdfs.conf文件拷贝到/etc/fdfs/目录
cp /root/fastdfs-nginx-module/src/mod_fastdfs.conf /etec/fdfs/
vi/etc/fdfs/mod_fastdfs.conf
找到下面的配置进行修改:
修改参数如下:
connect_timeout=10
base_path=/tmp用户存储日志的
tracker服务器IP和端口
tracker_server=192.168.10.101:22122
tracker_server=192.168.10.102:22122
#tracker服务器IP和端口
#这个表示是否需要增加一个上述自定义名字的需要,改为
url have group_name=true
true,url中包含group名称
group_name=groupl
storage_server_port=23000
store_path_count=l
store_path0=/fastdfs/storage
复制FastDFS的部分配置文件到/etc/fdfs目录在/fastdfs/storage文件存储目录下创建软连接,将其链接到实际存放数据的目录
cp/root/fastdfs-5.11/conf/http.conf /ettc/fdfs
cp/root/fastdfs-5.11/conf/mime.types/etc/fdfs
In -s /fastdfs/storage/data /fastdfs/storage/MOO
配置nginx
修改nginx.conf文件,在http指令中新增如下配置
vi /usr/local/nginx/conf/nginx.conf
http {
include
mime.types;
default_type
application/octet-stream;
sendfile
on;
keepalive_timeout
65;
{
server
listen
80;
localhost;
server_name
location
html;
root
index
index.html index.htm;
location /groupl/M00 {
ngx_fastdfs_module;
}
}
}
/usr/local/nginx/sbin/nginx
部署代理
yum -y install pcre-devel zlib-devel gcc.
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
ln -s /usr/local/nginx/sbin/nginx/usr/local/sbin/
vi/usr/local/nginx/conf/nginx.conf
http {
include
mime.types;
default_type
application/octet-stream;
sendfile
on;
keepalive_timeout 65;
upstream storage_server_groupl{
server 192.168.10.103:80 weight=10;
server 192.168.10.104:80 weight=10;
server
listen
80:
localhost:
server name
location/{
http://storage_server_groupl;
proxy_pass
}
}}