FASTDFS是什么
FastDFS是由国人余庆所开发,其项目地址:https://github.com/happyfish100
FastDFS是一个轻量级的开源分布式文件系统,主要解决了大容量的文件存储和高并发访问的问题,文件存取时实现了负载均衡。
FastDFS是一款类Google FS的开源分布式文件系统,它用纯C语言实现,支持Linux、FreeBSD、AIX等UNIX系统。它只能通过 专有API对文件进行存取访问,不支持POSIX接口方式,不能mount使用。准确地讲,Google FS以及FastDFS、mogileFS、 HDFS、TFS等类Google FS都不是系统级的分布式文件系统,而是应用级的分布式文件存储服务。
FastDFS的特性
2、 文件ID由FastDFS生成,作为文件访问凭证。FastDFS不需要传统的name server
3、和流行的web server无缝衔接,FastDFS已提供apache和nginx扩展模块
FastDFS |
mogileFS |
|
系统简洁性 |
简洁,只有两个角色:tracker和storage |
一般,有三个角色:tracker,storage和存储文件信息的mysql db |
系统性能 |
很高(没有数据库,文件同步直接点对点,不经过tracker中转) |
高(使用mysql来存储文件索引等信息文件同步通过tracker调度和中转) |
系统稳定性 |
高(c语言开发,可以支持高并发和高负载) |
一般(Perl语言开发,高并发和高负载支持一般) |
RAID方式 |
分组(组内冗余),灵活性大 |
动态冗余,灵活性一般 |
通信协议 |
专有协议 下载文件支持http |
http |
技术文档 |
较详细 |
较少 |
文件附加属性(meta data) |
支持 |
不支持 |
相同内容文件只保存一分 |
支持 |
不支持 |
下载文件时支持文件偏移量 |
支持 |
不支持 |
FastDFS |
NFS |
集中存储设备如:NetApp,NAS |
|
线性扩容性 |
高 |
差 |
差 |
文件高并发访问性能 |
高 |
差 |
一般 |
文件访问方式 |
专有API |
POSIX |
支持POSIX |
硬件成本 |
较低 |
中等 |
高 |
相同文件内容只保存一份 |
支持 |
不支持 |
不支持 |
工作方式:客户端向tracker发出请求,然后tracker从storage节点拿到源数据,返还给客户端,然后客户端根据源数据再去请求storage节点。
FastDFS架构解读
1.只有两个角色,tracker server和storage server,不需要存储文件索引信息
2.所有服务器都是对等的,不存在Master-Slave关系
3.存储服务器采用分组方式,同组内存储服务器上的文件完全相同(RAID 1)
5.由storage server主动向tracker server报告状态信息,tracker server之间通常不会相互通信
系统架构-上传文件流程图
1. client询问tracker上传到的storage;
3. client直接和storage通信完成文件上传,storage返回文件ID。
•系统架构-下载文件流程图
1. client询问tracker下载文件的storage,参数为文件ID(组名和文件名);
FastDFS同步机制
1.采用binlog文件记录更新操作,根据binlog进行文件同步同一组内的storage server之间是对等的,文件上传、删除等操作可以在任意一台storage server上进行;
2.文件同步只在同组内的storage server之间进行,采用push方式,即源服务器同步给目标服务器;
源头数据才需要同步,备份数据不需要再次同步,否则就构成环路了;
3.上述第二条规则有个例外,就是新增加一台storage server时,由已有的一台storage server将已有的所有数据(包括源头数据和备份数据)同步给该新增服务器。
FastDFS用户请求过程
FastDFS核心组件
Tracker:调度器,负责维持集群的信息,例如各group及其内部的storage node,这些信息也是storage node报告所生成;每个storage node会周期性向tracker发心跳信息;
storage server:以group为单位进行组织,任何一个storage server都应该属于某个group,一个group应该包含多个storage server;在同一个group内部,各storage server的数据互相冗余;
FastDFS运行机制
如何在组中挑选storage server:
如何选择磁盘(存储路径):
生成FID:
由源头storage server ip、创建时的时间戳、大小、文件的校验码和一个随机数进行hash计算后生成;最后基于base64
groupID/MID/H1ID/H2ID/file_name
file_name:文件名,不同于用户上传时使用文件名,而是由服务器生成hash文件名;
文件同步:
每个storage server在文件存储完成后,会将其信息存于binlog, binlog不包含数据,仅包含文件名等元数据信息;
FastDFS配置修改
tracker:
编辑tracker server配置文件tracker.conf,需要修改内容如下:
disabled=false(默认为false,表示是否无效)
base_path=/data/fastdfs/tracker
storage server:
disabled=false(默认为false,表示是否无效)
base_path=/data/fastdfs/storage
tracker_server=172.18.10.232:22122
store_path0=/data/fastdfs/storage
http.server_port=8888(默认为8888,nginx中配置的监听端口那之一致)
实验:企业级分布式存储应用与实战fastdfs实现
实验环境:3台机器,一台tracker调度器,两台storage节点服务器
(1)安装fastdfs
1.创建一个安装fastdfs所需软件包的目录
2.用lftp将安装fastdfs所需软件包下载到该目录里
lftp 172.17.0.1:/pub/Sources/7.x86_64/fastdfs> mget *
yum localinstall fastdfs* lib* -y 因为有依赖关系,所以和依赖的库文件包一起安装
4.另外两台机器也是如此
(2)配置tracker调度器
cp tracker.conf.sample tracker.conf 在/etc/fdfs目录下有一个tracker配置文件模板,将其复制并改名为tracker.conf作为tarcker的配置文件
disabled=false(默认为false,表示是否无效)
base_path=/data/fastdfs/tracker
mdkir /data/fastdfs/tracker -p
/etc/init.d/fdfs_trackerd start 启动tracker服务
注意:路径和创建的目录要一致,不要写错,否则tracker服务就会起不来
(3)配置storage节点服务器
cp storage.conf.sample storage.conf 在/etc/fdfs目录下有一个storage配置文件模板,将其复制并改名为storage.conf作为storage的配置文件
disabled=false(默认为false,表示是否无效)
base_path=/data/fastdfs/storage
tracker_server=172.18.10.232:22122
store_path0=/data/fastdfs/storage
http.server_port=8888(默认为8888,nginx中配置的监听端口那之一致)
mkdir /data/fastdfs/storage -p
/etc/init.d/fdfs_storaged start 启动storage服务
注意:路径和创建的目录要一致,不要写错,否则storage服务就会起不来
(4)查看存储节点状态,需要配置客户端配置文件
cp client.conf.sample client.conf
base_path=/data/fastdfs/tracker
tracker_server=192.168.10.190:22122
fdfs_monitor /etc/fdfs/client.conf 查看存储节点状态
(5)文件上传
fdfs_upload_file /etc/fdfs/client.conf /root/solo-2.2.0.war
6.上传文件查看(在调度器上查看)
fdfs_file_info /etc/fdfs/client.conf group1/M00/00/00/wKgKu1ocsWGADh40AABakQQUHpk839.log
fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/wKgKu1ocsWGADh40AABakQQUHpk839.log
8.FastDFS实现nginx代理(在storage节点)
1、安装nginx以及对应模块
2、修改nginx的location配置,映射路径和启动模块
root /data/fastdfs/storage/data;
3、修改对应fastdfs模块
vim /etc/fdfs/mod_fastdfs.conf
tracker_server=192.168.10.190:22122
store_path0=/data/fastdfs/storage