介绍
参考
-
nginx模块:https://github.com/happyfish100/fastdfs-nginx-module
-
配置参考:
http://blog.mayongfa.cn/192.html
http://blog.mayongfa.cn/193.html
tracker-server:
跟踪服务器, 主要做调度工作, 起负载均衡的作用。 在内存中记录集群中所有存储组和存储服务器的状态信息, 是客户端和数据服务器交互的枢纽。 相比GFS中的master更为精简, 不记录文件索引信息, 占用的内存量很少。
storage-server:
存储服务器( 又称:存储节点或数据服务器) , 文件和文件属性( metadata) 都保存到存储服务器上。 Storage server直接利用OS的文件系统调用管理文件。
group:
组, 也可称为卷。 同组内服务器上的文件是完全相同的 ,同一组内的storage server之间是对等的, 文件上传、 删除等操作可以在任意一台storage server上进行 。
meta data:
文件相关属性,键值对( Key Value Pair) 方式,如:width=1024,heigth=768 。
部署
FastDfs服务架构图
本地部署服务
192.168.1.177安装fastdfs的tracker节点,以及nginx反向代理服务器用于下载服务。
192.168.1.188,192.168.1.189安装fastdfs的storage节点,默认分一组,一组内两台机器互为备份.
注意:为了做到高可用,一个group建议分为两台以上的机器。
安装 libfastcommon 和 FastDFS
- 下载安装 libfastcommon,这里是通过wget下载(我喜欢这种方式)。
wget https://github.com/happyfish100/libfastcommon/archive/V1.0.7.tar.gz
- 下载安装 libfastcommon
解压 libfastcommon,命令:
tar-zxvf V1.0.7.tar.gz
解压
编译,进入libfastcommon-1.0.7目录,命令:
cd libfastcommon-1.0.7
./make.sh
cd libfastcommon-1.0.7
./make.sh
安装,命令:
./make.sh install
安装
显示这样的画面,就是安装 libfastcommon 成功啦。
- 下载安装 FastDFS,这里也是通过wget下载。
wget https://github.com/happyfish100/fastdfs/archive/V5.05.tar.gz
解压缩
tar-zxvf V5.05.tar.gz
编译,进入fastfds-5.05目录,命令:
cd fastdfs-5.05
./make.sh
安装
./make.sh install
配置 Tracker 服务
上述安装成功后,在/etc/目录下会有一个fdfs的目录,进入它。会看到三个.sample后缀的文件,这是作者给我们的示例文件,我们需要把其中的tracker.conf.sample文件改为tracker.conf配置文件并修改它。看命令:
cp tracker.conf.sample tracker.conf
vim tracker.conf
# the base path to store data and log files
base_path=/data/fastdfs
# HTTP port on this tracker server
http.server_port=80
当然前提是你要有或先创建了/data/fastdfs目录。port=22122这个端口参数不建议修改,除非你已经占用它了。
修改完成保存并退出 vim ,这时候我们可以使用/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start来启动 Tracker服务,但是这个命令不够优雅,怎么做呢?使用ln -s建立软链接:
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
这时候我们就可以使用service fdfs_trackerd start来优雅地启动 Tracker服务了,是不是比刚才带目录的命令好记太多了(懒是社会生产力)。你也可以启动过服务看一下端口是否在监听,命令:
-
启动服务:service fdfs_trackerd start
-
查看监听:netstat-unltp|grep fdfs
看到22122端口正常被监听后,这时候就算 Tracker服务安装成功啦!
配置 Storage 服务
现在开始配置 Storage 服务,由于我这是单机器测试,你把 Storage 服务放在多台服务器也是可以的,它有Group(组)的概念,同一组内服务器互备同步,这里不再演示。直接开始配置,依然是进入/etc/fdfs的目录操作,首先进入它。会看到三个.sample后缀的文件,我们需要把其中的storage.conf.sample文件改为storage.conf配置文件并修改它。还看命令:
cp storage.conf.sample storage.conf
vim storage.conf
打开storage.conf文件后,找到这两个参数进行修改:
# the base path to store data and log files
base_path=/data/fastdfs/storage
# store_path#, based 0, if store_path0 not exists, it's value is base_path
# the paths must be exist
store_path0=/data/fastdfs/storage
#store_path1=/home/yuqing/fastdfs2
# tracker_server can ocur more than once, and tracker_server format is
# "host:port", host can be hostname or ip address
tracker_server=192.168.198.129:22122
当然你的/data/fastdfs目录下要有storage文件夹,没有就创建一个,不然会报错的,日志以及文件都会在这个下面,启动时候会自动生成许多文件夹。stroage的port=23000这个端口参数也不建议修改,默认就好,除非你已经占用它了。
修改完成保存并退出 vim ,这时候我们依然想优雅地启动 Storage服务,带目录的命令不够优雅,这里还是使用ln -s建立软链接:
ln -s /usr/bin/fdfs_storaged /usr/local/bin
执行命令启动服务:
service fdfs_storaged start
netstat-unltp|grep fdfs
很好,22122 和 23000端口都在监听了,这个时候你去/data/fastdfs/storage文件夹下看的话,会出现一大堆文件夹,而且进去还有一大堆,哈哈,这就是存放文件的啦!下一篇会讲它们的作用和怎么存储的。
应该是完成了。我们安装配置并启动了 Tracker 和 Storage 服务,也没有报错了。那他俩是不是在通信呢?我们可以监视一下:
/usr/bin/fdfs_monitor/etc/fdfs/storage.conf
接下来我们需要配合 Nginx 来进行文件的上传下载,这一篇就安装 Nginx 以及结合 fastdfs-nginx-module 模块使用。
安装 Nginx 和 fastdfs-nginx-module
- 下载 Nginx 和 fastdfs-nginx-module,这里是通过wget下载(我喜欢这种方式)。
wget-c https://nginx.org/download/nginx-1.10.1.tar.gz
wget https://github.com/happyfish100/fastdfs-nginx-module/archive/master.zip
- 解压 fastdfs-nginx-module,记着这时候别用tar解压了,因为是.zip文件,正确命令:
unzip master.zip
- 配置 nginx 安装,加入fastdfs-nginx-module模块。这是和普通 Nginx 安装不一样的地方,因为加载了模块。
./configure--add-module=../fastdfs-nginx-module-master/src/
如果已经安装过Nginx的话,只需要加上新模块重新编译即可。
先执行nginx -V查看当前nginx已安装的模块
把configure arguments:后的参数拷贝下载,放在./configure后面,再加上--add-module=/home/leung/fastdfs-nginx-module/src/即可,add-module后的路径请根据实际情况进行替换.
./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-file-aio --with-threads --with-ipv6 --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_ssl_module --with-cc-opt='-g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2'--with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed'--add-module=/home/leung/fdfs/fastdfs-nginx-module/src/
完毕后只执行make,不要执行make install
配置 fastdfs-nginx-module 和 Nginx
- 配置mod-fastdfs.conf,并拷贝到/etc/fdfs文件目录下。
cd/software/fastdfs-nginx-module-master/src/
vim mod_fastdfs.conf
cp mod_fastdfs.conf/etc/fdfs
修改mod-fastdfs.conf配置只需要修改我标注的这三个地方就行了,其他不需要也不建议改变。
# FastDFS tracker_server can ocur more than once, and tracker_server format is
# "host:port", host can be hostname or ip address
# valid only when load_fdfs_parameters_from_tracker is true
tracker_server=192.168.198.129:22122
# if the url / uri including the group name
# set to false when uri like /M00/00/00/xxx
# set to true when uri like ${group_name}/M00/00/00/xxx, such as group1/M00/xxx
# default value is false
url_have_group_name=true
# store_path#, based 0, if store_path0 not exists, it's value is base_path
# the paths must be exist
# must same as storage.conf
store_path0=/data/fastdfs/storage
#store_path1=/home/yuqing/fastdfs1
接着我们需要把fastdfs-5.05下面的配置中还没有存在/etc/fdfs中的拷贝进去
cd/software/fastdfs-5.05/conf
cp anti-steal.jpg http.conf mime.types/etc/fdfs/
- 配置 Nginx。编辑nginx.conf文件:
cd /usr/local/nginx/conf
vi nginx.conf
在配置文件中加入:
location/group1/M00{
root/data/fastdfs/storage/;
ngx_fastdfs_module;
}
由于我们配置了group1/M00的访问,我们需要建立一个group1文件夹,并建立M00到data的软链接。
mkdir /data/fastdfs/storage/data/group1
ln -s /data/fastdfs/storage/data /data/fastdfs/storage/data/group1/M00
启动 Nginx ,会打印出fastdfs模块的pid,看看日志是否报错,正常不会报错的
/usr/local/nginx/sbin/nginx
打开浏览器,可以看到如下画面,说明我们 Nginx 结合 fastdfs-nginx-module 模块安装并配置成功啦!
Q&A
安装fastdfs-nginx-module的依赖包编译没有成功,错误如下:
/usr/local/fastdfs-nginx-module-master/src/ngx_http_fastdfs_module.c
In file included from /usr/local/fastdfs-nginx-module-master/src/ngx_http_fastdfs_module.c:6:0:
/usr/local/fastdfs-nginx-module-master/src/common.c: 在函数‘fdfs_http_request_handler’中:
/usr/local/fastdfs-nginx-module-master/src/common.c:1245:61: 错误:‘FDFSHTTPParams’没有名为‘support_multi_range’的成员
(pContext->range_count > 1 && !g_http_params.support_multi_range))
^
make[1]: *** [objs/addon/src/ngx_http_fastdfs_module.o] 错误 1
make[1]: 离开目录“/usr/local/nginx-1.12.0”
make: *** [build] 错误 2
网上查了下资料,是因为fastdfs-nginx-module版本问题,我搭建的版本是Version 5.05 2016-12-29。作者还有一个5.10的发行版本,你如果没有下载最近的,整合nginx的时候可能会遇到这个问题。
遇到这个错误的原因是,在fastdfs-nginx-module的HISTORY中你可以看到:
整合的时候,fastdfs-nginx-module中的support_multi_range在Version 5.10以下的版本中找不到。
Version 5.11对应的fastdfs-nginx-module的Version 1.20
Version 5.10对应的fastdfs-nginx-module的Version 1.19
所以我这边fastdfs-nginx-module选择1.20以前的版本:
重新解压,config,编译等了一会,幸好,编译成功了,make install,Nginx安装成功了。
测试
完成上面的步骤后,我们已经安装配置完成了全部工作,接下来就是测试了。因为执行文件全部在/usr/bin目录下,我们切换到这里,并新建一个test.txt文件,随便写一点什么,我写了This is a test file. by:mafly这句话在里边。然后测试上传:
cd/usr/bin
vim test.txt
fdfs_test/etc/fdfs/client.conf upload test.txt
cd /etc/fdfs
cp client.conf.sample client.conf
vim client.conf
/usr/bin/fdfs_test /etc/fdfs/client.conf upload/usr/bin/test.txt
成功啦!!!返回文件信息及上传后的文件 HTTP 地址,你打开浏览器访问一下试试
封装
官方提供了java客户端的封装开源代码,我们可以自行下载进行上传下载测试
https://github.com/happyfish100/fastdfs-client-java
总结
这篇文章一步一步的讲了通过 Nginx 结合fastdfs-nginx-module模块来进行上传测试及下载工作,当然这也需要结合上一篇 Tracker 和 Storage 服务来进行,这算是整体进行了 FastDFS 的安装与配置,分布式的配置也几乎和这没差别,只不过是增加了不同组和多台服务器,有机会希望你亲自试试。
可能接下来,我会结合项目中实际使用再写一下关于 FastDFS 的一些使用感受吧,可能是怎样搭建一个近乎商用的文件系统,上传下载分享好用到爆,好吧,我又吹牛了。接下来其实还有更多关于文件的工作,比如防盗链、图片切图、视频处理等等。
哈哈,先这样吧。