FastDFS是一个开源的,高性能的分布式的文件存储系统,主要功能包括:文件存储,同步和访问,设计基于文件服务的站点,例如图片分享和视频分享网站

FastDFS有两个角色:跟踪服务(tracker)和存储服务(storage),跟踪服务控制,调度文件以负载均衡的方式访问;存储服务包括:文件存储,文件同步,提供文件访问接口,同时以key value的方式管理文件的元数据。

跟踪和存储服务可以由一台和多台服务器组成,同时可以动态的添加,删除跟踪和存储服务而不会对在线服务产生影响,在集群中,tracker服务是对等的     

存储系统由一个或多个卷组成的,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是就是整个整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。在卷中增加服务器时,同步已有文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上去提供服务。当存储空间不足或即将耗尽时,可以动态的添加卷。只需要新增一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。

将安装包放到/usr/local/src/目录下

安装libfastcommon

unzip libfastcommon-master.zip

安装完成后进入libfastcommon-master目录

FastDFS_第1张图片

执行./make.sh和./make.sh install 进行安装

如果执行./make.sh时出现

wKiom1jm8InDf0qEAAAr7AJ-PJw275.png-wh_50

执行 yum -y install gcc-c++安装gcc编译器

出现如下图提示表明安装成功

wKiom1jm8XKgwl-KAAAusKyxEv8638.png至此libfastcommon就已经安装成功了,但注意一下上图中红色框标注的内容,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/libfdfsclient.so /usr/local/lib/libfdfsclient.so

ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so

安装FastDFS

tar -xzvf fastdfs-5.05.tar.gz 

cd fastdfs-5.05

进入目录后执行./make.sh和./make.sh install

FastDFS_第2张图片安装完成后,会在/etc/fdfs目录下生成三个.sample配置文件,将三个配置文件复制为.conf结尾的文件


配置tracker

在配置Tracker之前,首先需要创建Tracker服务器的文件路径,即用于存储Tracker的数据文件和日志文件等,我这里选择在/opt目录下创建一个fastdfs_tracker目录用于存放Tracker服务器的相关文件:

mkdir /opt/fastdfs_tracker

接下来就要重新编辑上一步准备好的/etc/fdfs目录下的tracker.conf配置文件,打开文件后依次做以下修改:

  1. disabled=false #启用配置文件(默认启用)

  2. port=22122 #设置tracker的端口号,通常采用22122这个默认端口

  3. base_path=/opt/fastdfs_tracker #设置tracker的数据文件和日志目录

  4. http.server_port=6666 #设置http端口号,默认为8080

配置完成后就可以启动Tracker服务器了,但首先依然要为启动脚本创建软引用,因为fdfs_trackerd等命令在/usr/local/bin中并没有,而是在/usr/bin路径下:

ln -s /usr/bin/fdfs_trackerd /usr/local/bin
ln -s /usr/bin/stop.sh /usr/local/bin
ln -s /usr/bin/restart.sh /usr/local/bin

最后通过命令启动Tracker服务器:

service fdfs_trackerd start

如果启动命令执行成功,那么同时在刚才创建的tracker文件目录/opt/fastdfs_tracker中就可以看到启动后新生成的data和logs目录,tracker服务的端口也应当被正常监听,最后再通过netstat命令查看一下端口监听情况:

netstat -unltp|grep fdfs

可以看到tracker服务运行的22122端口正常被监听


配置storage



同理,步骤基本与配置Tracker一致,首先是创建Storage服务器的文件目录,需要注意的是同Tracker相比我多建了一个目录,因为Storage还需要一个文件存储路径,用于存放接收的文件:

mkdir /opt/fastdfs_storage 
mkdir /opt/fastdfs_storage_data

接下来修改/etc/fdfs目录下的storage.conf配置文件,打开文件后依次做以下修改:

  1. disabled=false #启用配置文件(默认启用)

  2. group_name=group1 #组名,根据实际情况修改

  3. port=23000 #设置storage的端口号,默认是23000,同一个组的storage端口号必须一致

  4. base_path=/opt/fastdfs_storage #设置storage数据文件和日志目录

  5. store_path_count=1 #存储路径个数,需要和store_path个数匹配

  6. store_path0=/opt/fastdfs_storage_data #实际文件存储路径

  7. tracker_server=192.168.111.11:22122 #tracker 服务器的 IP地址和端口号,如果是单机搭建,IP不要写127.0.0.1,否则启动不成功(此处的ip是我的CentOS虚拟机ip)

  8. http.server_port=8888 #设置 http 端口号

配置完成后同样要为Storage服务器的启动脚本设置软引用:

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

接下来就可以启动Storage服务了:

service fdfs_storaged start

启动成功后,会发现在/opt/fdfs_storage/data目录下生成如下文件

FastDFS_第3张图片

切换到文件的实际存储路径/opt/fast_storage_data/data,该目录下有创建好的多级目录

wKiom1jm_nOhRfOkAABBadvoVn0470.png

data下有256个1级目录,每级目录下又有256个2级子目录总共65536个文件,新写的文件会以hash的方式被路由到其中某个子目录下,然后将文件数据直接作为一个本地文件存储到该目录中。storage服务器是否已经登记到 tracker服务器(也可以理解为tracker与storage是否整合成功),运行以下命令:

/usr/bin/fdfs_monitor /etc/fdfs/storage.conf

[root@localhost /]# /usr/bin/fdfs_monitor /etc/fdfs/storage.conf 
[2016-09-23 12:59:26] DEBUG - base_path=/opt/fastdfs_storage, connect_timeout=30, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0

server_count=1, server_index=0

tracker server is 192.168.111.11:22122

group count: 1

Group 1: 
group name = group1 
disk total space = 6818 MB 
disk free space = 2169 MB 
trunk free space = 0 MB 
storage server count = 1 
active server count = 1 
storage server port = 23000 
storage HTTP port = 8888 
store path count = 1 
subdir count per path = 256 
current write server index = 0 
current trunk file id = 0

Storage 1: 
id = 192.168.111.11 
ip_addr = 192.168.111.11 ACTIVE 
http domain = 
version = 5.05 
join time = 2016-09-23 11:15:54 
up time = 2016-09-23 12:33:26 
total storage = 6818 MB 
free storage = 2169 MB 
upload priority = 10 
store_path_count = 1 
subdir_count_per_path = 256 
storage_port = 23000 
storage_http_port = 8888 
current_write_path = 0 
source storage id = 
if_trunk_server = 0 
connection.alloc_count = 256 
connection.current_count = 0 
connection.max_count = 0 
total_upload_count = 0 
success_upload_count = 0 
total_append_count = 0 
success_append_count = 0 
total_modify_count = 0 
success_modify_count = 0 
total_truncate_count = 0 
success_truncate_count = 0 
total_set_meta_count = 0 
success_set_meta_count = 0 
total_delete_count = 0 
success_delete_count = 0 
total_download_count = 0 
success_download_count = 0 
total_get_meta_count = 0 
success_get_meta_count = 0 
total_create_link_count = 0 
success_create_link_count = 0 
total_delete_link_count = 0 
success_delete_link_count = 0 
total_upload_bytes = 0 
success_upload_bytes = 0 
total_append_bytes = 0 
success_append_bytes = 0 
total_modify_bytes = 0 
success_modify_bytes = 0 
stotal_download_bytes = 0 
success_download_bytes = 0 
total_sync_in_bytes = 0 
success_sync_in_bytes = 0 
total_sync_out_bytes = 0 
success_sync_out_bytes = 0 
total_file_open_count = 0 
success_file_open_count = 0 
total_file_read_count = 0 
success_file_read_count = 0 
total_file_write_count = 0 
success_file_write_count = 0 
last_heart_beat_time = 2016-09-23 12:58:59 
last_source_update = 1970-01-01 08:00:00 
last_sync_update = 1970-01-01 08:00:00 
last_synced_timestamp = 1970-01-01 08:00:00

如上所示,看到192.168.111.11 ACTIVE 字样即可说明storage服务器已经成功登记到了tracker服务器,同理别忘了添加开机启动,打开/etc/rc.d/rc.local并将如下配置追加到文件中:

service fdfs_storage start

至此我们就已经完成了fastdfs的全部配置,此时也就可以用客户端工具进行文件上传下载的测试了。

初步测试

测试时需要设置客户端的配置文件,编辑/etc/fdfs目录下的client.conf 文件,打开文件后依次做以下修改:

  1. base_path=/opt/fastdfs_tracker #tracker服务器文件路径

  2. tracker_server=192.168.111.11:22122 #tracker服务器IP地址和端口号

  3. http.tracker_server_port=6666 # tracker 服务器的 http 端口号,必须和tracker的设置对应起来


然后通过执行客户端上传命令尝试上传:

/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /usr/local/src/fastdfs_v5.05.tar.gz

运行后可以发现给我们返回了一个路径:
group1/M00/00/00/wKiJDVjvmuSAOcKOAAUggSnIHZU.tar.g

这就表示我们的文件已经上传成功了,当文件存储到某个子目录后,即认为该文件存储成功,接下来会为该文件生成一个文件名,文件名由group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成.
同时在之前配置的storage服务器的实际文件存储路径中也可以根据返回的路径找到实际文件
fastdfs-nginx-module

在余大的GitHub上下载好fastdfs-nginx-module上传到我们的CentOS中就可以开始安装了,在安装nginx之前需要先安装一些模块依赖的lib库,我在以前写的文章有做详细介绍(Linux CentOS 7 & Tengine(Nginx)安装与配置),直接贴出安装代码:

yum -y install pcre pcre-devel  yum -y install zlib zlib-devel  yum -y install openssl openssl-devel

依次装好这些依赖之后就可以开始安装nginx了。

storage nginx

首先是为storage服务器安装nginx,首先将nginx和fastdfs-nginx-module的安装包上传至CentOS
首先分别进行解压:

tar -zxvf nginx-1.8.1.tar.gz
unzip fastdfs-nginx-module-master.zip

解压成功后就可以编译安装nginx了,进入nginx目录并输入以下命令进行配置:

./configure --prefix=/usr/local/nginx --add-module=/usr/local/fastdfs-nginx-module-master/src

紧接着就可以进行编译安装了,依次执行以下命令:

make 
make install
编译时会报错:
/usr/src/fastdfs-nginx-module/src/common.c:21:25:致命错误:fdfs_define.h:没有那个文件或目录
     #include "fdfs_define.h"编译中断。
原因:编译安装nginx的fastdfs插件的头文件没有找到,由于编译nginx时候系统会到/usr/local/include,而编译安装fastdfs-nginx-module时则默认保存在了/usr/include目录。
修复:ln -s /usr/include/fast* /usr/local/include/

安装完成后,我们在我们指定的目录/usr/local/nginx中就可以看到nginx的安装目录了

接下来要修改一下nginx的配置文件,进入conf目录并打开nginx.conf文件加入以下配置

listen       9999;
location ~/group1/M00 {
      root /opt/fastdfs_storage_data/data;
      ngx_fastdfs_module;
}

然后进入FastDFS的安装目录/usr/local/fastdfs-5.05目录下的conf目录,将http.confmime.types拷贝到/etc/fdfs目录下:

cp -r /usr/local/fastdfs-5.05/conf/http.conf /etc/fdfs/ 
cp -r /usr/local/fastdfs-5.05/conf/mime.types /etc/fdfs/

接下来还需要把fastdfs-nginx-module安装目录中src目录下的mod_fastdfs.conf也拷贝到/etc/fdfs目录下:

cp -r /usr/local/fastdfs-nginx-module-master/src/mod_fastdfs.conf /etc/fdfs/

看一下/etc/fdfs目录下当前所有的配置文件

没什么问题,接下来就需要编辑刚拷贝的这个mod_fastdfs.conf文件了,打开mod_fastdfs.conf并按顺序依次编译以下内容:

  1. base_path=/opt/fastdfs_storage #保存日志目录

  2. tracker_server=192.168.111.11:22122 #tracker服务器的IP地址以及端口号

  3. storage_server_port=23000 #storage服务器的端口号

  4. url_have_group_name = true #文件 url 中是否有 group 名

  5. store_path0=/opt/fastdfs_storage_data # 存储路径

  6. group_count = 3 #设置组的个数,事实上这次只使用了group1

设置了group_count = 3,接下来就需要在文件尾部追加这3个group setting:

[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/opt/fastdfs_storage_data
[group2]
group_name=group2
storage_server_port=23000
store_path_count=1
store_path0=/opt/fastdfs_storage_data
[group3]group_name=group3
storage_server_port=23000
store_path_count=1
store_path0=/opt/fastdfs_storage_data

接下来还需要建立 M00 至存储目录的符号连接:

ln  -s  /opt/fastdfs_storage_data/data  /opt/fastdfs_storage_data/data/M00

最后启动nginx:

/usr/local/nginx/sbin/nginx

通过浏览器也可以看到nginx的主页

storage服务器的nginx就已经安装完毕,接下来看一下tracker服务器的nginx安装。

tracker nginx

同理,再装一个nginx,安装路径依旧放在/usr/local下,由于和之前一样,此处就不再做详细解释:

cd nginx-1.8.1/
./configure --prefix=/usr/local/nginx2 --add-module=/usr/local/fastdfs-nginx-module-master/src
make
make install

接下来依然是修改nginx2的配置文件,进入conf目录并打开nginx.conf文件加入以下配置,storage的nginx无需修改listen端口,即默认的80端口,并将upstream指向tracker的nginx地址:

upstream fdfs_group1 {     server 127.0.0.1:9999;
}

location /group1/M00 {
     proxy_pass http://fdfs_group1;}

接下来启动nginx2:

/usr/local/nginx/sbin/nginx

此时访问nginx2的主页,由于没有修改端口,直接访问ip地址即可

最后一步就是需要修改/etc/fdfs目录下的client.conf文件,打开该文件并加入以下配置:

base_path=/data/fastdfs_storage  #日志存放路径tracker_server=192.168.116.145:22122  #tracker 服务器 IP 地址和端口号http.tracker_server_port=6666  # tracker 服务器的 http 端口号,必须和tracker的设置对应起来

至此关于fastdfs就已经全部配置完毕了,再一次进行测试看看是否能正常上传文件并通过http访问文件。

通过访问 Storage 节点中的 Nginx 的文件

http://192.168.111.11:8888/group1/M00/00/00/wKgBh1Xtr9-AeTfWAAVFOL7FJU4.tar.gz

现在可以通过 Tracker 中的 Nginx 来进行访问
http://192.168.111.11:80/group1/M00/00/00/wKgBh1Xtr9-AeTfWAAVFOL7FJU4.tar.gz

通过访问发现测试成功,至此初步搭建完成