FastDFS分布式存储
目录
一:介绍
二:FastDFS 原理
1.FastDFS架构
2.文件的上传
3.文件的下载
4.同步时间管理
5.集成 Nginx
三.FastDFS部署
1.基础环境
2.安装libfastcommon
3.安装编译FastDFS
4.配置tracker服务器
5.配置Storage服务
6.配置client
7.测试上传文件
8.在所有storage节点安装fastdfs-nginx-module和nginx
9.部署代理
一:介绍
FastDFs 是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
FastDFS 为互联网量身定制,充分考虑了几余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用 FastDFS 很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务
二:FastDFS 原理
FastDFs是一个开源的轻量级分布式文件系统,纯C实现,目前提供了C、Java和PHP API.功能包括:文件存储,文件同步,文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以中小文件(建议范围:4KB<file size<500MB)为载体的
在线服务。
Fast DFS 系统有三个角色:跟踪服务器(Tracker Server)、存储服务器(Storage Server)和客户端(Client)。client 请求 Tracker server 进行文件上传、下载,通过 Tracker server调度最终由 Storage server 完成文件上传和下载,在底层存储上通过逻辑的分组概念,使得通过在同组内配置多个Storage,从而实现软 RAID10.
1.FastDFS架构
(1)Tracker server
跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的 Storage server 和 group,每个 storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳。tracker 上的元信息都是由 storage 汇报的信息生成的,本身不需要持久化任何数据,这样使得 tracker 非常容易扩展,直接增加 tracker 机器即可扩展为 tracker cluster 来服务cluster 里每个 tracker 之间是完全对等的,所有的 tracker 都接受 stroage 的心跳信息,生成元数据信息来提供读写服务,tracker根据storage的心跳信息,建立group==>[storageserver list]的映射表。
(2)Storage server
存储服务器,主要提供容量和备份服务;以group为单位,每个group内部可以有多台storage server,数据互为备份。客户端上传的文件最终存储在 storage 服务器上,Storageserver 没有实现自己的文件系统,而是利用操作系统的文件系统来管理文件,可以将storage 称为存储服务器。storage 可配置多个数据存储目录,比如有 10 块磁盘,分别挂载在/data/disk1-/data/disk10,则可将这 10 个目录都配置为 storage 的数据存储目录。
(3)Client
客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。FastDFS 向使用者提供基本文件访问接口,比如 upload、download、append、delete 等,以客户端库的方式提供给用户使用
2.文件的上传
- 客户端向 Tracker Server 发送上传请求,获取可用的 Storage Server 信息。
- Tracker Server 根据负载均衡策略(如轮询、存储空间优先等),返回一台 Storage Server 的地址和端口。
- 客户端直接与该 Storage Server 建立连接,发送文件数据。
- Storage Server 接收文件并存储,生成唯一的文件标识(File ID),返回给客户端。
3.文件的下载
- 客户端向 Tracker 发送文件下载请求,携带文件标识(File ID)。
- Tracker 根据 File ID 解析出文件所在的 Storage 组和节点信息,返回给客户端。
- 客户端直接与目标 Storage 通信,请求下载文件。
- Storage 返回文件数据,客户端接收并保存。
4.同步时间管理
当一个文件上传成功后,客户端马上发起对该文件下载请求(或删除请求)时,tracker是如何选定一个适用的存储服务器呢? 其实每个存储服务器都需要定时将自身的信息上报给 tracker,这些信息就包括了本地同步时间(即,同步到的最新文件的时间戳)。而 tracker根据各个存储服务器的上报情况,就能够知道刚刚上传的文件,在该存储组中是否已完成了同步。同步信息上报如下图:
写文件时,客户端将文件写至 group 内一个 storage server 即认为写文件成功,storageserver 写完文件后,会由后台线程将文件同步至同group 内其他的 storage server。
每个storage 写文件后,同时会写一份binlog,binlog 里不包含文件数据,只包含文件名等元信息,这份binlog用于后台同步,storage 会记录向 group 内其他 storage 同步的进度,以便重启后能接上次的进度继续同步;进度以时间戳的方式进行记录,所以最好能保证集群内所有 server 的时钟保持同步。
storage 的同步进度会作为元数据的一部分汇报到tracker 上,tracke 在选择读storage 的时候会以同步进度作为参考。比如一个 group 内有 A、B、C三个 storage server,A向0同步到进度为T1(T1 以前写的文件都已经同步到B上了),B向C同步到时间戳为T2(T2 〉T1),tracker 接收到这些同步进度信息时,就会进行整理,将最小的那个做为C的同步时间戳,本例中T1即为C的同步时间戳为T1(即所有T1以前写的数据都已经同步到C上了);同理,根据上述规则,tracker 会为A、B生成一个同步时间戳。
5.集成 Nginx
FastDFs 通过 Tracker 服务器,将文件放在 Storage 服务器存储,但是同组存储服务器之间需要进入文件复制,有同步延迟的问题。
假设 Tracker 服务器将文件上传到了 192.168.4.125,上传成功后文件 ID已经返回给客户端。此时 FastDFs 存储集群机制会将这个文件同步到同组存储 192.168.4.126,在文件还没有复制完成的情况下,客户端如果用这个文件 ID在 192.168.4.126上取文件,就会出现文件无法访问的错误。
而 fastdfs-nginx-module 可以重定向文件连接到文件上传时的源服务器取文件,避免客户端由于复制延迟导致的文件无法访问错误。
另外,使用 nginx 反向代理后,后端可以以HTTP 请求的方式来访问文件资源。访问 nginx反向代理+上传文件时的 ID
三.FastDFS部署
FastDFS 下载地址:https://github.com/happyfish100
(1)fastdfs
(2)libfastcommon
(3)fastdfs-nginx-module
(4)nginx-1.18.0
资源列表
操作系统 | 配置 | 主机名 | IP | 备注 |
openeuler | 2C4G | tracker01 | 192.168.10.101 | 跟踪服务器1 |
openeuler | 2C4G | tracker02 | 192.168.10.102 | 跟踪服务器2 |
openeuler | 2C4G | storage1 | 192.168.10.103 | 存储服务器1 |
openeuler | 2C4G | storage2 | 192.168.10.104 | 存储服务器2 |
openeuler | 2C4G | nginx | 192.168.10.105 | 代理服务器 |
1.基础环境
关闭防火墙,内核安全机制
2.安装libfastcommon
所有节点安装(代理服务器除外)
3.安装编译FastDFS
所有节点安装(代理服务器除外)
4.配置tracker服务器
修改配置文件
tracker节点
#修改的内容如下:
disabled=false #启用配置文件
port=22122 # tracker 服务器端口(默认 22122)
base_path=/fastdfs/tracker #存储日志和数据的根目录
store group=group1 #设置存储组名称
创建指定目录,启动服务
5.配置Storage服务
修改配置文件
#修改的内容如下:
disabled=false #启用配置文件
port=23000 # storage 服务端口
base path=/fastdfs/storage #数据和日志文件存储根目录
store path0=/fastdfs/storage #第一个存储目录
tracker server=192.168.10.101:22122# tracker 服务器 IP 和端囗tracker server=192.168.10.102:22122 # tracker 服务器 IP 和端囗
group name=group1 #需要和 tracker 中的组名保持一致
http.server port=8888 # http 访问文件的端口
创建基础数据目录,启动 storage 服务器
备注:
重启用如下命令:
/etc/fdfs/storage.conf restart
6.配置client
在任意一个 Fastdfs 节点上配置
#修改以下配置,其它保持默认
base path=/fastdfs/tracker
tracker server=192.168.10.101:22122 # tracker 服务器 IP 和端囗
tracker server=192.168.10.102:22122 # tracker 服务器 IP 和端囗
7.测试上传文件
8.在所有storage节点安装fastdfs-nginx-module和nginx
FastDFs 通过 Tracker 服务器,将文件放在 Storage 服务器存储,但是同组存储服务器之间需要进入文件复制,有同步延迟的问题。假设 Tracker 服务器将文件上传到了storage01,上传成功后文件 ID 已经返回给客户端。此时 FastDFS 存储集群机制会将这个文件同步到同组存储 storage02,在文件还没有复制完成的情况下,客户端如果用这个文件 ID 在storage02 上取文件,就会出现文件无法访问的错误。而 fastdfs-nginx-module 可以重定向文件连接到源服务器取文件,避免客户端由于复制延迟导致的文件无法访问错误。(解压后的 fastdfs-nginx-module 在nginx 安装时使用)
storage 上的 nginx 是用于访问具体的文件,并且需要使用 fastdfs 模块。
解压并修改 fastdfs-nginx-module的配置文件
编译安装nginx
配置FastDFS
connect_timeout=2 # 连接超时时间(秒)
tracker_server=192.168.10.101:22122 # 追踪服务器地址
tracker_server=192.168.10.102:22122 # 追踪服务器地址
storage_server_port=23000 # 存储服务器端口
group_name=group1 # 存储组名称
url_have_group_name=true # URL包含组名
store_path_count=1 # 存储路径数量
store_path0=/data/fastdfs/storage # 第一个存储路径
复制FastDFs 的部分配置文件到/etc/fdfs 目录
在/fastdfs/storage 文件存储目录下创建软连接,将其链接到实际存放数据的目录
配置 Nginx
修改 nginx.conf 文件,在 http指令块中新增如下配置
# 添加以下内容:
server {
listen 80;
server_name localhost;
location ~ /group([0-9])/M00 {
ngx_fastdfs_module;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
浏览器访问图片
http://192.168.10.103/group1/M00/00/00/wKgKZ2givpCAeaAYAArXDtvrj5I361_big.jpg
9.部署代理
192.168.10.105/group1/M00/00/00/wKgKZ2givpCAeaAYAArXDtvrj5I361_big.jpg