FASTDFS 是什么
FastDFS 是由国人余庆所开发, 其项目地址: https://github.com/happyfish100
FastDFS 是一款类 Google FS 的开源分布式文件系统, 它用
FastDFS 是一个轻量级的开源分布式文件系统, 主要解决了大容量的文件存储和高并发访问的问题, 文件存取时实现了负载均衡.
纯 C 语言实现
, 支持 Linux,FreeBSD,AIX 等 UNIX 系统. 它只能通过 专有 API 对文件进行存取访问, 不支持 POSIX 接口方式, 不能 mount 使用. 准确地讲, Google FS 以及 FastDFS,mogileFS, HDFS,TFS 等类 Google FS 都不是系统级的分布式文件系统, 而是应用级的分布式文件存储服务.
FastDFS 的特性
1, 分组存储, 灵活简洁, 对等结构, 不存在单点
2, 文件 ID 由 FastDFS 生成, 作为文件访问凭证. FastDFS 不需要传统的 name server
3, 和流行的 web server 无缝衔接, FastDFS 已提供 apache 和 nginx 扩展模块
4, 大, 中, 小文件均可以很好支持, 支持海量小文件存储
5, 支持多块磁盘, 支持单盘数据恢复
6, 支持相同文件内容只保存一份, 节省存储空间
7, 存储服务器上可以保存文件附加属性
8, 下载文件支持多线程方式, 支持断点续传
指标 | FastDFS | mogileFS |
系统简洁性 | 简洁, 只有两个角色: tracker 和 storage | 一般, 有三个角色: tracker,storage 和存储文件信息的 mysql db |
系统性能 | 很高 (没有数据库, 文件同步直接点对点, 不经过 tracker 中转) | 高 (使用 mysql 来存储文件索引等信息文件同步通过 tracker 调度和中转) |
系统稳定性 | 高 (c 语言开发, 可以支持高并发和高负载) | 一般 (Perl 语言开发, 高并发和高负载支持一般) |
RAID 方式 | 分组 (组内冗余), 灵活性大 | 动态冗余, 灵活性一般 |
通信协议 | 专有协议 下载文件支持 http | http |
技术文档 | 较详细 | 较少 |
文件附加属性 (meta data) | 支持 | 不支持 |
相同内容文件只保存一分 | 支持 | 不支持 |
下载文件时支持文件偏移量 | 支持 | 不支持 |
FastDFS 和集中存储方式对比
指标 | FastDFS | NFS | 集中存储设备如: NetApp,NAS |
线性扩容性 | 高 | 差 | 差 |
文件高并发访问性能 | 高 | 差 | 一般 |
文件访问方式 | 专有 API | POSIX | 支持 POSIX |
硬件成本 | 较低 | 中等 | 高 |
相同文件内容只保存一份 | 支持 | 不支持 | 不支持 |
工作方式: 客户端向 tracker 发出请求, 然后 tracker 从 storage 节点拿到源数据, 返还给客户端, 然后客户端根据源数据再去请求 storage 节点.
FastDFS 架构解读
1. 只有两个角色, tracker server 和 storage server, 不需要存储文件索引信息
2. 所有服务器都是对等的, 不存在 Master-Slave 关系
3. 存储服务器采用分组方式, 同组内存储服务器上的文件完全相同(RAID 1)
4. 不同组的 storage server 之间不会相互通信
5. 由 storage server 主动向 tracker server 报告状态信息, tracker server 之间通常不会相互通信
系统架构-上传文件流程图
1. client 询问 tracker 上传到的 storage;
3. client 直接和 storage 通信完成文件上传, storage 返回文件 ID.
2. tracker 返回一台可用的 storage;
• 系统架构-下载文件流程图
1. client 询问 tracker 下载文件的 storage, 参数为文件 ID(组名和文件名);
3. client 直接和 storage 通信完成文件下载.
2. tracker 返回一台可用的 storage;
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:
1,rr;
2, 以 ip 为次序, 找第一个, 即 IP 地址较小者;
3, 以优先级为序, 找第一个;
如何选择磁盘(存储路径):
1,rr;
2, 剩余可用空间大者优先;
生成 FID:
由源头 storage server ip, 创建时的时间戳, 大小, 文件的校验码和一个随机数进行 hash 计算后生成; 最后基于 base64
进行文本编码, 转换为可打印字符;
groupID/MID/H1ID/H2ID/file_name
groupID: 组编号
MID: 存储路径 (存储设备) 编号
H1ID/H2ID: 目录分层
file_name: 文件名, 不同于用户上传时使用文件名, 而是由服务器生成 hash 文件名;
服务器 IP, 文件创建时的时间戳, 文件大小, 文件名和扩展名;
文件同步:
binlog 可用于同步;
每个 storage server 在文件存储完成后, 会将其信息存于 binlog, binlog 不包含数据, 仅包含文件名等元数据信息;
FastDFS 配置修改
tracker:
编辑 tracker server 配置文件 tracker.conf, 需要修改内容如下:
disabled=false(默认为 false, 表示是否无效)
port=22122(默认为 22122)
base_path=/data/fastdfs/tracker
storage server:
disabled=false(默认为 false, 表示是否无效)
port=23000(默认为 23000)
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 所需软件包的目录
mkdir fastdfs
cd /app
2. 用 lftp 将安装 fastdfs 所需软件包下载到该目录里
lftp 172.17.0.1:/pub/Sources/7.x86_64/fastdfs> mget *
lftp 172.17.0.1
yum localinstall fastdfs* lib* -y 因为有依赖关系, 所以和依赖的库文件包一起安装
3. 安装 fastdfs
4. 另外两台机器也是如此
(2)配置 tracker 调度器
vim tracker.conf
cp tracker.conf.sample tracker.conf 在 / etc/fdfs 目录下有一个 tracker 配置文件模板, 将其复制并改名为 tracker.conf 作为 tarcker 的配置文件
cd /etc/fdfs
disabled=false(默认为 false, 表示是否无效)
port=22122(默认为 22122)
base_path=/data/fastdfs/tracker
ps -ef|grep fdfs 查看 tracker 进程
ss -ntl 查看是否有 22122 端口
注意: 路径和创建的目录要一致, 不要写错, 否则 tracker 服务就会起不来
/etc/init.d/fdfs_trackerd start 启动 tracker 服务
mdkir /data/fastdfs/tracker -p
(3)配置 storage 节点服务器
vim storage.conf
cp storage.conf.sample storage.conf 在 / etc/fdfs 目录下有一个 storage 配置文件模板, 将其复制并改名为 storage.conf 作为 storage 的配置文件
cd /etc/fdfs
disabled=false(默认为 false, 表示是否无效)
port=23000(默认为 23000)
base_path=/data/fastdfs/storage
tracker_server=172.18.10.232:22122
store_path0=/data/fastdfs/storage
http.server_port=8888(默认为 8888,nginx 中配置的监听端口那之一致)
ps -ef|grep fdfs
ss -ntl 查看是否有 23000 端口
注意: 路径和创建的目录要一致, 不要写错, 否则 storage 服务就会起不来
/etc/init.d/fdfs_storaged start 启动 storage 服务
mkdir /data/fastdfs/storage -p
(4)查看存储节点状态, 需要配置客户端配置文件
vim client.conf
cp client.conf.sample client.conf
cd /etc/fdfs
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
在 storage 节点服务器上查看
我们可以在 tracker 调度器上做 md5 校验
6. 上传文件查看(在调度器上查看)
fdfs_file_info /etc/fdfs/client.conf group1/M00/00/00/wKgKu1ocsWGADh40AABakQQUHpk839.log
7. 文件下载
fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/wKgKu1ocsWGADh40AABakQQUHpk839.log
8.FastDFS 实现 nginx 代理(在 storage 节点)
1, 安装 nginx 以及对应模块
yum localinstall nginx* -y
cd /app/fastdfs
2, 修改 nginx 的 location 配置, 映射路径和启动模块
}
ngx_fastdfs_module;
root /data/fastdfs/storage/data;
location /group1/M00 {
3, 修改对应 fastdfs 模块
store_path0=/data/fastdfs/storage
tracker_server=192.168.10.190:22122
url_have_group_name = true
vim /etc/fdfs/mod_fastdfs.conf
4. 启动 nginx 服务
5. 然后我上传一个图片文件
6. 在浏览器上去访问, 访问成功
来源: https://www.cnblogs.com/1477717815fuming/p/8404882.html