前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >fastdfs简单实现

fastdfs简单实现

作者头像
dogfei
发布2020-07-31 11:12:17
3950
发布2020-07-31 11:12:17
举报
文章被收录于专栏:devops探索devops探索
代码语言:javascript
复制
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" />









组成部分
代码语言:javascript
复制
    跟踪服务(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>
代码语言:javascript
复制
3、特点
代码语言:javascript
复制
      指标
    
  </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>
代码语言:javascript
复制
搭建fastdfs服务






环境说明,这里拿两台机器说明
代码语言:javascript
复制
    tracker服务器:nginx  fastdfs  tracker  storage   fastdfs相关模块
  
</li>

<li>
  
    storage服务器:nginx  fastdfs  storage  fastdfs其他模块
  
</li>

首先我们现在一台机器上完成client、tracker、storage三部分的安装

准备好安装包和安装过程所需的依赖包

代码语言:javascript
复制
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

安装libfastcommon

1)解压并安装

代码语言:javascript
复制
tar -zxvf libfastcommon-1.0.35.tar.gz && cd libfastcommon-1.0.35
./make.sh && ./make.sh install

安装tracker

1)解压并安装

代码语言:javascript
复制
tar -zxvf fastdfs-5.10.tar.gz && cd fastdfs-5.10.tar.gz
./make.sh && ./make.sh install

2)将源码包目录下的conf子目录下的所有文件copy到/etc/fdfs下

代码语言:javascript
复制
cp /fastdfs-5.10/conf/* /etc/fdfs/

3)修改tracker.conf文件

代码语言:javascript
复制
vim /etc/fdfs/tracker.conf
#修改
base_path=/data/pdfs

4)启动tracker服务

代码语言:javascript
复制
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf

安装storage服务

注意:如果是多台服务器的话,我们需要执行上面tracker服务安装的第1)和第2)步

1)修改storage.conf文件

代码语言:javascript
复制
vim /etc/fdfs/storage.conf
#修改
store_path0=/data/storage
store_path0=/data/storage
tracker_server=10.0.3.99:22122

2)启动storage服务

代码语言:javascript
复制
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf

修改client端配置文件

代码语言:javascript
复制
```

vim /etc/fdfs/client.conf #修改 base_path=/data/client tracker_server=10.0.3.99:22122=

代码语言:javascript
复制
# 测试

/usr/bin/fdfs_test /etc/fdfs/client.conf upload 1.t

代码语言:javascript
复制
  <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

代码语言:javascript
复制
 注意:在编译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

代码语言:javascript
复制
  上面红色标注的地方就是指定fastdfs相关的模块所在位置。






  安装完成后,修改nginx的配置文件

cat fdfs.conf

server {         listen       80;         server_name  10.0.3.99;

        location /group1/M00/{                 #root /data/fastdfs/storage/data;                 ngx_fastdfs_module;         } }

代码语言:javascript
复制

  访问测试:<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

代码语言:javascript
复制
# 问题记录


  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’

解决办法:

代码语言:javascript
复制
cd /root/fastdfs-nginx-module-1.20/src
vim common.c
代码语言:javascript
复制
#修改一下内容,将判断条件删掉即可


<img class="alignnone size-full wp-image-555 " src="https://www.devilf.cc/wp-content/uploads/2018/10/img_5bbf3
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-10-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装libfastcommon
  • 安装tracker
  • 安装storage服务
  • 修改client端配置文件
  • cat fdfs.conf
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档