1、FastDFS简介
1.1 介绍
FastDFS是一个开源的,高性能的的分布式文件系统,他主要的功能包括:文件存储,同步和访问,设计基于高可用和负载均衡,FastDFS非常适用于基于文件服务的站点,例如图片分享和视频分享网站。
FastDFS它
是一个轻量级的开源分布式文件系统,主要解决了大容量的文件存储和高并发访问的问题,文件存取时实现了负载均衡。
支持存储服务器在线扩容,支持相同的文件只保存一份,节约磁盘。
FastDFS
只能通过Client API访问,不支持POSIX访问方式。
FastDFS适合中大型网站使用,用来存储资源文件(如:图片、文档、视频等)
1.2 FastDFS组成
tracker server
跟踪服务器:用来调度来自客户端的请求。且在内存中记录所有存储组和存储服务器的信息状态。
存储服务器:用来存储文件(data)和文件属性(metadata)
客户端:业务请求发起方,通过专用接口基于TCP协议与tracker以及storage server进行交互
group
组,也可称为卷:同组内上的文件是完全相同的
包括两部分:组名和文件名(包含路径)
文件相关属性:键值对(Key Value Pair)方式
文件标识符: (例如: group1/M00/00/00/CgEOxVegXB2AdYafAAAB0b8tBbQ9155303 )
group1:存储组的组名;上传完成后,需要客户端自行保存
M00:服务器配置的虚拟路径,与磁盘选项store_path#对应
00/00:两级以两位16进制数字命名的目录
CgEOxVegXB2AdYafAAAB0b8tBbQ9155303:文件名,与原文件名并不相同;由storage server根据特定信息生成。文件名包含:源存储服务器的IP地址、文件创建时间戳、文件大小、随机数和文件扩展名等
1.3 FastDFS同步机制
同一组内的storage server之间是对等的,文件上传、删除等操作可以在任意一台storage server上进行;
文件同步只在同组内的storage server之间进行,采用push方式,即源服务器同步给目标服务器;
源头数据才需要同步,备份数据不需要再次同步,否则就构成环路了;
提示:上述第二条规则有个例外,就是新增加一台storage server时,由已有的一台storage server将已有的所有数据(包括源头数据和备份数据)同步给该新增服务器。
1.4 FastDFS特性
指标 | 说明 |
系统简洁性 | 很简洁,只有两个角色:tracker、storage |
系统性能 | 很高、没有使用数据库,文件同步直接点对点,不经过tracker中转 |
系统稳定性 | 高、C语言开发,可支持高并发和负载 |
RAID方式 | 分组(组内冗余),具有很高的灵活性 |
通信协议 | 专有协议,下载文件支持HTTP |
属性(meta,data) | 支持 |
相同内容文件只保存一份 | 支持 |
下载文件时支持文件偏移量 | 支持 |
2、背景
在这里,我用3台服务器集群部署,这3台服务器都要部署nginx+fastdfs以及相关模块。3台服务器部署方式都一样,只不过storage服务器有些配置会不同,部署的过程中请大家看清楚在哪里操作,过程有点麻烦,请大家一定要有耐心,一步一步走下去部署是OK的。
2.1 环境说明
172.18.18.111(tracker服务器): nginx、fastdfs(运行tracker、storage)、fastfds其它模块
172.18.18.112(storage服务器):nginx、fastdfs(运行storage)、fastfds其它模块
172.18.18.113(storage服务器):nginx、fastdfs(运行storage)、fastfds其它模块
2.2 软件包、安装路径
准备的软件包:
nginx-1.9.3.tar.gz lua-5.1.4.tar.gz libfastcommon-1.0.35.zip fastdfs-master.zip LuaJIT-2.1.0-beta2.tar.gz v0.2.19.tar.gz GraphicsMagick-1.3.25.tar.gz GraphicsMagick-1.3.25.tar |
安装的路径:
服务 | 目录 |
nginx | /usr/local/nginx/ |
fastdfs配置 | /etc/fdfs/ |
fastdfs | /usr/local/fastDFS/ |
Storage_data | /usr/local/fastDFS/storage/ |
安装包 | /usr/src |
3、部署FastDFS
3.1、安装libfastcommon(tracker和storage服务器操作)
安装fastDFS前,首先下载最新版本的libfastcommon进行安装,上传至/usr/src目录中。下载地址https://github.com/happyfish200/libfastcommon/releases
解压、配置和编译:
#cd /usr/src/ #unzip libfastcommon-1.0.35.zip #cd libfastcommon-1.0.35/ #./make.sh #./make.sh install |
提示:确认make没有错误后,执行安装,64位系统默认会复制到/usr/lib64下。
设置环境变量、创建软链接:
#export LD_LIBRARY_PATH=/usr/lib64/ #ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so |
3.2、安装fastdfs(tracker和storage服务器操作)
下载最新版本的fastDFS,上传至/usr/src/目录中。下载地址:https://github.com/happyfish200/fastdfs
解压、编译:
#cd /usr/src/ #unzip fastdfs-master.zip #cd fastdfs-master/ #./make.sh #./make.sh install |
提示:确认make没有错误后,执行安装,默认会安装到/usr/bin中,以及会在/etc/fdfs生成以.sample结尾的4个文件,如下所示:
#ll /etc/fdfs/ -rw-r--r-- 1 root root 1461 Aug 12 15:48 client.conf.sample -rw-r--r-- 1 root root 7927 Aug 12 15:48 storage.conf.sample -rw-r--r-- 1 root root 105 Aug 12 15:48 storage_ids.conf.sample -rw-r--r-- 1 root root 7389 Aug 12 15:48 tracker.conf.sample |
# ll /usr/bin/fdfs_* -rwxr-xr-x 1 root root 317432 Aug 12 15:48 /usr/bin/fdfs_appender_test -rwxr-xr-x 1 root root 317208 Aug 12 15:48 /usr/bin/fdfs_appender_test1 -rwxr-xr-x 1 root root 304064 Aug 12 15:48 /usr/bin/fdfs_append_file -rwxr-xr-x 1 root root 303800 Aug 12 15:48 /usr/bin/fdfs_crc32 -rwxr-xr-x 1 root root 304120 Aug 12 15:48 /usr/bin/fdfs_delete_file -rwxr-xr-x 1 root root 304856 Aug 12 15:48 /usr/bin/fdfs_download_file -rwxr-xr-x 1 root root 304448 Aug 12 15:48 /usr/bin/fdfs_file_info -rwxr-xr-x 1 root root 322360 Aug 12 15:48 /usr/bin/fdfs_monitor -rwxr-xr-x 1 root root 1111640 Aug 12 15:48 /usr/bin/fdfs_storaged -rwxr-xr-x 1 root root 327376 Aug 12 15:48 /usr/bin/fdfs_test -rwxr-xr-x 1 root root 326592 Aug 12 15:48 /usr/bin/fdfs_test1 -rwxr-xr-x 1 root root 453880 Aug 12 15:48 /usr/bin/fdfs_trackerd -rwxr-xr-x 1 root root 305048 Aug 12 15:48 /usr/bin/fdfs_upload_appender -rwxr-xr-x 1 root root 306072 Aug 12 15:48 /usr/bin/fdfs_upload_file |
3.3 配置tracker服务器(在tracker服务器操作)
复制tracker样例配置文件,并重命名
#cd /etc/fdfs/ #cp tracker.conf.sample tracker.conf |
修改tracker配置文件
#vim tracker.conf bind_addr=172.18.18.111 #绑定服务IP,如果不填则表示所有的 port=22122 #提供服务的端口 base_path=/usr/local/fastDFS #存储日志和数据的根目录 store_group=group1 #设当上一个参数设定为1 时 (store_lookup=1,即指定组名时),必须设置本参数为系统中存在的一个组名。如果选择其他的上传方式,这个参数就没有效了。 store_server=1 #选择哪个storage server 进行上传操作,1表示根据ip 地址进行排序选择第一个服务器(IP地址最小者) download_server=1 #选择哪个 storage server 作为下载服务器,1表示哪个为源storage server 就用哪一个 http.server_port=80 #HTTP服务端口,默认为8080,你也可以不用改,但是测试访问你要带8080端口访问 |
其它参数保留默认配置, 具体配置解释可参考官方文档说明:http://bbs.chinaunix.net/thread-1941456-1-1.html
创建bash_path指定路径
#mkdir /usr/local/fastDFS/ #mkdir -p /usr/local/fastDFS/storage/data |
3.4 配置storage服务器(tracker和storage服务器操作)
复制storage样例配置文件,并重命名:
#cd /etc/fdfs/ |
修改tstorage配置文件
#vim storage.conf group_name=group1 #指定此 storage server 所在 组 bind_addr= #绑定服务IP,可以不用填写(如果是tracker服务器,也可以配置tracker服务器自身IP地址) base_path=/usr/local/fastDFS #储日志和数据的根目录 store_path0=/usr/local/fastDFS/storage #第1个存储目录 tracker_server=172.18.18.111:22122 #tracker服务器的IP和端口,如果有多个tracker服务器可以写多行 http.server_port=80 #HTTP服务端口,默认为8888,你也可以不用改,但是测试访问你要带8080端口访问 |
其它参数保留默认配置, 具体配置解释可参考官方文档说明:http://bbs.chinaunix.net/thread-1941456-1-1.html
3. 5修改tracker服务器客户端配置文件(tracker服务器操作)
复制client样例配置文件,并重命名
#cd /etc/fdfs/ #cp client.conf.sample client.conf |
修改client.conf配置文件:
#cd /etc/fdfs/ #cp client.conf.sample client.conf #vim client.conf base_path=/usr/local/fastDFS #修改路径 tracker_server=172.18.18.111:22122 #tracker服务器IP和端口,有多个tracker服务器可以写多条配置 |
4、文件上传测试
4.1 启动tracker服务(tracker服务器操作)
#/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf 检查FastDFS Tracker Server是否启动成功: #ps -ef | grep fdfs_trackerd root 27077 25738 0 15:11 pts/2 00:00:00 grep --color=auto fdfs_trackerd root 31854 1 0 Nov20 ? 00:02:34 /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf |
4.2 启动storage服务(tracker和storage服务器操作)
到了这里,有些朋友可能会问我,为什么我启动storage服务也要在tracker服务器上操作呢?大家有没有注意,我在2.1的步骤中,就声明了tracker服务器同时运行(tracker、storage)这两个服务,所以不要觉得奇怪。
# /usr/bin/fdfs_storaged /etc/fdfs/storage.conf # ps -ef | grep fdfs_storaged root 27234 25738 0 15:15 pts/2 00:00:00 grep --color=auto fdfs_storaged root 31863 1 0 Nov20 ? 00:03:37 /usr/bin/fdfs_storaged /etc/fdfs/storage.conf |
4.3 执行文件上传(tracker服务器操作)
我先放张测试图片(test.jpg)至/home目录下:
#ll /home drwx------. 14 admin admin 4096 Apr 22 2017 admin -rw-r--r-- 1 root root 4121391 Dec 7 17:13 test.jpg |
使用fdfs_test命令来测试上传,格式如下:
#fdfs_test /etc/fdfs/client.conf upload /home/test.jpg This is FastDFS client test program v5.11 Copyright (C) 2008, Happy Fish / YuQing FastDFS may be copied only under the terms of the GNU General Public License V3, which may be found in the FastDFS source kit. Please visit the FastDFS Home Page http://www.csource.org/ for more detail. [2017-12-27 15:20:21] DEBUG - base_path=/usr/local/fastDFS, 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 tracker_query_storage_store_list_without_group: server 1. group_name=, ip_addr=172.18.18.111, port=23000 group_name=group1, ip_addr=172.18.18.111, port=23000 storage_upload_by_filename group_name=group1, remote_filename=M00/00/12/rBISb1pDSbWAeUGaAD7jL_Zyu6I957.jpg source ip address: 172.18.18.111 file timestamp=2017-12-27 15:20:21 file size=4121391 file crc32=4134714274 example file url: http://172.18.18.111/group1/M00/00/12/rBISb1pDSbWAeUGaAD7jL_Zyu6I957.jpg storage_upload_slave_by_filename group_name=group1, remote_filename=M00/00/12/rBISb1pDSbWAeUGaAD7jL_Zyu6I957_big.jpg source ip address: 172.18.18.111 file timestamp=2017-12-27 15:20:21 file size=4121391 file crc32=4134714274 example file url: http://172.18.18.111/group1/M00/00/12/rBISb1pDSbWAeUGaAD7jL_Zyu6I957_big.jpg |
如下图的结果,能返回文件ID,说明图片上传成功:
说明:刚才把test.jpg的图片上传至fastdfs了,如果要用浏览器访问测试上面给出的url地址,还需要安装nginx服务。
用fdfs_delete_file命令来测试删除(这里我不做删除的测试了,我下面还要用到这张上传的图片),如下操作:
# fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/12/rBISb1pDSbWAeUGaAD7jL_Zyu6I957.jpg |
4.1 安装LuaJIT
下载最新的LuaJIT,然后上传至/usr/src目录下:
#cd /usr/src #wget http://luajit.org/download/LuaJIT-2.1.0-beta2.tar.gz |
解压、配置:
# tar zxf LuaJIT-2.1.0-beta2.tar.gz # cd LuaJIT-2.1.0-beta2 # make # make install |
4.2 安装nginx_devel_kit(NDK)模块
下载最新的nginx_devel_kit模块,然后上传至/usr/src目录下:
#cd /usr/src # wget http://luajit.org/download/LuaJIT-2.1.0-beta2.tar.gz |
解压、配置:
# tar zxf LuaJIT-2.1.0-beta2.tar.gz # cd LuaJIT-2.1.0-beta2 # make # make install |
4.3 安装lua_nginx_module模块
下载最新的nginx_devel_module模块,然后上传至/usr/src目录:
#cd /usr/src # wget https://github.com/openresty/lua-nginx-module/archive/v0.10.2.tar.gz |
4.4 安装GraphicsMagick模块(免费的图片编辑、合成等功能的软件)
下载最新的GraphicsMagick模块,然后上传至/usr/src目录:
#cd /usr/src #wget ftp://ftp.graphicsmagick.org/pub/GraphicsMagick/1.3/GraphicsMagick-1.3.5.tar.gz |
安装ImageMagick依赖包:
# yum -y install libpng-devel libpng # yum -y install libjpeg-devel libjpeg # yum -y install libtool-ltdl libtool-ltdl-devel #yum -y install ImageMagick ImageMagick-devel |
编译、配置:
# cd GraphicsMagick-1.3.25 # ./configure #make && make install |
PS: 将会默认在一下目录中安装相应文件:
/usr/local/bin
/usr/local/include
/usr/local/lib
/usr/local/share
提示:整个第4步可根据公司的业务情况来增加这些模块,如果你们公司不需要用到这些模块,这一步可以省略......
5.1 fastdfs-nginx-module作用说明
FastDFS 通过 Tracker 服务器,将文件放在 Storage 服务器存储,但是同组存储服务器之间需要进入文件复制,有同步延迟的问题。假设 Tracker 服务器将文件上传到了 ip01,上传成功后文件 ID 已经返回给客户端。此时 FastDFS 存储集群机制会将这个文件同步到同组存储 ip02,在文件还没有复制完成的情况下,客户端如果用这个文件 ID 在 ip02 上取文件,就会出现文件无法访问的错误。而 fastdfs-nginx-module 可以重定向文件连接到源服务器取文件,避免客户端由于复制延迟导致的文件无法访问错误。(解压后的 fastdfs-nginx-module 在 nginx 安装时使用)。
5.2 下载fastdfs-nginx-module
下载最新的fastdfs-nginx-module,然后上传至/usr/src目录下:
#cd /usr/src #wget https://github.com/happyfish200/fastdfs-nginx-module/archive/master.zip #unzip master |
5.3 安装nginx依赖包
#yum -y install gcc gcc-c++ make automake autoconf libtool pcre* zlib openssl openssl-devel |
5.3 编译安装nginx(把刚才几个模块编译添加进去)
# cd /usr/src #tar -zxvf nginx-1.9.3.tar.gz # cd nginx-1.9.3 # ./configure --prefix=/usr/local/nginx --user=www --group=www \ --with-http_stub_status_module \ --with-http_realip_module \ --with-pcre \ --with-http_ssl_module \ --with-stream \ --add-module=/usr/src/fastdfs/ngx_devel_kit-0.2.19/ \ --add-module=/usr/src/fastdfs/lua-nginx-module-0.10.2/ \ --add-module=/usr/src/fastdfs/fastdfs-nginx-module-master/src #make #make install |
如果出现如下错误:
./configure: error: ngx_http_lua_module requires the Lua library.
解决:
安装lua的相关依赖:yum install readline-dev readline-devel
安装lua5.1:
下载lux5.1的包 # tar -zxvf lua-5.1.4.tar.gz # cd lua-5.1.4 # make linux test # make install |
然后在重新:
./configure
make && make install
5.4 复制fastdfs-nginx-module 源码中的配置文件到/etc/fdfs 目录,并修改
#cp /usr/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/ #vim /etc/fdfs/mod_fastdfs.conf 修改以下内容: base_path=/usr/local/fastDFS #存储数据库根目录 tracker_server=172.18.18.111:22122 #tracker服务器IP和端口 url_have_group_name = true #url中包含group名称 store_path0=/usr/local/fastDFS/storage log_filename=/usr/local/fastDFS/logs/mod_fastdfs.log #mod_fastdfs日记存放路径 group_count = 1 在文件末尾添加: [group1] group_name=group1 storage_server_port=23000 store_path_count=1 store_path0=/usr/local/fastDFS/storage |
#手动创建mod_fastdfs.log日志文件 #touch /usr/local/fastDFS/log/mod_fastdfs.lo |
5.5 复制 fastdfs-mast的部分配置文件到/etc/fdfs 目录
#cd /usr/src/fastdfs-master/conf #cp http.conf mime.types /etc/fdfs/ |
5.6 nginx配置、启动
创建www用户
#groupadd www #useradd -g www www |
修改fastDFS目录属组权限:
#chown -R www:www /usr/local/fastDFS/ |
修改nginx.conf文件:
#vim /usr/local/nginx/conf/nginx.conf user www; worker_processes auto; server { listen 80; server_name localhost; location / { root html; index index.php index.html index.htm;
location /group1/M00 { ngx_fastdfs_module; alias /usr/local/fastDFS/storage/data; set $image_root "/usr/local/fastDFS/storage/data";
if ($uri ~ "/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/(.*)") { set $image_dir "$image_root/$3/$4/"; set $image_name "$5"; set $file "$image_dir$image_name"; } if ($image_name ~ "([a-zA-Z0-9_\-]+)_([0-9]+x[0-9]+|water)?(q[0-9]{1,2})?.([a-zA-Z0-9]+)") { set $a "$1"; set $b "$2"; set $c "$3"; set $d "$4"; set $e "$5"; set $f "$6"; set $file "$file"; }
} } |
说明:
A、/etc/fdfs/storage.conf 中的配置 http.server_port=8888 ,默认端口是8888,我改成 80,如果大家没有修改这个默认端口,那么nginx配置监听的端口也要改成8888。
B、Storage 对应有多个 group 的情况下,访问路径带 group 名,如/group1/M00/00/00/xxx, 对应的 Nginx 配置为:
location ~/group([0-9])/M00 {
ngx_fastdfs_module;
}
启动nginx服务:
#/usr/local/nginx/sbin/nginx -t ngx_http_fastdfs_set pid=6715 nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful #/usr/local/nginx/sbin/nginx |
6、用http的方式测试刚才上传的图片
http://172.18.18.111/group1/M00/00/12/rBISb1pDSbWAeUGaAD7jL_Zyu6I957_big.jpg
测试如下图所示:
到这里有点难为情了,上面这张是笔者自己的照片,在电脑上随手拿了一张图片就上传了,唯一一张图片,当然,读者朋友们觉得很帅的话也可以收藏起来,哈哈!!
然后,我们来测试一下图片能不能裁剪(前提条件是你要配置了4.4的操作步骤),修改下面红色的字体为裁剪的大小,然后在浏览器中访问:
http://172.18.18.111/group1/M00/00/12/rBISb1pDSbWAeUGaAD7jL_Zyu6I957_400x400.jpg
通过上图可以看到,我这里可以把上传的图片进行裁剪,图片确实裁剪小了,是OK的。
7、fastDFS一些简单操作命令
#重启storage服务: # /usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart #重启tracker服务: # /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart #关闭storage服务: # killall fdfs_storaged #关闭tracker服务: # killall fdfs_trackered #查看集群状态: #/usr/bin/fdfs_monitor /etc/fdfs/storage.conf #上传操作: #fdfs_test /etc/fdfs/client.conf upload 文件具体url #删除操作: #fdfs_delete_file /etc/fdfs/client.conf 上传后的路径 比如: #fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/ZciEZlepkl6Abj28AAAPOSSdASU225_big.gif) |
8、Java API 客户端配置
注意修改tracker服务器Ip地址:
connect_timeout = 2 network_timeout = 30 charset = ISO8859-1 http.tracker_http_port = 80 http.anti_steal_token = no tracker_server=172.18.18.111:22122 default_group_name=group1 |
当然,还有php及其它客户端连接到fastdfs,我就不挨个介绍了,感兴趣的朋友可以自行百度或留言讨论,最后要感谢张秋方大师笔者才能才能顺利完成此篇文稿。
参考文章:
https://blog.51cto.com/xinzong/1834466
https://github.com/qieangel2013/nginxLuaGmFastdfs
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。