初创初期由于时间紧,在各种资源有限的情况下,通常就直接在项目目录下建立静态文件夹,用于存放项目中的文件资源。如果按不同类型再细分,可以在项目目录下再建立不同的子项目来区分。例如resource/static/file、resource/static/img等
优点是便利,使用方便;缺点是文件越多存放越混乱。
随着公司业务不断发展,将代码和文件放在同一服务器的弊端就会越来越明显。为了解决上面的问题,引入独立文件服务器。
工作流程:项目上传文件时,首先通过ftp或者ssh将文件上传到图片服务器的某个目录下,再通过nginx或者apache来访问此目录下的文件,返回一个独立域名的图片URL地址,前端使用文件时就通过这个URL地址读取。
随着业务继续发展,单台服务器存储和响应也很快达到了瓶颈,新的业务需要文件访问具有高响应性、高可用性来支持系统。
优点:
扩展能力:扩展能力是一个分布式文件系统最重要的特点。
高可用性:在分布式文件系统中,高可用性包含两层,一是整个文件系统的高可用性,二是数据的完整和一致性。
弹性存储:可以根据业务需要灵活的增加或缩减数据存储以及增删存储池中的资源,而不需要中断系统运行。
缺点:系统复杂度高,需要更多服务器
独立文件服务器的缺点是容灾、单点故障问题、垂直扩展性稍差。
垂直扩展:我们通过增加系统成员的生产效率来获得期望的负荷量。
水平扩展:就是增加服务器的数量。
FastDFS是一个开源的轻量级分布式文件系统。它解决了大数据量存储和负载均衡等问题。特别适合以中小文件(48k
文件不分块存储,上传的文件和OS文件系统中的文件一一对应
支持相同内容的文件只保存一份,节约磁盘空间
下载文件支持HTTP协议,可以使用Web Server,也可以和其他Web Server配合使用
支持在线扩容
支持主从文件
分布式文件服务提供商有阿里的OSS、七牛云存储、百度云存储。
tracker,跟踪服务器,主要做调度工作,起负载均衡作用。在内存中记录集群中所有存储组和存储服务器状态信息,是客户端和数据服务器交互的枢纽。
storage,存储服务器(又称存储节点或数据服务器),文件和文件属性(meta data)都保存到存储服务器上。Storage server直接利用OS文件系统调用管理文件。
client,客户端,作为业务请求的发起方,通过专有接口,使用TCP/IP协议与服务器或存储节点进行数据交互。FastDFS向使用者提供基本文件访问接口,比如upload、download、append、delete等,以客户端库的方式提供给用户使用。
group,组,也可称卷。同组内服务器上的文件是完全相同的,同组内的storage server之间是对等的,文件上传、删除等操作可以在任意一台storage server上进行。
traker相当于FastDFS的大脑,不论是上传还是下载都是通过tracker来分配资源;客户端一般可以使用nginx等静态服务器来做调用或做一部分缓存;存储服务器成为组(或卷),组与组之间是平行的关系,根据资源使用情况可以随时增加,组内服务器文件相互同步备份,以达到容灾的目的。
工作流程:client发起业务请求,通过tracker,tracker告诉你该找哪个storage并记录,client上传文件到storage,storage操作(上传时group内同步操作),最后返回结果给client。
首先客户端请求Tracker服务获取到存储服务器的ip地址和端口,然后客户端根据返回的ip地址和端口请求上传文件,存储服务器接收到请求后生产文件,并且将文件内容写入磁盘并返回给客户端file_id、路径信息、文件名等信息,客户端保存相关信息上传完毕。
上传的工作流程:
1.storage server向tracker server定时上传状态信息
2.client上传连接请求到tracker server
3.tracker server查看可用的storage server
4.tracker server返回信息(storage的ip和端口)给client,(剩余空间最多的优先返回给client)
5.上传文件(file content和meta data)到storage server
6.storage server生成file_id以及路径信息和文件名
7.storage server将上传内容写入磁盘
8.storage server返回file_id以及路径信息和文件名给client
9.client存储storage返回的文件信息
生成file_id:选定存储目录后,storage会为文件生成一个file_id,由storage server ip、文件创建时间,文件大小、文件crc32和一个随机数拼接而成,然后将这个二进制串进行base64编码,转换为可打印的字符串
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面有MIME的详细规范。
Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。
生成文件名:当文件存储到某个子目录后,即认为该文件存储成功,接下来会为该文件生成一个文件名,文件名由group、存储目录、两级子目录、file_id、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。
客户端将带上文件名信息请求tracker服务获取到存储服务器的ip地址和端口,然后客户端根据返回的IP地址和端口号请求下载文件,存储服务器接收到请求后返回文件给客户端。
下载的工作流程:
1.storage server向tracker server定时上传状态信息
2.client带文件名向tracker server发起下载连接请求
3.查询可用storage(检验同步状态)
4.返回信息(storage的ip和端口)给client
5.client向storage server下载文件,并传递file_id(组名,路径、文件名)
6.storage server查找文件
7.storage server返回文件内容file_content给client
yum -y install gcc-c++ perl-devel pcre-devel openssl-devel zlib-devel wget
,gcc-c++即下载c++的编译器。wget https://github.com/happyfish100/fastdfs/archive/V6.06.tar.gz
wget https://github.com/happyfish100/libfastcommon/archive/V1.0.43.tar.gz
tar -zxvf V1.0.43.tar.gz -C /usr/local
tar -zxvf V6.06.tar.gz -C /usr/local
./make.sh&&./make.sh install
./make.sh&&./make.sh install
cp client.conf.sample client.conf
,cp storage.conf.sample storage.conf
,cp tracker.conf.sample tracker.conf
tracker:
mkdir -p /data/fastdfs/tracker
base_path = /data/fastdfs/tracker
,http.server_port = 8888
;路径后面不要加注释./fdfs_trackerd start
ps -ef|grep fastdfs
,ps -ef|grep用来查找特定进程。netstat -lntup |grep fdfs
,此时有tracker一个角色storage:
mkdir /data/fastdfs/base
mkdir /data/fastdfs/storage
base_path = /data/fastdfs/base
,base_path0 = /data/fastdfs/storage
,tracker_server = 192.168.126.11:22122
;路径后面不要加注释 ./fdfs_storaged start
netstat -lntup |grep fdfs
,此时有storage和tracker俩个角色client:
mkdir /data/fastdfs/client
base_path = /data/fastdfs/client
,tracker_server = 192.168.126.11:22122
;路径后面不要加注释上传指令:fdfs_upload_file
[storage_ip:port]:可选参数
[store_path_index]:可选参数
下载指令:fdfs_download_file
[local_filename]:可选参数,文件下载后的存放地址
查看指令:fdfs_file_info
删除指令:fdfs_delete_file
实践示例:
上传:
fdfs_upload_file /etc/fdfs/client.conf /opt/1.jpg
,此时返回group1/M00/00/00/wKh-C2LlN-WAHjmXAALqcbRjO_Y336.jpg下载:
fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/wKh-C2LlN-WAHjmXAALqcbRjO_Y336.jpg
,在/opt目录会出现这张图片wKh-C2LlN-WAHjmXAALqcbRjO_Y336.jpg查看:
fdfs_file_info /etc/fdfs/client.conf group1/M00/00/00/wKh-C2LlN-WAHjmXAALqcbRjO_Y336.jpg
删除:
fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKh-C2LlN-WAHjmXAALqcbRjO_Y336.jpg
1.FastDFS的工作流程是storage server向tracker server定时发送状态信息;然后client向tracker server发起业务请求,tracker server 查看storage server组,在组中将合适的storage server的ip地址和端口号返回给client;而client根据ip地址和端口号下载/上传/查看/删除文件;storage server group同步处理业务;最后返回结果给client。
即client请求tracker server,tracker server返回storage server的端口号和ip地址,client根据端口号和ip地址对storage server操作,处理业务。
2.小项目可以直接将文件保存在项目中,不小不大的可以使用独立文件服务器,大项目用分布式文件系统。但是也要根据业务的需要来决定。
3.FastDFS是一个分布式文件系统,适合文件大小为48k到500m之间的。