FastDFS详解

FastDFS 是一个开源的高性能分布式文件系统(DFS) ,主要解决海量数据存储问题,特别适合中小文件(建议范围:400K~500M)为载体的在线服务。

主要功能:

  • 文件存储
  • 文件同步和文件访问
  • 高容量和负载均衡。

FastDFS 系统有三个角色
- 跟踪服务器 (Tracker Server):跟踪服务器 主要做调度工作,起到均衡作用;负责管理所有的storage server和group,每个storage在启动后会连接Tracker,告知自己所属group等信息,并保持周期性心跳。(存储文件的索引)
- 存储服务器(Storage Server):存储服务器,主要提供容量和备份服务;以group为单位,每个group内可以有多台storage server 数据互为备份。
- 客户端 (Client): 客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。

FastDFS架构

存储策略

为了支持大容量,存储节点采用分组得方式。存储系统由多个分组组成。组与组之间得文件时相互独立的。 所有组得文件容量累加就是整个存储系统中得文件容量。一个组可以由一台或多台服务器组成。一个组内各个存储服务器中的文件都是相同的。组中多台服务器起到了冗余、备份和负载的作用。在组中增加服务器时,同步已有的文件,由系统自动完成。同步完成后,系统自动将新增服务器切换到线上提供服务。

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启动结果

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 启动状态

查看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、文件后缀名拼接而成。

文件ID结构
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
nginx配置

在浏览器直接访问即可获取文件。

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映射内,加入插件配置


ngx_fastdfs_module

注意: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分组。重启所有服务集群即搭建完毕。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342