共计 12038 个字符,预计需要花费 31 分钟才能阅读完成。
前言
项目中用到文件服务器,有朋友推荐用 FastDFS,所以就了解学习了一番,感觉确实颇为强大,在此再次感谢淘宝资深架构师余庆大神开源了如此优秀的轻量级分布式文件系统,本篇文章就记录一下 FastDFS 的最新版本 5.0.5 在 CentOS7 中的安装与配置。
简介
首先简单了解一下基础概念,FastDFS 是一个开源的轻量级分布式文件系统,由跟踪服务器(tracker server)、存储服务器(storage server)和客户端(client)三个部分组成,主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务。FastDFS 的系统结构图如下:
如上图,FastDFS 的两个核心概念分别是:
- Tracker(跟踪器)
- Storage(存储节点)
Tracker 主要做调度工作,相当于 mvc 中的 controller 的角色,在访问上起负载均衡的作用。跟踪器和存储节点都可以由 一台或多台 服务器构成,跟踪器和存储节点中的服务器均可以随时增加或下线而不会影响线上服务,其中跟踪器中的所有服务器都是对等的,可以根据服务器的压力情况随时增加或减少。Tracker 负责管理所有的 Storage 和 group,每个 storage 在启动后会连接 Tracker,告知自己所属的 group 等信息,并保持周期性的心跳,tracker 根据 storage 的心跳信息,建立 group==>[storage server list]的映射表,Tracker 需要管理的元信息很少,会全部存储在内存中;另外 tracker 上的元信息都是由 storage 汇报的信息生成的,本身不需要持久化任何数据,这样使得 tracker 非常容易扩展,直接增加 tracker 机器即可扩展为 tracker cluster 来服务,cluster 里每个 tracker 之间是完全对等的,所有的 tracker 都接受 stroage 的心跳信息,生成元数据信息来提供读写服务。
Storage 采用了分卷 [Volume](或分组[group])的组织方式,存储系统由一个或多个组组成,组与组之间的文件是相互独立的,所有组的文件容量累加就是整个存储系统中的文件容量。一个卷[Volume](组[group])可以由 一台或多台 存储服务器组成,一个组中的存储服务器中的文件都是相同的,组中的多台存储服务器起到了 冗余备份和负载均衡 的作用,数据互为备份,存储空间以 group 内容量最小的 storage 为准,所以建议 group 内的多个 storage 尽量配置相同,以免造成存储空间的浪费。更多原理性的内容可以参考这篇文章,介绍的很详细:分布式文件系统 FastDFS 设计原理
接下来就具体看一下 FastDFS 的整个下载安装过程~
下载
目前作者最后一次 releases 的时间的 14 年 11 月 22 号,对应的最新版本是 5.0.5,直接在余大的 GitHub 上下载就可以了:
https://github.com/happyfish100/fastdfs/releases
如上图,由于 FastDFS 是纯 C 语言实现,只支持 Linux、FreeBSD 等 UNIX 系统,所以我们直接下载 tar.gz 的压缩包,同时 FastDFS 5.0.5 同以前版本相比将公共的一些函数等单独封装成了 libfastcommon 包,所以在安装 FastDFS 之前我们还必须安装 libfastcommon,在余大的 GitHub 首页可以看到:
下载完成后将下面这两个文件上传至 CentOS 服务器,然后就可以开始解压安装了:
安装
libfastcommon
首先第一步是安装 libfastcommon,我这里将 libfastcommon 上传到的 /usr/local 目录下,直接解压:
unzip libfastcommon-master.zip
解压成功后进入目录看一下压缩包的文件:
如果没有装解压工具 unzip 可以通过以下 yum 命令进行安装后再解压:
yum -y install unzip zip
解压完成后就可以进行编译安装了,分别执行 ./make.sh
和./make.sh install
,由于是新安装的系统有可能会提示找不到 gcc 命令:
如上图,所以我们先要安装 gcc 编译器:
yum -y install gcc-c++
看到如下信息说明 gcc 已经安装成功:
此时再次执行 ./make.sh
命令进行编译,没有 error 信息的话就说明编译成功了,最后再执行 ./make.sh install
进行安装,看到类似如下提示信息就说明 libfastcommon 已安装成功(画风突变,黑底白字看的眼睛累 T_T,所以换成白底黑字了):
至此 libfastcommon 就已经安装成功了,但注意一下上图中红色框标注的内容,libfastcommon.so 默认安装到了 /usr/lib64/libfastcommon.so,但是 FastDFS 主程序设置的 lib 目录是 /usr/local/lib,所以此处需要重新设置软链接(类似于 Windows 的快捷方式):
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
设置完毕后就可以开始安装 fastdfs 了。
FastDFS
第一步依然是解压:
tar -zxvf fastdfs-5.05.tar.gz
解压完成后进入目录 fastdfs-5.05,依次执行./make.sh 和./make.sh install:
./make.sh
./make.sh install
没有报错就说明安装成功了,在 log 中我们可以发现安装路径:
没错,正是安装到了 /etc/fdfs 中,我们看一下该目录下的文件:
如上图,安装成功后就会生成如上的 3 个.sample 文件(示例配置文件),我们再分别拷贝出 3 个后面用的正式的配置文件:
cp client.conf.sample client.conf
cp storage.conf.sample storage.conf
cp tracker.conf.sample tracker.conf
之后再查看一下 /etc/fdfs 的文件目录:
至此 FastDFS 已经安装完毕,接下来的工作就是依次配置 Tracker 和 Storage 了。
Tracker
在配置 Tracker 之前,首先需要创建 Tracker 服务器的文件路径,即用于存储 Tracker 的数据文件和日志文件等,我这里选择在 /opt 目录下创建一个 fastdfs_tracker 目录用于存放 Tracker 服务器的相关文件:
mkdir /opt/fastdfs_tracker
接下来就要重新编辑上一步准备好的 /etc/fdfs 目录下的 tracker.conf 配置文件,打开文件后依次做以下修改:
- disabled=false #启用配置文件(默认启用)
- port=22122 #设置 tracker 的端口号,通常采用 22122 这个默认端口
- base_path=/opt/fastdfs_tracker #设置 tracker 的数据文件和日志目录
- 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 端口正常被监听:
确认 tracker 正常启动后可以将 tracker 设置为开机启动,打开 /etc/rc.d/rc.local 并在其中加入以下配置:
service fdfs_trackerd start
Tracker 至此就配置好了,接下来就可以配置 FastDFS 的另一核心——Storage。
Storage
同理,步骤基本与配置 Tracker 一致,首先是创建 Storage 服务器的文件目录,需要注意的是同 Tracker 相比我多建了一个目录,因为 Storage 还需要一个文件存储路径,用于存放接收的文件:
mkdir /opt/fastdfs_storage
mkdir /opt/fastdfs_storage_data
接下来修改 /etc/fdfs 目录下的 storage.conf 配置文件,打开文件后依次做以下修改:
- disabled=false #启用配置文件(默认启用)
- group_name=group1 #组名,根据实际情况修改
- port=23000 #设置 storage 的端口号,默认是 23000,同一个组的 storage 端口号必须一致
- base_path=/opt/fastdfs_storage #设置 storage 数据文件和日志目录
- store_path_count=1 #存储路径个数,需要和 store_path 个数匹配
- store_path0=/opt/fastdfs_storage_data #实际文件存储路径
- tracker_server=192.168.111.11:22122 #tracker 服务器的 IP 地址和端口号,如果是单机搭建,IP 不要写 127.0.0.1,否则启动不成功(此处的 ip 是我的 CentOS 虚拟机 ip)
- http.server_port=8888 #设置 http 端口号
配置完成后同样要为 Storage 服务器的启动脚本设置软引用:
ln -s /usr/bin/fdfs_storaged /usr/local/bin
接下来就可以启动 Storage 服务了:
service fdfs_storaged start
命令执行后可以看到以下提示:
同理,如果启动成功,/opt/fastdfs_storage 中就可以看到启动后新生成的 data 和 logs 目录,端口 23000 也应被正常监听,还有一点就是文件存储路径下会生成多级存储目录,那么接下来看看是否启动成功了:
如上图,貌似没成功啊,因为启动 storage 后文件都没生成,为了确认我们看一下 storage 的端口情况:
果然是没启动成功!端口目前还是只监听了一个,storage 的 23000 端口并未被监听,那么我们只能去日志文件中找原因了,进入 /opt/fastdfs_storage/logs 目录下并打开 storaged.log 文件:
如上图,可以看到确实有一个 error,关键信息是:
ERROR – file: storage_func.c, line: 896, mkdir“/etc/fastdfs_storage_data/data”fail, errno: 2, error info: No such file or directory
没有文件或目录!再回头看一下 /etc/fdfs 目录下的 storage.conf 的配置:
果不其然配错了,我们指定成了 /etc/fastdfs_storage_data 目录,而实际上我们创建的位置是/opt/fastdfs_storage_data,粗心大意,老眼昏花!修改路径后再次重启 storage 服务,然后再看看 data 目录和实际存储文件的 /opt/fastdfs_storage_data:
如上图,可以看到 /opt/fastdfs_storage/data 目录下生成好的 pid 文件和 dat 文件,那么再看一下实际文件存储路径下是否有创建好的多级目录呢:
如上图,没有任何问题,data 下有 256 个 1 级目录,每级目录下又有256 个 2 级子目录, 总共 65536 个文件,新写的文件会以 hash 的方式被路由到其中某个子目录下,然后将文件数据直接作为一个本地文件存储到该目录中。那么最后我们再看一下 storage 服务的端口监听情况:
如上图,可以看到此时已经正常监听 tracker 的 22122 端口和 storage 的 23000 端口,至此 storage 服务器就已经配置完成,确定了 storage 服务器启动成功后,还有一项工作就是看看 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: 0server_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 = 0Storage 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 文件,打开文件后依次做以下修改:
- base_path=/opt/fastdfs_tracker #tracker 服务器文件路径
- tracker_server=192.168.111.11:22122 #tracker 服务器 IP 地址和端口号
- http.tracker_server_port=6666 # tracker 服务器的 http 端口号,必须和 tracker 的设置对应起来
配置完成后就可以模拟文件上传了,先给 /opt 目录下放一张图片(暴雪爸爸的 LOGO):
然后通过执行客户端上传命令尝试上传:
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /opt/BLIZZARD.jpg
运行后可以发现给我们返回了一个路径:
这就表示我们的文件已经上传成功了,当文件存储到某个子目录后,即认为该文件存储成功,接下来会为该文件生成一个文件名,文件名由 group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成,如下图:
同时在之前配置的 storage 服务器的实际文件存储路径中也可以根据返回的路径找到实际文件:
接下来尝试用浏览器发送 HTTP 请求访问一下文件:
此时发现并不能访问,因为 FastDFS 目前已不支持 http 协议,我们在 FastDFS 4.0.5 的版本更新日志中可以看到这样一条信息:
如上图,4.0.5 版本开始移除了自带的 HTTP 支持(因为之前自带的 HTTP 服务较为简单,无法提供负载均衡等高性能服务),所以余大提供了 nginx 上使用 FastDFS 的模块 fastdfs-nginx-module,下载地址如下:https://github.com/happyfish100/fastdfs-nginx-module,这样做最大的好处就是 提供了 HTTP 服务 并且 解决了 group 中 storage 服务器的同步延迟问题,接下来就具体记录一下 fastdfs-nginx-module 的安装配置过程。
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/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.conf 和mime.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 并按顺序依次编译以下内容:
- base_path=/opt/fastdfs_storage #保存日志目录
- tracker_server=192.168.111.11:22122 #tracker 服务器的 IP 地址以及端口号
- storage_server_port=23000 #storage 服务器的端口号
- url_have_group_name = true #文件 url 中是否有 group 名
- store_path0=/opt/fastdfs_storage_data # 存储路径
- 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 已启动成功:
通过浏览器也可以看到 nginx 的主页:
storage 服务器的 nginx 就已经安装完毕,接下来看一下 tracker 服务器的 nginx 安装。
tracker nginx
同理,再装一个 nginx,目录命名为 nginx2,安装路径依旧放在 /usr/local 下,由于和之前一样,此处就不再做详细解释:
mkdir nginx2
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/nginx2/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 访问文件。
HTTP 测试
再给 /opt 目录下上传一张暴雪爸爸的 LOGO 图:
通过客户端命令测试上传:
如上图,依旧上传成功,接下来的关键就是通过 HTTP 测试文件访问,打开浏览器输入 ip 地址 + 文件名 看看是否能正常访问该图片:
一切正常~ 至此关于 FastDFS 在 CentOS 7 下的部署测试就已经全部完成了。
总结
本篇文章记录了开源分布式文件系统 FastDFS 在 Linux CentOS 7 中安装部署以及测试的全过程,下一篇文章将会继续介绍通过 Java 客户端以及 SpringMVC 中结合 FastDFS 实现文件上传下载,The End。
CentOS 6.2 下 fastDFS 的完整安装和配置步骤 http://www.linuxidc.com/Linux/2012-12/75989.htm
FastDFS 在 Ubuntu 下的安装,PHP 客户端 http://www.linuxidc.com/Linux/2012-09/71459.htm
FastDFS 分布式文件服务器安装,及配置,测试 http://www.linuxidc.com/Linux/2012-09/71458.htm
FastDFS 整合 Nginx 问题整理 http://www.linuxidc.com/Linux/2012-09/71232.htm
CentOS 下搭建 FastDFS http://www.linuxidc.com/Linux/2012-09/70995.htm
Ubuntu 安装 FastDFS 全程记录 http://www.linuxidc.com/Linux/2012-03/56377.htm
FastDFS 的详细介绍:请点这里
FastDFS 的下载地址:请点这里
本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-09/135537.htm