喻轩Blog - FastDFS
type: channel
link: https://blog.yuxuan.io/tags/fastdfs
items: FastDFS应用实战
items: FastDFS集群和配置优化
items: FastDFS系统架构和功能原理
items: FastDFS基础

FastDFS应用实战
type: item
date: 2020-09-09T22:21:01+08:00
description: SpringBoot访问FastDFS引入jar依赖 org.springframework.boot spring-boot-starter-parent 2.0.5.RELEASE org.springframework.boot spring-boot-starter-web com.github.tobato fastdfs-client 1.26.1-RELEASE 配置文件application.ymlfdfs: connectTimeout: 600 trackerList: - 192.168.211.130:22122 - 192.168.211.135:22122 - 192.168.211.136:22122 server: port: 8899编写上传下载文件的服务类package com.fastdfs.service; import com.github.tobato.fastdfs.domain.StorePath; import com.github.tobato.fastdfs.proto.storage.DownloadByteArray; import com.github.tobato.fastdfs.service.FastFileStorageClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.io.ByteArrayInputStream; import java.io.IOException; @Component public class FastDFSClientService { @Autowired private FastFileStorageClient fastFileStorageClient; /* * 文件上传 * * @param bytes 文件字节 * @param fileSize 文件大小 * @param extension 文件扩展名 * @return fastDfs路径 */ public String uploadFile(byte[] bytes, long fileSize, String extension) { ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes); StorePath storePath = fastFileStorageClient.uploadFile(byteArrayInputStream, fileSize, extension, null); System.out.println(storePath.getGroup() + ":" + storePath.getPath() + ":" + storePath.getFullPath()); return storePath.getFullPath(); } /* * 下载文件 * * @param fileUrl 文件URL * @return 文件字节 * @throws IOException */ public byte[] downloadFile(String fileUrl) throws IOException { String group = fileUrl.substring(0, fileUrl.indexOf("/")); String path = fileUrl.substring(fileUrl.indexOf("/") + 1); DownloadByteArray downloadByteArray = new DownloadByteArray(); byte[] bytes = fastFileStorageClient.downloadFile(group, path, downloadByteArray); return bytes; } }控制器类package com.fastdfs.controller; import com.fastdfs.service.FastDFSClientService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework…

FastDFS集群和配置优化
type: item
date: 2020-09-09T22:09:27+08:00
description: FastDFS集群架构设置3台CentOS 7 虚拟机3个tracker 3个storage192.168.211.130192.168.211.136192.168.211.135trackertrackertrackerstorage（group1）storage（group1）storage（group2）nginxnginxnginx按照之前的单机方式先进行安装FastDFS集群架构详细配置配置tracker集群 三台相同vi /etc/fdfs/tracker.conf# 0是轮询，1是指定组，2是剩余存储空间多的group优先 store_lookup=0 配置storage集群并启动vi /etc/fdfs/storage.conftracker_server=192.168.211.130:22122 tracker_server=192.168.211.136:22122 tracker_server=192.168.211.135:22122 #注意组名 192.168.211.135 配置是 group2 group_name=group1 #storage 的端口号，同一个组的 storage 端口号必须相同 port=23000 /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart /usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart查看storage的日志和查看tracker集群信息cat /home/fastdfs/logs/storaged.log访问FastDFS时 可以把Tracker 理解成对等的,但实际底层多个Tracker时在运行过程中会选择其中一个作为Leader，由该Leader执行一些唯一性的操作。在早期版本中Tracker-Leader有两个作用，分别是：为新加入的Storage分配一个源Storage；为开启合并存储的Group选择Trunk-Server。但是在最新的版本中实际上只有第二个作用，也就是选择Trunk-Server。查看之后，如果连接不上，注意关闭防火墙（或开放通信端口）systemctl stop firewalld查看存储集群信息/usr/bin/fdfs_monitor /etc/fdfs/storage.conf测试上传vim /etc/fdfs/client.conftracker_server=192.168.211.130:22122 tracker_server=192.168.211.136:22122 tracker_server=192.168.211.135:22122/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /root/fastdfs/1.png find / -name group*/*/*/*/xxx.png使用Nginx和FastDFS集群结合vi /etc/fdfs/mod_fastdfs.conftracker_server=192.168.211.130:22122 tracker_server=192.168.211.136:22122 tracker_server=192.168.211.135:22122 #注意组名 如果是group2 则一定要改 group_name=group1 vim /usr/local/nginx/conf/nginx.conf#添加如下配置 server { listen 8888; server_name localhost; location ~/group[0-9]/ { ngx_fastdfs_module; } }启动nginx/usr/local/nginx/sbin/nginx测试文件服务器通过任意一台nginx访问http://192.168.211.130/group1/M00/00/00/xxx.pnghttp://192.168.211.135/group1/M00/00/00/xxx.pngFastDFS配置优化最大连接数设置配置文件：tracker.conf 和 storage.conf参数名：max_connections缺省值：256说明：FastDFS为一个连接分配一个task buffer，为了提升分配效率，FastDFS采用内存池的做法。FastDFS老版本直接事先分配 max_connections 个buffer，这个做法显然不是太合理，在 max_connections 设置过大的情况下太浪费内存。v5.04对预分配采用增量方式，tracker一次预分配1024个，storage一次预分…

FastDFS系统架构和功能原理
type: item
date: 2020-09-09T21:48:41+08:00
description: 架构详解storage server：存储服务器（又称存储节点或数据服务器），文件和文件属性（meta data）都保存到存储服务器上。Storage server直接利用OS的文件系统调用管理文件。Storage server（后简称storage）以组（卷，group或volume）为单位组织，一个group内包含多台storage机器，数据互为备份，存储空间以group内容量最小的storage为准，所以建议group内的多个storage尽量配置相同，以免造成存储空间的浪费。以group为单位组织存储能方便的进行应用隔离、负载均衡、副本数定制（group内storage server数量即为该group的副本数），比如将不同应用数据存到不同的group就能隔离应用数据，同时还可根据应用的访问特性来将应用分配到不同的group来做负载均衡；缺点是group的容量受单机存储容量的限制，同时当group内有机器坏掉时，数据恢复只能依赖group内的其它机器，使得恢复时间会很长。group内每个storage的存储依赖于本地文件系统，storage可配置多个数据存储目录，比如有10块磁盘，分别挂载在/data/disk1-/data/disk10 ，则可将这10个目录都配置为storage的数据存储目录。storage接受到写文件请求时，会根据配置好的规则，选择其中一个存储目录来存储文件。为了避免单个目录下的文件数太多，在storage第一次启动时，会在每个数据存储目录里创建2级子目录，默认每级256个，总共65536个文件，新写的文件会以hash的方式被路由到其中某个子目录下，然后将文件数据直接作为一个本地文件存储到该目录中。group：组，也可称为卷。同组内服务器上的文件是完全相同的，同一组内的storage server之间是对等的，文件上传、删除等操作可以在任意一台storage server上进行。meta data：文件相关属性，键值对（ Key Value Pair）方式，如：width: 1118。tracker server：跟踪服务器，主要做调度工作，起负载均衡的作用。在内存中记录集群中所有存储组和存储服务器的状态信息，是客户端和数据服务器交互的枢纽。因为不记录文件索引信息，所以占用的内存量很少。Tracker是FastDFS的协调者，负责管理所有的storage server和group，每个storage在启动后会连接Tracker，告知自己所属的group等信息，并保持周期性的心跳，tracker根据storage的心跳信息，建立group==>[storage server list]的映射表。Tracker需要管理的元信息很少，会全部存储在内存中；另外tracker上的元信息都是由storage汇报的信息生成的，本身不需要持久化任何数据，这样使得tracker非常容易扩展，直接增加tracker机器即可扩展为tracker cluster来服务，cluster里每个tracker之间是完全对等的，所有的tracker都接受stroage的心跳信息，生成元数据信息来提供读写服务。client：客户端，作为业务请求的发起方，通过专有接口，使用TCP/IP协议与跟踪器服务器或存储节点进行数据交互。FastDFS向使用者提供基本文件访问接口，比如upload、download、append、delete等，以客户端库的方式提供给用户使用。设计理念轻量级FastDFS服务端只有两个角色：Tracker server和Storage server。Tracker server在内存中记录分组和Storage server的状态等信息，不记录文件索引信息，占用的内存量很少。另外，客户端（应用）和Storage server访问Tracker server时，Tracker server扫描内存中的分组和Storage server状态信息，然后给出应答。由此可以看出Tracker server非常轻量化，不会成为系统瓶颈。FastDFS中的Storage server直接利用OS的文件系统存储文件。FastDFS不会对文件进行分块存储，客户端上传的文件和Storage server上的文件一一对应。对于互联网应用，文件分块存储没有多大的必要。它既没有带来多大的好处，又增加了系统的复杂性。FastDFS不对文件进行分块存储，与支持文件分块存储的DFS相比，更加简洁高效，并且完全能满足绝大多数互联网应用的实际需要。在FastDFS中，客户端上传文件时，文件ID不是由客户端指定，而是由Storage server生成后返回给客户端的。文件ID中包含了组名、文件相对路径和文件名，Storage server可以根据文件…

FastDFS基础
type: item
date: 2020-09-09T21:31:19+08:00
description: 为什么要有分布式文件系统单机时代优点：文件访问比较便利，项目直接引用，实现起来简单，无需任何复杂技术，保存文件和访问文件都很方便。缺点：一方面，文件和代码耦合在一起，文件越多存放越混乱。另一方面，如果流量比较大，静态文件访问会占据一定的资源，影响正常业务进行，不利于网站快速发展。独立文件服务器优点：Web/App服务器可以更专注发挥动态处理的能力。独立存储，更方便做扩容、容灾和数据迁移；方便做图片等资源请求的负载均衡，方便应用各种缓存策略（HTTP Header、Proxy Cache等），也更加方便迁移到CDN。缺点：单机存在性能瓶颈，容灾、垂直扩展性稍差分布式文件系统优点：扩展能力: 毫无疑问，扩展能力是一个分布式文件系统最重要的特点；高可用性: 在分布式文件系统中，高可用性包含两层，一是整个文件系统的可用性，二是数据的完整和一致性；弹性存储: 可以根据业务需要灵活地增加或缩减数据存储以及增删存储池中的资源，而不需要中断系统运行。缺点：系统复杂度稍高，需要更多服务器。分布式存储解决方案对比指标适合类型文件分布复杂度FUSEPOSIX备份机制通讯协议接口社区支持开发语言FastDFS4KB~500MB小文件合并存储不分片处理简单不支持不支持组内冗余备份Api http国内用户群CTFS所有文件小文件合并，以block组织分片复杂不支持不支持Block存储多份，主辅灾备Api http少C++MFS大于64K分片存储复杂支持支持多点备份动态冗余使用fuse较多PerlHDFS大文件大文件分片分块存储简单支持支持多副本原生api较多JavaCeph对象文件块OSD一主多从复杂支持支持多副本原生api较少C++MogileFS海量小图片不分片存储复杂可以支持不支持动态冗余http原生api文档少Perl什么是FastDFSFastDFS是用C语言编写的一款开源的轻量级分布式文件系统。它对文件进行管理，功能包括：文件存储、文件同步、文件访问（文件上传、文件下载）等，解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务，如相册网站、视频网站等等。FastDFS为互联网量身定制，充分考虑了冗余备份、负载均衡、线性扩容等机制，并注重高可用、高性能等指标，使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。FastDFS特性分组存储，灵活简洁、对等结构，不存在单点文件不分块存储，上传的文件和OS文件系统中的文件一一对应文件ID由FastDFS生成，作为文件访问凭证，FastDFS不需要传统的name server和流行的web server无缝衔接，FastDFS已提供apache和nginx扩展模块中、小文件均可以很好支持，支持海量小文件存储支持多块磁盘，支持单盘数据恢复支持相同内容的文件只保存一份，节约磁盘空间支持在线扩容 支持主从文件存储服务器上可以保存文件属性（meta-data）V2.0网络通信采用libevent，支持大并发访问，整体性能更好下载文件支持多线程方式，支持断点续传FastDFS的构成FastDFS由客户端(Client)、 跟踪服务器(Tracker Server)和存储服务器(Storage Server)构成。客户端（client）客户端（client），作为业务请求的发起方，通过专有接口，使用TCP/IP协议与跟踪器服务器或存储节点进行数据交互。跟踪器（tracker）Trackerserver作用是负载均衡和调度，通过Tracker server在文件上传时可以根据一些策略找到Storage server提供文件上传服务。可以将tracker称为追踪服务器或调度服务器。跟踪器在访问上起负载均衡的作用。可以随时增加或下线而不会影响线上服务。存储节点（storage）Storageserver作用是文件存储，客户端上传的文件最终存储在Storage服务器上，Storage server没有实现自己的文件系统而是利用操作系统的文件系统来管理文件。可以将storage称为存储服务器。存储节点中的服务器均可以随时增加或下线而不会影响线上服务。Linux下FastDFS 安装安装编译环境yum install git gcc gcc-c++ make automake vim wget libevent -y安装libfastcommon 基础库mkdir /root/fastdfs cd /root/fastdfs git clone https://github.com/happyfish100/libfastcommon.git --depth 1 cd libfastcommon/ ./make.sh && ./make.sh install安装FastDFScd /ro…