一、FastDFS简介
FastDFS(最新版本v3.04)是一个开源的轻量级分布式文件系统,它用纯C语言实现,支持Linux、FreeBSD、AIX等UNIX系统。它只能通过专有API对文件进行存取访问,不支持POSIX接口方式,不能mount使用,不是系统级的分布式文件系统,而是应用级的分布式文件存储服务。
二、FastDFS用途
1)FastDFS主要解决了大容量的文件存储和高并发访问的问题,文件存取时实现了负载均衡。
2)FastDFS实现了软件方式的RAID,可以使用廉价的IDE硬盘进行存储 ,支持存储服务器在线扩容。
3)FastDFS特别适合大中型网站使用,用来存储资源文件(如:图片、文档、音频、视频等等。
三、FastDFS原理
存储节点采用了分组(group)的方式。存储系统由一个或多个group组成,group与group之间的文件是相互独立的,所有group的文件容量累加就是整个存储系统中的文件容量。一个group可以由一台或多台存储服务器组成,一个group下的存储服务器中的文件都是相同的,group中的多台存储服务器起到了冗余备份和负载均衡的作用(一个组的存储容量为该组内存储服务器容量最小的那个,不同组的Storage server之间不会相互通信,同组内的Storage server之间会相互连接进行文件同步)。
在group中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。
当存储空间不足或即将耗尽时,可以动态添加group。只需要增加一台或多台服务器,并将它们配置为一个新的group,这样就扩大了存储系统的容量。
FastDFS只有两个角色:Tracker server和Storage server。Tracker server作为中心结点,其主要作用是负载均衡和调度。Tracker server在内存中记录分组和Storage server的状态等信息,不记录文件索引信息,占用的内存量很少。另外,客户端(应用)和Storage server访问Tracker server时,Tracker server扫描内存中的分组和Storage server信息,然后给出应答。由此可以看出Tracker server非常轻量化,不会成为系统瓶颈。
FastDFS中的Storage server在其他文件系统中通常称作Trunk server或Data server。Storage server直接利用OS的文件系统存储文件。FastDFS不会对文件进行分块存储,客户端上传的文件和Storage server上的文件一一对应(FastDFS中的文件标识分为两个部分:组名和文件名,二者缺一不可)。
四、Nginx环境调用FastDFS要求
1)编译安装 nginx时附带 fastdfs-nginx-module 模块 –add-module=/root/fastdfs-nginx-module/src
2)修改 nginx 配置文件增加 ngx_fastdfs_module;
3)编译fastdfs_client.so php扩展模块
4)修改 php.ini 让 php-fpm 支持fastdfs_client 扩展模块 extension = fastdfs_client.so
注意:如果要使fastdfs支持web和开机自动脚本(默认是不支持的),需要修改make.sh文件

#WITH_HTTPD=1

#WITH_LINUX_SERVICE=1
(因为是给nginx添加fastdfs模块,所以不需要fastdfs支持 http 所以就不需要去掉 #WITH_HTTPD=1 前的注释了)。
五、所遇问题

  1. FastDFS适用的场景以及不适用的场景?
    FastDFS是为互联网应用量身定做的一套分布式文件存储系统,非常适合用来存储用户图片、视频、文档等文件。对于互联网应用,和其他分布式文件系统相比,优势非常明显。FastDFS没有对文件做分块存储,因此不太适合分布式计算场景。
  2. FastDFS需要的编译和运行环境是怎样的?
    FastDFS Server仅支持unix系统,在Linux和FreeBSD测试通过。在Solaris系统下网络通信方面有些问题。编译需要的其他库文件有pthread和libevent。pthread使用系统自带的即可。对libevent的版本要求为1.4.x,建议使用最新的stable版本,如1.4.14b。注意,千万不要使用libevent 2.0 stable以前的版本。
  3. 启动storage server时,一直处于僵死状态。
    启动storage server,storage将连接tracker server,如果连不上,将一直重试。直到连接成功,启动才算真正完成。
    出现这样情况,请检查连接不上tracker server的原因。
    友情提示:从V2.03以后,多tracker server在启动时会做时间上的检测,判断是否需要从别的tracker server同步4个系统文件。
    触发时机是第一个storage server连接上tracker server后,并发起join请求。
    如果集群中有2台tracker server,而其中一台tracker没有启动,可能会导致storage server一直处于僵死状态。
  4. 执行fdfs_test或fdfs_test1上传文件时,服务器返回错误号2
    错误号2表示没有ACTIVE状态的storage server。可以执行fdfs_monitor查看服务器状态。
  5. 如何删除无效的storage server?
    可以使用fdfs_monitor来删除。命令行如下:
    /usr/local/bin/fdfs_monitor delete
    例如:
    /usr/local/bin/fdfs_monitor /etc/fdfs/client.conf delete group1 192.168.0.100
    注意:如果被删除的storage server的状态是ACTIVE,也就是该storage server还在线上服务的情况下,是无法删除掉的。
  6. nginx和apache扩展模块与FastDFS server版本对应关系
    扩展模块1.05: 针对FastDFs server v2.x,要求server版本大于等于v2.09
    扩展模块1.07及以上版本: 针对FastDFs server v3.x
  7. 上传文件失败,返回错误码28,这是怎么回事?
    返回错误码28,表示磁盘空间不足。注意FastDFS中有预留空间的概念,在tracker.conf中设置,配置项为:reserved_storage_space,缺省值为4GB,即预留4GB的空间。请酌情设置reserved_storage_space这个参数,比如可以设置为磁盘总空间的20%左右。
  8. nginx扩展模块,不能正常显示图片的问题
    在配置文件/etc/fdfs/mod_fastdfs.conf中,缺省的设置是这样的:http.need_find_content_type=false这个参数在nginx中需要设置为true,apache中应该设置为false
    FastDFS 注意事项
    1、nginx集成FastDFS模块时,配置文件问题
    检测到nginx日志: /home/soft/fastdfs-nginx-module/src/common.c, line: 155, load conf file “/etc/fdfs/mod_fastdfs.conf” fail, ret code: 2
    默认没有吧/mod_fastdfs.conf拷贝到/etc/fdfs 上,并设置对应的端口(默认是22122)


1
cp/home/soft/fastdfs-nginx-module/src/mod_fastdfs.conf/etc/fdfs/

2、除了在storage.conf里的tracker_server增加tracker的ip和端口,需要注意什么
tracker server ip和端口,单个配置方式 tracker_server=10.10.1.1:2222
fastdfs支持tracker server,每行设置一个tracker_server


1
2
3
tracker_server=10.130.1.1:2222
tracker_server=10.130.1.2:2222
tracker_server=10.130.1.3:2222

3、程序要访问文件,FastDFS提供了java api
客户端通过HTTP下载文件时,可以走web server,如apache、nginx等

4、想要把fastDFS产生的记录清空,再重新搭建一次,应该删除哪些文件
停止storage server和tracker server,删除base_path下的data子目录即可。
注意:storage 的data目录下保存了上传文件,删除时请慎重。

5、添加文件到fastDFS的data,会被同步到通一个group的其他storage吗
不会的,直接粘贴到fastdfs的文件不会被同步到同个组的其他storage。
fastdfs的同步方式是通过data/sync目录下的binlog.000的文件进行的。想要被复制必须保证binlog.000包含添加的文件时间戳+路径
对应的同一个group的storage会在 data/sync中存在对应的同步标记文件如

6、每一个group是否存储了所有的上传文件;还是说group A存储一部分,group B存储一部分,同一个group中的storage server存储的文件都相同。
A: 答案为后者。即:group A存储一部分,group B存储一部分,同一个group中的storage server存储的文件都相同。

7、FastDFS系统中的文件ID与用户存储进去的逻辑文件是不同的,由于没有索引服务器,那么这种文件名映射关系不是要需要由用户自己来保存?
的确如此,目前的确需要由应用端来保存。
FastDFS系统中的文件ID与用户存储进去的逻辑文件是不同的,我有一个客户端,想通过文件名进行操作,不知该怎样实现?也就是说,文件名到ID的转换,我自己写的客户端该怎么转换呢?
像你这样的应用场合,再加一层好了,实现文件名到文件ID的转换。比如可以基于数据库来做,或者通过分布式kv系统,如TT、FastDHT等等来做。

8、这些Track Server的内容是对等的,还是分组,每个Track Server负责一部分Storage Server?
对等的。

9、Client是绑定一个Track Server,还是可以绑定多个或全部?
在一个集群中,应该绑定全部。

10、Storage Server也是同样的问题,是绑定一个Track Server,还是可以多个或者全部?
在一个集群中,应该绑定全部。

11、如果没有绑定全部Tracker Sever,那么Tracker Sever之间可能会出现不一致的情况,这种问题如何解决呢?
应该绑定所有Tracker server啊。
万一有个别storage server没有绑定所有tracker server,也不会出现问题。
正确的做法是绑定所有tracker server。

  1. FastDFS需要的编译和运行环境是怎样的?
    FastDFS Server仅支持unix系统,在Linux和FreeBSD测试通过。在Solaris系统下网络通信方面有些问题。
    编译需要的其他库文件有pthread和libevent。
    pthread使用系统自带的即可。
    对libevent的版本要求为1.4.x,建议使用最新的stable版本,如1.4.14b。
    注意,千万不要使用libevent 2.0及以上版本。

  2. 启动storage server时,一直处于僵死状态。
    A:启动storage server,storage将连接tracker server,如果连不上,将一直重试。直到连接成功,启动才算真正完成。
    出现这样情况,请检查连接不上tracker server的原因。

  3. 执行fdfs_test或fdfs_test1上传文件时,服务器返回错误号2
    错误号表示没有ACTIVE状态的storage server。可以执行fdfs_monitor查看服务器状态。

  4. 如何让server进程退出运行?
    直接kill即可让server进程正常退出,可以使用killall命令,例如:


1
2
killallfdfs_trackerd
killallfdfs_storaged

也可以使用FastDFS自带的stop.sh脚本,如:
1
/usr/local/bin/stop.sh /usr/local/bin/fdfs_storaged /etc/fdfs/storage.conf

stop.sh只会停止命令行(包括参数)完全相同的进程。
千万不要使用-9参数强杀,否则可能会导致binlog数据丢失的问题。

  1. 如何重启server进程?
    可以kill掉server进程后,执行启动命令行。如:


1
2
killallfdfs_trackerd
/usr/local/bin/fdfs_trackerd/etc/fdfs/tracker.conf

或者直接使用FastDFS自带的restart.sh脚本,如:


1
/usr/local/bin/restart.sh/usr/local/bin/fdfs_trackerd/etc/fdfs/tracker.conf

  1. 跨运营商通信异常问题
    比如电信和网通机房相互通信,可能会存在异常,有两种表现:
    1)不能建立连接,这个比较直接,肯定是网络连接的问题
    2)可以正常建立连接,但接收和发送数据失败,这个问题比较隐蔽,正常网络环境下,不应该出现此类问题。
    还有人碰到过从一个方向建立连接可以正常通信,但从另外一个方向就不能正常通信的情况。
    解决办法:
    尝试将服务端口改小,建议将端口修改为1024以下。比如将storage服务端口由23000修改为873等,也可以试试修改为8080
    如果问题还不能解决,请联系你的网络(机房)服务商。

  2. fdfs_test和fdfs_test1是做什么用的?
    这两个是FastDFS自带的测试程序,会对一个文件上传两次,分别作为主文件和从文件。返回的文件ID也是两个。
    并且会上传文件附加属性,storage server上会生成4个文件。
    这两个程序仅用于测试目的,请不要用作实际用途。
    V2.05提供了比较正式的三个小工具:
    上传文件:/usr/local/bin/fdfs_upload_file
    下载文件:/usr/local/bin/fdfs_download_file [local_filename]
    删除文件:/usr/local/bin/fdfs_delete_file

文档更新时间: 2019-06-20 06:10   作者:月影鹏鹏