一、简介
FastDFS是用 C 语言编写的一款开源的轻量级分布式文件系统。它解决了大数据量存储和负载均衡等问题。它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以中小文件(建议范围:4KB < file_size
FastDFS充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用 FastDFS 很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
二、系统结构
FastDFS 系统有三个角色:跟踪服务器(Tracker Server)、存储服务器(Storage Server)和客户端(Client)。
◆ Tracker Server:跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的 storage server和 group,每个 storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳。
◆ Storage Server:存储服务器,主要提供容量和备份服务;以 group 为单位,每个 group 内可以有多台 storage server,数据互为备份。
◆ Client:客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。
服务端角色:跟踪器(tracker)和存储节点(storage)。跟踪器主要做调度工作,在访问上起负载均衡的作用。
存储节点存储文件,完成文件管理的所有功能:存储、同步和提供存取接口,FastDFS同时对文件的meta data进行管理。所谓文件的meta data就是文件的相关属性fastapi部署到服务器上,以键值对(key value pair)方式表示,如:width=1024,其中的key为width,value为1024。文件meta data是文件属性列表,可以包含多个键值对。
系统结构如下图所示:
跟踪器和存储节点都可以由一台多台服务器构成。跟踪器和存储节点中的服务器均可以随时增加或下线而不会影响线上服务。其中跟踪器中的所有服务器都是对等的,可以根据服务器的压力情况随时增加或减少。
三、特性
四、存储策略
为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。
在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。
FastDFS中的文件标识分为两个部分:卷名和文件名,二者缺一不可。
五、工作过程
1.上传
FastDFS向使用者提供基本文件访问接口,比如upload、download、append、delete等,以客户端库的方式提供给用户使用。
Storage Server会定期的向Tracker Server发送自己的存储信息。当Tracker Server Cluster中的Tracker Server不止一个时,各个Tracker之间的关系是对等的,所以客户端上传时可以选择任意一个Tracker。
当Tracker收到客户端上传文件的请求时,会为该文件分配一个可以存储文件的group,当选定了group后就要决定给客户端分配group中的哪一个storage server。当分配好storage server后,客户端向storage发送写文件请求,storage将会为文件分配一个数据存储目录。然后为文件分配一个fileid,最后根据以上的信息生成文件名存储文件。
文件上传交互过程:
①client询问tracker上传到的storage,不需要附加参数;
②tracker返回一台可用的storage;
③client直接和storage通讯完成文件上传。
2.文件同步
写文件时,客户端将文件写至group内一个storage server即认为写文件成功,storage server写完文件后,会由后台线程将文件同步至同group内其他的storage server。
每个storage写文件后,同时会写一份binlog,binlog里不包含文件数据,只包含文件名等元信息,这份binlog用于后台同步,storage会记录向group内其他storage同步的进度,以便重启后能接上次的进度继续同步;进度以时间戳的方式进行记录,所以最好能保证集群内所有server的时钟保持同步。
storage的同步进度会作为元数据的一部分汇报到tracker上,tracke在选择读storage的时候会以同步进度作为参考。
3.文件下载
客户端uploadfile成功后,会拿到一个storage生成的文件名,接下来客户端根据这个文件名即可访问到该文件。
文件下载交互过程:
①client询问tracker下载文件的storage,参数为文件标识(卷名和文件名);
②tracker返回一台可用的storage;
③client直接和storage通讯完成文件下载。
需要说明的是,client为使用FastDFS服务的调用方,client也应该是一台服务器,它对tracker和storage的调用均为服务器间的调用。
跟upload file一样fastapi部署到服务器上,在downloadfile时客户端可以选择任意tracker server。tracker发送download请求给某个tracker,必须带上文件名信息,tracke从文件名中解析出文件的group、大小、创建时间等信息,然后为该请求选择一个storage用来服务读请求。
六、部署注意事项
对于互联网应用,FastDFS的标准使用姿势:通过FastDFS API进行文件上传等更新操作,storage server上通过FastDFS nginx扩展模块使用HTTP方式下载文件。FastDFS的文件名由storage server通过算法生成,生成的文件名中包含时间戳、文件大小、文件内容CRC32校验码、随机数等,因此FastDFS生成的文件名是完全离散的,客户端无法野蛮遍历或穷举。由此可见,storage server上部署的HTTP服务完全可以直接暴露到公网,提供给客户端浏览器访问。
安全起见,强烈建议FastDFS集群部署在内网,不要对外暴露tracker(22122端口) 和 storage(23000端口)服务。在跨机房访问等场景下,需要暴露FastDFS集群到公网,请做好安全设置和防护。首先推荐采用防火墙,对22122和23000端口访问采用白名单。其次可以使用FastDFS内置基于IP地址的白名单,在tracker.conf 和 storage.conf中配置allow_hosts。
allow_hosts 配置格式说明如下:
◆ allow_hosts 可以在配置文件中出现多次,通常设置允许访问的IP地址,也可以设置主机名(域名)。每行allow_hosts设置的IP地址或主机都会被纳入白名单;
◆ * (必须是单独的一个星号)表示允许所有来源IP,例如:
allow_hosts = *
◆ 可以使用CIDR格式的IP段,比如:192.168.1.2/24;
◆ 支持用方括号括起来的范围设置,一个配置项中只能出现一次范围设置,例如:10.0.1.[0-254] 或者 host[01-08,20-25].domain.com。
摘录tracker.conf (或 storage.conf)中的一段配置示例如下:
allow_hosts = 10.0.1.[1-15,20]
allow_hosts = host[01-08,20-25].domain.com
allow_hosts = 192.168.1.2/26
FastDFS出于简洁和高效考虑,没有存储文件索引等元数据,也不会对文件提供权限设置和访问控制等功能,相关功能需要应用(调用方)自己实现。
———END———
限 时 特 惠:本站每日持续更新海量各大内部创业教程,一年会员只需128元,全站资源免费下载点击查看详情
站 长 微 信:jiumai99