1、什么是fastdfs
fastdfs是用c语言编写的一款开源的分布式文件存储系统,具有冗余备份、负载均衡、线性扩容等机制,且注重高可用、高性能。我们可以为此搭建一套文件服务器集群,该集群具有文件上传、下载等基本功能,还包括文件存储、文件同步、文件访问、存取负载均衡、在线扩容、相同内容只存储一份等功能,适合于有大容量存储需求的应用或系统。
2、架构介绍
<img class="alignnone size-full wp-image-556 " src="https://www.devilf.cc/wp-content/uploads/2018/10/img_5bc05608c3197.png" alt="" srcset="https://www.devilf.cc/wp-content/uploads/2018/10/img_5bc05608c3197.png 547w, https://www.devilf.cc/wp-content/uploads/2018/10/img_5bc05608c3197-150x134.png 150w, https://www.devilf.cc/wp-content/uploads/2018/10/img_5bc05608c3197-300x268.png 300w" sizes="(max-width: 547px) 100vw, 547px" />
组成部分
跟踪服务(tracker)
<ul>
<li>
跟踪服务控制、调度文件、以及负载均衡的方式访问
</li>
<li>
在内存中记录所有存储组和存储服务器的信息状态
</li>
</ul>
</li>
<li>
存储服务(storage)
<ul>
<li>
文件存储、文件同步、提供文件访问接口,同时以key value方式管理文件的元数据
</li>
<li>
存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的
</li>
<li>
所有卷的文件容量累加就是整个存储系统的总文件容量
</li>
<li>
一个卷可以由一台或多台存储服务器组成,且一个卷下的文件都是相同
</li>
<li>
同一卷内之间的storage服务器之间是对等的,文件上传、删除等操作可以在任意一台storage server上进行
</li>
<li>
当存储空间不足,可以动态添加卷
</li>
</ul>
</li>
<li>
客户端(client)
<ul>
<li>
业务请求发起方,通过专用接口基于TCP协议与tracker和storage进行交互
</li>
</ul>
</li>
3、特点
指标
</td>
<td>
说明
</td>
</tr>
<tr>
<td>
系统简洁性
</td>
<td>
很简洁,只有两个角色:tracker、storage
</td>
</tr>
<tr>
<td>
系统性能
</td>
<td>
很高、没有使用数据库,文件同步直接点对点,不经过tracker中转
</td>
</tr>
<tr>
<td>
系统稳定性
</td>
<td>
高、C语言开发,可支持高并发和负载
</td>
</tr>
<tr>
<td>
RAID方式
</td>
<td>
分组(组内冗余),具有很高的灵活性
</td>
</tr>
<tr>
<td>
通信协议
</td>
<td>
专有协议,下载文件支持HTTP
</td>
</tr>
<tr>
<td>
属性(meta,data)
</td>
<td>
支持
</td>
</tr>
<tr>
<td>
相同内容文件只保存一份
</td>
<td>
支持
</td>
</tr>
<tr>
<td>
下载文件时支持文件偏移量
</td>
<td>
支持
</td>
</tr>
搭建fastdfs服务
环境说明,这里拿两台机器说明
tracker服务器:nginx fastdfs tracker storage fastdfs相关模块
</li>
<li>
storage服务器:nginx fastdfs storage fastdfs其他模块
</li>
首先我们现在一台机器上完成client、tracker、storage三部分的安装
准备好安装包和安装过程所需的依赖包
wget https://github.com/happyfish100/libfastcommon/archive/V1.0.35.tar.gz-O libfastcommon-1.0.35.tar.gz
wget https://github.com/happyfish100/fastdfs/archive/V5.10.tar.gz-O fastdfs-5.10.tar.gz
wget https://github.com/happyfish100/fastdfs-nginx-module/archive/V1.20.zip
wget http://nginx.org/download/nginx-1.12.0.tar.gz
yum -y install libevent
yum install -y gcc gcc-c++ autoconf automakelibtool make cmake zlib zlib-devel opensslopenssl-devel pcre-devel libxslt-devel gd-develperl-devel perl-ExtUtils-Embed GeoIP GeoIP-devel curl
1)解压并安装
tar -zxvf libfastcommon-1.0.35.tar.gz && cd libfastcommon-1.0.35
./make.sh && ./make.sh install
1)解压并安装
tar -zxvf fastdfs-5.10.tar.gz && cd fastdfs-5.10.tar.gz
./make.sh && ./make.sh install
2)将源码包目录下的conf子目录下的所有文件copy到/etc/fdfs下
cp /fastdfs-5.10/conf/* /etc/fdfs/
3)修改tracker.conf文件
vim /etc/fdfs/tracker.conf
#修改
base_path=/data/pdfs
4)启动tracker服务
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
注意:如果是多台服务器的话,我们需要执行上面tracker服务安装的第1)和第2)步
1)修改storage.conf文件
vim /etc/fdfs/storage.conf
#修改
store_path0=/data/storage
store_path0=/data/storage
tracker_server=10.0.3.99:22122
2)启动storage服务
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf
```
vim /etc/fdfs/client.conf #修改 base_path=/data/client tracker_server=10.0.3.99:22122=
# 测试
/usr/bin/fdfs_test /etc/fdfs/client.conf upload 1.t
<img class="alignnone size-full wp-image-554 " src="https://www.devilf.cc/wp-content/uploads/2018/10/img_5bbf3df61b865.png" alt="" srcset="https://www.devilf.cc/wp-content/uploads/2018/10/img_5bbf3df61b865.png 2952w, https://www.devilf.cc/wp-content/uploads/2018/10/img_5bbf3df61b865-150x51.png 150w, https://www.devilf.cc/wp-content/uploads/2018/10/img_5bbf3df61b865-300x101.png 300w, https://www.devilf.cc/wp-content/uploads/2018/10/img_5bbf3df61b865-768x260.png 768w, https://www.devilf.cc/wp-content/uploads/2018/10/img_5bbf3df61b865-1024x346.png 1024w" sizes="(max-width: 2952px) 100vw, 2952px" />
以上最简单的一个fastdfs安装完成,下面来安装nginx
解压我们刚才下载的fastdfs模块
unzip V1.20.zip
注意:在编译nginx时,需要在最后一行指定fastdfs所需的模块,例如:
./configure –prefix=/usr/local/nginx –sbin-path=/usr/local/nginx/sbin/nginx –modules-path=/usr/local/nginx/modules –conf-path=/usr/local/nginx/conf/nginx.conf –error-log-path=/var/log/nginx/error.log –http-log-path=/var/log/nginx/access.log –http-client-body-temp-path=/usr/local/nginx/tmp/client_body –http-proxy-temp-path=/usr/local/nginx/tmp/proxy –http-fastcgi-temp-path=/usr/local/nginx/tmp/fastcgi –http-uwsgi-temp-path=/usr/local/nginx/tmp/uwsgi –http-scgi-temp-path=/usr/local/nginx/tmp/scgi –pid-path=/usr/local/nginx/run/nginx.pid –lock-path=/usr/local/nginx/run/lock/nginx –user=$nginx_user –group=$nginx_user –with-file-aio –with-http_ssl_module –with-http_v2_module –with-http_realip_module –with-http_addition_module –with-http_xslt_module=dynamic –with-http_image_filter_module=dynamic –with-http_geoip_module=dynamic –with-http_sub_module –with-http_dav_module –with-http_flv_module –with-http_mp4_module –with-http_gunzip_module –with-http_gzip_static_module –with-http_random_index_module –with-http_secure_link_module –with-http_degradation_module –with-http_slice_module –with-http_stub_status_module –with-http_perl_module=dynamic –with-mail=dynamic –with-mail_ssl_module –with-pcre –with-pcre-jit –with-stream=dynamic –with-stream_ssl_module –with-debug –with-cc-opt=’-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector –param=ssp-buffer-size=4 -m64 -mtune=generic’ –with-ld-opt=’ -Wl,-E’ –add-module=/root/fastdfs-nginx-module-1.20/src
上面红色标注的地方就是指定fastdfs相关的模块所在位置。
安装完成后,修改nginx的配置文件
server { listen 80; server_name 10.0.3.99;
location /group1/M00/{ #root /data/fastdfs/storage/data; ngx_fastdfs_module; } }
访问测试:<a href="http://10.0.3.99/group1/M00/00/00/CgADY1u_N3-AbrqvAASKq2340LU462_big.png">http://10.0.3.99/group1/M00/00/00/CgADY1u_N3-AbrqvAASKq2340LU462_big.png</a>
<img class="alignnone size-full wp-image-553 " src="https://www.devilf.cc/wp-content/uploads/2018/10/img_5bbf3df4c0017.png" alt="" srcset="https://www.devilf.cc/wp-content/uploads/2018/10/img_5bbf3df4c0017.png 2286w, https://www.devilf.cc/wp-content/uploads/2018/10/img_5bbf3df4c0017-150x46.png 150w, https://www.devilf.cc/wp-content/uploads/2018/10/img_5bbf3df4c0017-300x92.png 300w, https://www.devilf.cc/wp-content/uploads/2018/10/img_5bbf3df4c0017-768x235.png 768w, https://www.devilf.cc/wp-content/uploads/2018/10/img_5bbf3df4c0017-1024x314.png 1024w" sizes="(max-width: 2286px) 100vw, 2286px" />
至此fastdfs搭建完成,后面会对storage服务器做横向添加。
# 命令介绍
#重启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
# 问题记录
nginx添加fastdfs时,编译报错:fatal error: common_define.h
解决办法:
cd /root/fastdfs-nginx-module-1.20/src
```
vim config
#修改下面两项内容
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
然后又报错:error: ‘FDFSHTTPParams’ has no member named ‘support_multi_range’
解决办法:
cd /root/fastdfs-nginx-module-1.20/src
vim common.c
#修改一下内容,将判断条件删掉即可
<img class="alignnone size-full wp-image-555 " src="https://www.devilf.cc/wp-content/uploads/2018/10/img_5bbf3