fastDFS:
FastDFS是一款开源的轻量级分布式文件系统纯C实现,支持Linux、FreeBSD等UNIX系统类google FS,不是通用的文件系统,只能通过专有API访问,目前提供了C、Java和PHP API为互联网应用量身定做,解决大容量文件存储问题,追求高性能和高扩展性FastDFS可以看做是基于文件的key value pair存储系统,称作分布式文件存储服务更为合适。
tracker-server:
跟踪服务器, 主要做调度工作, 起负载均衡的作用。 在内存中记录集群中所有存储组和存储服务器的状态信息, 是客户端和数据服务器交互的枢纽。 相比GFS中的master更为精简, 不记录文件索引信息, 占用的内存量很少。
storage-server:
存储服务器( 又称:存储节点或数据服务器) , 文件和文件属性( metadata) 都保存到存储服务器上。 Storage server直接利用OS的文件系统调用管理文件。
group:
组, 也可称为卷。 同组内服务器上的文件是完全相同的 ,同一组内的storage server之间是对等的, 文件上传、 删除等操作可以在任意一台storage server上进行 。
meta data:
文件相关属性,键值对( Key Value Pair) 方式,如:width=1024,heigth=768 。
单机文件系统的对比
适用场景:
特别适合以中小文件( 建议范围: 4KB 到 500MB ) 为载体的在线服务, 如相册网站、 视频网站等等。
部署结构
适合小公司的最小化部署图
192.168.1.177安装fastdfs的tracker节点,以及nginx反向代理服务器用于下载服务。
192.168.1.188,192.168.1.189安装fastdfs的storage节点,默认分一组,一组内两台机器互为备份.
注意:为了做到高可用,一个group建议分为两台以上的机器。
tracker安装
安装 libfastcommon、perl依赖,下载libfastcommon-master.zip,上传到服务器的/usr目录下。
https://github.com/happyfish100/libfastcommon
[root@localhost usr]# unzip libfastcommon-master.zip
[root@localhost usr]# cd libfastcommon-master
[root@localhost usr]# ./make.sh
[root@localhost usr]# ./make.sh install
[root@localhost usr]# yum install perl
编译安装fastdfs
[root@localhost usr] # tar -zxvf fastdfs-5.08.tar.gz [root@localhost usr] # cd fastdfs-5.08 [root@localhost fastdfs-5.08] # ./make.sh [root@localhost fastdfs-5.08] # ./make.sh install [root@localhost fastdfs-5.08]# ./make.sh install
[root@localhost fastdfs-5.08]#mkdir -p /usr/bin
[root@localhost fastdfs-5.08]#mkdir -p /etc/fdfs
[root@localhost fastdfs-5.08]#cp -f fdfs_trackerd /usr/bin
if [ ! -f /etc/fdfs/tracker.conf.sample ]; then cp -f ../conf/tracker.conf /etc/fdfs/tracker.conf.sample; fi mkdir -p /usr/bin mkdir -p /etc/fdfs cp -f fdfs_storaged /usr/bin if [ ! -f /etc/fdfs/storage.conf.sample ]; then cp -f ../conf/storage.conf /etc/fdfs/storage.conf.sample; fi mkdir -p /usr/bin mkdir -p /etc/fdfs mkdir -p /usr/lib64 mkdir -p /usr/lib cp -f fdfs_monitor fdfs_test fdfs_test1 fdfs_crc32 fdfs_upload_file fdfs_download_file fdfs_delete_file fdfs_file_info fdfs_appender_test fdfs_appender_test1 fdfs_append_file fdfs_upload_appender /usr/bin if [ 0 -eq 1 ]; then cp -f libfdfsclient.a /usr/lib64; cp -f libfdfsclient.a /usr/lib/;fi if [ 1 -eq 1 ]; then cp -f libfdfsclient.so /usr/lib64; cp -f libfdfsclient.so /usr/lib/;fi mkdir -p /usr/include/fastdfs cp -f ../common/fdfs_define.h ../common/fdfs_global.h ../common/mime_file_parser.h ../common/fdfs_http_shared.h ../tracker/tracker_types.h ../tracker/tracker_proto.h ../tracker/fdfs_shared_func.h ../storage/trunk_mgr/trunk_shared.h tracker_client.h storage_client.h storage_client1.h client_func.h client_global.h fdfs_client.h /usr/include/fastdfs if [ ! -f /etc/fdfs/client.conf.sample ]; then cp -f ../conf/client.conf /etc/fdfs/client.conf.sample; fi
如出现以上信息,说明安装成功。
fastDFS命令目录:/usr/bin
fastDFS配置文件目录:/etc/fdfs
创建fastdfs数据目录
mkdir -pv /data/fastdfs/tracker
修改tracker.conf中的 base_path=/data/fastdfs/tracker,即刚才配置的数据文件目录
cp etc/fdfs/tracker.conf.sample etc/fdfs/tracker.conf
vi etc/fdfs/tracker.conf
启动FASTDFS
cd /usr/bin
fdfs_trackerd /etc/fdfs/tracker.conf restart
storage安装
storage的安装与tracker安装类似,首先编译安装fastdfs,然后修改配置文件。
创建配置文件
cp etc/fdfs/storage.conf.sample etc/fdfs/storage.conf
vi etc/fdfs/storage.conf
修改tracker.conf中的
disabled=false #启用配置文件 group_name=group1 #组名,根据实际情况修改 port=23000 #设置 storage 的端口号 base_path=/data/fastdfs/storage #设置 storage 的日志目录(需预先创建) store_path_count=1 #存储路径个数,需要和 store_path 个数匹配 store_path0=/data/fastdfs/storage #存储路径 tracker_server=192.168.1.177:22122 #tracker 服务器的 IP 地址和端口号
启动
cd /usr/bin
./fdfs_storaged /etc/fdfs/storage.conf restart
验证,默认端口是22122,23000
[root@localhost bin]# netstat -antp|grep fdfs
tcp 0 0 0.0.0.0:22122 0.0.0.0:* LISTEN 73469/./fdfs_tracke
tcp 0 0 0.0.0.0:23000 0.0.0.0:* LISTEN 76354/./fdfs_storag
tcp 0 0 10.0.4.192:59805 10.0.4.192:22122 ESTABLISHED 76354/./fdfs_storag
tcp 0 0 10.0.4.192:22122 10.0.4.192:59805 ESTABLISHED 73469/./fdfs_tracke
配置client并测试上传
编辑/etc/client.conf 文件
修改配置文件的这几项(根据数据情况修改):
base_path=/data/fastdfs/client
tracker_server=10.0.4.192:22122
那么接下来就可以进行一个简单文件上传测试了
cd /usr/local/bin
./fdfs_test /etc/fdfs/client.conf upload /data/img/fab2233a8c2e5b0ba175f86f8e2a67d2.jpg
上图上传的是client.conf ,执行成功会返回对应的组+M00+图片的相对路径(也即上述storage配置的路径)。如果需要用浏览器访问该图片,就需要nginx来做反向代理,直接访问是不行的。
安装和配置nginx
那么接下来就需要安装和配置nginx,文章的开篇说到,openssl,pcre,zlib是nginx的依赖,如果不能使用命令安装自动安装的话,就需要手动的一个个安装。
安装nginx依赖
1.安装pcre
2.安装openssl
3.安装zlib
nginx的依赖模块都已经安装完毕,接着可以进行安装nginx,下载nginx源码,进入目录,执行安装:
./configure --prefix=/usr/local/nginx (--prefix是安装到那个目录下)
make
make install
安装完nginx后进行nginx的配置nginx.conf
location /group1/M00{
root /fastdfs/storage/data;
ngx_fastdfs_module;
}
这个时候你监听的端口后默认是80,之前我配置storage文件的时候的http.server_port就有用到80,如需要改其他端口的,可根据情况自行修改。
安装和配置nginx插件fastdfs-nginx-module
下载源码,进入源码目录fastdfs-nginx-module下src目录,找到config文件,(这一步很重要,很重要,很重要(重要的事情说三遍)我就是被一些文章弄晕了几天,导致启动nginx模块的时候出现错误,如果上面启动nginx报错的话,先不用着急,接着安装nginx插件,这里配置好重新编译一遍,然后重新启动nginx就ok了)
ngx_addon_name=ngx_http_fastdfs_module
if test -n "${ngx_module_link}"; then
ngx_module_type=HTTP
ngx_module_name=$ngx_addon_name
ngx_module_incs="/usr/include/fastdfs /usr/include/fastcommon/"
ngx_module_libs="-lfastcommon -lfdfsclient"
ngx_module_srcs="$ngx_addon_dir/ngx_http_fastdfs_module.c"
ngx_module_deps=
CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64 -DFDFS_OUTPUT_CHUNK_SIZE='256*1024' -DFDFS_MOD_CONF_FILENAME='\"/etc/fdfs/mod_fastdfs.conf\"'"
. auto/module
else
HTTP_MODULES="$HTTP_MODULES ngx_http_fastdfs_module"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_fastdfs_module.c"
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
CORE_LIBS="$CORE_LIBS -lfastcommon -lfdfsclient"
CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64 -DFDFS_OUTPUT_CHUNK_SIZE='256*1024' -DFDFS_MOD_CONF_FILENAME='\"/etc/fdfs/mod_fastdfs.conf\"'"
fi
红色框部分是重点需要修改的地方,不这样修改nginx无法编译成功。
接着需要将插件添加到nginx
进入都nginx源码目录,执行添加模块:
./configure --prefix=/usr/local/nginx --add-module=/root/fastdfs-nginx-module/src/
make
make install
拷贝并修改fastdfs-nginx-module的配置文件
cp /root/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs
vim 修改/etc/fdfs/mod_fastdfs.conf 保存退出
修改如下几项:
tracker_server=192.168.1.188:22122
store_path0=/data/fastdfs/storage
base_path=/data/fastdfs/storage/data
url_have_group_name = true
建立软连接(配置文件中storage存放数据的路径):
ln -s /data/fastdfs/storage/data /data/fastdfs/storage/data/M00
将FastDFS_v4.06配置目录下的2个文件复制到/etc/fdfs目录下:
cp /usr/local/fastdfs-5.05/conf/http.conf .
cp /usr/local/fastdfs-5.05/conf/mime.types .
最后我再进行一次上传文件测试:
cd /usr/local/bin
./fdfs_test /etc/fdfs/client.conf upload /data/img/fab2233a8c2e5b0ba175f86f8e2a67d2.jpg
上传了一张测试图片
然后再浏览器上面输入自己的ip+端口号+文件路径(ip换成绑定的对应域名也行)
如果想集成image_filter插件,实现通过路径访问实时对图片进行裁剪操作,可在nginx下添加image_filter模块:
--with-http_image_filter_module
修改nginx配置:
location ~ /group1/M00/(.*)_([0-9]+)x([0-9]+)\.jpg{
root /data/fastdfs/storage/data;
ngx_fastdfs_module;
set $w $2;
set $h $3;
if ($w != "0") {
rewrite /group1/M00/(.+)_(\d+)x(\d+)\.(jpg|gif|png)$ /group1/M00/$1.$4 break;
}
image_filter resize $w $h;
image_filter_buffer 2M;
}
location ~ group1/M00/(.+)\.?(.+){
alias /data/fastdfs/storage/data;
ngx_fastdfs_module;
}
重启nginx后通过图片访问路径:
在网站访问量不是很高磁盘有限不想生成多余的图片文件的前提下可,就可以用它实时缩放图片,旋转图片,验证图片有效性以及获取图片宽高以及图片类型信息,由于是即时计算的结果,所以网站访问量大的话,不建议使用。