FastDFS 是一个开源的高性能分布式文件系统(DFS) ,主要解决海量数据存储问题,特别适合中小文件(建议范围:400K~500M)为载体的在线服务。
主要功能:
- 文件存储
- 文件同步和文件访问
- 高容量和负载均衡。
FastDFS 系统有三个角色
- 跟踪服务器 (Tracker Server):跟踪服务器 主要做调度工作,起到均衡作用;负责管理所有的storage server和group,每个storage在启动后会连接Tracker,告知自己所属group等信息,并保持周期性心跳。(存储文件的索引)
- 存储服务器(Storage Server):存储服务器,主要提供容量和备份服务;以group为单位,每个group内可以有多台storage server 数据互为备份。
- 客户端 (Client): 客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。
存储策略
为了支持大容量,存储节点采用分组得方式。存储系统由多个分组组成。组与组之间得文件时相互独立的。 所有组得文件容量累加就是整个存储系统中得文件容量。一个组可以由一台或多台服务器组成。一个组内各个存储服务器中的文件都是相同的。组中多台服务器起到了冗余、备份和负载的作用。在组中增加服务器时,同步已有的文件,由系统自动完成。同步完成后,系统自动将新增服务器切换到线上提供服务。
FastDFS的文件上传
Storage Server会定期向Tracker Server发送自己的存储信息。当Tracker Server不只一个时,各个Tracker之间的关系时对等的,所以客户端上传时可以选择任意一个Tracker。
当Tracker收到客户端上传文件的请求时,会为该文件分配一个可以存储文件的group,当选定group后就要决定给客户端分配group中哪一个storage server。当分配好storage server后,客户端向storage发送写文件请求,storage将会为文件分配一个数据存储目录,最后根据以上信息生成文件名。
上传文件流程: 客户端先请求追踪服务器,追踪服务器分配位置,返回位置信息。客户端直接存储到追中服务器返回的位置。存放好后客户端的任务结束。存储服务器之间再发起同步动作。服务器之间同步数据。
FastDFS的文件同步
写文件时,客户端将文件写至group内一个storage server 写完文件后,会由后台线程将文件同步至同group内其他storage server。每个storage写文件后,同时会写一份binlog,binlog里不包含文件数据,只包含文件名等源信息。binlog用于后台同步,storage会记录向group内其他storage同步的进度,以便重启时能接上次进度同步。进度以时间戳的方式进行记录,所以最好能保证集群内所有server时钟同步。
FastDFS的文件下载
在上传成功后,会拿到一个storage生成的文件名,接下来客户端根据这个文件名即可访问到文件。
下载文件流程:不通过追踪服务器,直接进入到某一个存储服务器来读取。使用nginx来读取存储服务器的本地文件系统,直接就返回给浏览器了。nginx读静态文件的效率非常高。 FastDFS插件 解决读取的服务器上没有指定文件的问题。插件会到追踪服务器查找对应文件的源信息。通过源信息到原始服务器上读取指定文件。
删除文件流程: 同上传
安装部署
编译源码需要gcc、gcc-c++、perl,软件包解压需要 unzip
yum -y install gcc gcc-c++ perl unzip
下载libfastcommon环境包、下载FastDFS包、下载nginx源码包、下载 fastdfs-nginx-module插件包
wget https://github.com/happyfish100/libfastcommon/archive/V1.0.7.tar.gz
wget https://github.com/happyfish100/fastdfs/archive/V5.05.tar.gz
wget -c https://nginx.org/download/nginx-1.12.1.tar.gz
wget https://github.com/happyfish100/fastdfs-nginx-module/archive/5e5f3566bbfa57418b5506aaefbe107a42c9fcb1.zip
1.安装libfastcommon libfastcommonm是从FastDFS和FastDHT中提取出来的公共C函数库,基础环境,安装即可。
tar -zxvf V1.0.7.tar.gz
cd libfastcommon-1.0.7
./make.sh
./make.sh install
libfastcommon.so
默认安装到了/usr/lib64/libfastcommon.so
但是后序我们安装的FastDFS主程序设置的lib目录是/usr/local/lib
因此需要创建软链接。
ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so
ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so
ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so
ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so
2.下载安装FastDFS
解压并进入
tar -zxvf V5.05.tar.gz
cd fastdfs-5.05
编译并安装
./make.sh
./make.sh install
fastdfs的服务脚本在/etc/init.d/fdfs_storaged
,/etc/init.d/fdfs_tracker
中
fastdfs的配置文件在/etc/fdfs/client.conf.sample
,/etc/fdfs/storage.conf.sample
,/etc/fdfs/tracker.conf.sample
中
fastdfs的命令工具在/usr/bin
目录下
fdfs_appender_test
fdfs_appender_test1
fdfs_append_file
fdfs_crc32
fdfs_delete_file
fdfs_download_file
fdfs_file_info
fdfs_monitor
fdfs_storaged
fdfs_test
fdfs_test1
fdfs_trackerd
fdfs_upload_appender
fdfs_upload_file
stop.sh
restart.sh
FastDFS服务脚本设置的bin目录是/usr/local/bin
,但实际命令却安装在/usr/bin
下,所以这里还需要创建软链接。
ln -s /usr/bin/fdfs_trackerd /usr/local/bin
ln -s /usr/bin/fdfs_storaged /usr/local/bin
ln -s /usr/bin/stop.sh /usr/local/bin
ln -s /usr/bin/restart.sh /usr/local/bin
3.配置FastDFS跟踪服务器(Tracker)
进入/etc/fdfs
,复制FastDFS跟踪器样例配置文件tracker.conf.sample 并重命名为tracker.conf
cd /etc/fdfs
cp tracker.conf.sample tracker.conf
vim tracker.conf
编辑tracker.conf,修改主要配置。
#提供服务的端口
port = 22122
#Tracker 数据和日志目录地址(根目录必须存在,子目录会自动创建)
base_path=/home/fastDFS/tracker
#HTTP 服务端口
http.server_post=8080
启动tracker
#启动
service fdfs_trackerd start
#关闭
service fdfs_tracker stop
初次启动成功后,会在/home/fastdfs/tracker
(配置的base_path)下创建data、log两个目录。
查看FastDFS Tracker是否已启动成功,22122端口被监听,则算是Tracker服务安装成功。
netstat -unltp |grep fdfs
tracker服务启动成功后,会在base_path下创建data、logs两个目录。
data目录下storage_groups.dat
存储分组信息。storage_servers.dat
存储服务器列表。
log目录下 tracker.log
tracker server日志文件。
4.配置FastDFS存储(Storage)
进入/etc/fdfs
目录,复制FastDFS 存储器样例配置文件storage.conf.sample,并重命名为storage.conf
cd /etc/fdfs
cp storage.conf.sample storage.conf
vim storage.conf
编辑storage.conf 修改主要配置
#指定此storage server 所在组
group_name=group1
#storage server
port=23000
#心跳间隔时间,单位为秒(这里指主动向tracker server发送心跳)
heart_beat_interval=30
#Storage数据和日志目录地址(根目录必须存在,子目录自动生成)
base_path=/home/fastDFS/storage
#存放文件时,storage server支持多个路径。这里配置存放文件的基路径数据,通常只配一个目录。
store_path_count=1
#逐一配置store_path_count个路径。索引号基于0。
#如果不配置store_path0,那它就和base_path对应路径一样,此处直接注释掉。
#store_path0=/home/fastdfs/file
#tracker_server 的列表,会主动连接tracker_server,有多个tracker_server时,每个tracker server写一行
tracker_server=39.97.179.107:22122
###访问端口 nginx需要监听的端口
http.server_port=80
启动storage
#启动
service fdfs_storaged start
#停止
service fdfs_storaged stop
查看是否启动成功
netstat -unltp |grep fdfs
查看Storage和Tracker 是否在通信/usr/bin/fdfs_moitor /etc/fdfs/storage.conf
storage和tracker一样,启动成功后,在base_path下创建data、log目录。
5.文件上传测试
修改客户端配置文件 client.conf
cd /etc/fdfs
cp client.conf.sample client.conf
vim client.conf
修改如下配置,其他默认
#client 的数据和日志目录
base_path=/home/fastDFS/client
#Tracker端口
tracker_server=39.97.179.107:22122
#tracker http服务端口
http.tracker_server_port=8080
上传测试
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /home/fastFDS/image-upload-test.jpg
上传成功后返回文件ID号group1/M00/00/00/rBHknF601ZCAJ_dvAA74ZYcH48k.jpg
返回的文件ID由group、存储目录、两级子目录fileid、文件后缀名拼接而成。
6.安装nginx
上面讲文件上传成功了,但我们无法访问下载。因此安装Nginx作为服务器以支持Http方式访问文件。同时,后面安装FastDFS的Nginx插件也需要Nginx环境。
安装nginx所需环境
yum install -y pcre pcre-devel zlib zlib-devel openssl openssl-devel
安装nginx
cd /home/fastDFS
tar -zxvf nginx-1.12.1.tar.gz
cd nginx-1.12.1
./configure
make && make install
启动nginx
cd /usr/local/nginx/sbin
./nginx
#其他命令
./nginx -s stop
./nginx -s quit
./nginx -s reload
./nginx -V
修改nginx 配置文件
vim /usr/localnginx/conf/nginx.conf
添加如下行,将/group1/M00 映射到/home/fastDFS/storage/data
location /group1/M00 {
alias /home/fastDFS/storage/data
}
重新加载配置
/usr/local/nginx/sbin/nginx -s reload
在浏览器直接访问即可获取文件。
7.配置nginx的fastdfs插件
fastdfs-nginx-module模块说明:
FastDFS通过Tracker服务器,将文件放在storage服务器存储,但是同组存储服务器之间需要进行文件复制,有同步延迟。
假设通过nginx取文件,恰巧落在了未同步完成的服务器,就会出现文件无法访问的情况。
而fastdfs-nginx-module可以重定向文件链接到源服务器取文件。避免复制延迟导致的文件无法访问。
解压fastdfs-nginx-module
unzip 5e5f3566bbfa57418b5506aaefbe107a42c9fcb1.zip
#重命名
mv fastdfs-nginx-module-5e5f3566bbfa57418b5506aaefbe107a42c9fcb1 fastdfs-nginx-module
在nginx中添加插件
#先停掉nginx服务
/usr/local/nginx/sbin/nginx -s stop
#进入nginx目录
cd /home/fastDFS/nginx-1.12.1
#添加模块
./configure --add-module=../fastdfs-nginx-module/src
#重新编译安装
make && make install
查看nginx版本信息
/usr/local/nginx/sbin/nginx -V
复制fastdfs-nginx-module源码中的配置文件到/etc/fdfs
目录,并修改
cp mod_fastdfs.conf /etc/fdfs/
修改配置文件
#连接超时时间
connect_timeout= 30
#tracker server信息
tracker_server=39.97.179.107:22122
StorageServer默认端口
storage_server_port=23000
如果文件ID的uri中包含/group** ,则要设置为true
url_have_group_name=true
#storage 配置的store_path路径,必须要和storage.conf中一致,统一注释掉
#store_path0 = /home/fastDFS/storage
复制FastDFS的部分配置文件到/etc/fdfs 目录
cd /home/fastDFS/fastdfs-5.05/conf
cp http.conf mime.types /etc/fdfs/
修改nginx配置,在之前加的group1/M00映射内,加入插件配置
注意:server的listen端口要与storage.conf
中配置的http.server_port
一致。
启动nginx,打印出插件pid就已经成功
集群搭建
FastDFS集群搭建非常简单,只需要在storage端配置文件里,将tracker的信息对应配置即可。
集群的配置
首先要有两套刚刚搭建的单机环境。修改Storage.conf和mod_fastdfs.conf 将其中tracker_server参数配置成两台机器
然后再client.conf中 tracker_server设置为两个tracker
然后进一步修改不同storage的group信息,给storage分组。重启所有服务集群即搭建完毕。