关于java:FastDFS分布式文件系统详解

6次阅读

共计 11633 个字符,预计需要花费 30 分钟才能阅读完成。


本文章转自:乐字节

文章次要解说:FastDFS 分布式文件系统详解

获取更多 Java 相干材料能够关注公众号《乐字节》发送:999

文件系统是操作系统用于在磁盘或分区上组织文件的办法和数据结构。磁盘空间是什么样的咱们并不分明,但文件系统能够给咱们出现一个十分清晰的表象,咱们能够创立、删除、批改和复制这些文件,而实现这些性能的软件就是文件系统。操作系统中负责 治理和存储文件信息的软件被称为文件管理系统,简称文件系统。

文件系统是操作系统的一个重要组成部分,通过对操作系统所治理的存储空间的形象,向用户提供对立的、对象化的拜访接口,屏蔽对物理设施的间接操作和资源管理。也就是说,文件系统解决了普通用户应用磁盘存储数据的问题

文件系统的发展史

依据计算环境和所提供性能的不同,文件系统可划分为以下几种。

单机文件系统

特点:用于操作系统和应用程序的本地存储。

毛病:数据无奈在多台机器之间共享。

代表:EXT2、EXT3、EXT4、NTFS、FAT、FAT32、XFS、JFS 等等。

网络文件系统

特点:基于现有以太网架构,实现不同服务器之间传统文件系统的数据共享。

毛病:两台服务器不能同时拜访批改,性能无限。

代表:NFS、CIFS 等等,比方下图 Windows 主机之间进行网络文件共享就是通过微软公司本人的 CIFS 服务实现的。

分布式文件系统

数据量越来越多,在一个操作系统管辖的范畴存不下了,那么就调配到更多的操作系统治理的磁盘中,然而不方便管理和保护,因而迫切需要一种零碎来治理多台机器上的文件,这就是分布式文件管理系统

分布式文件系统(Distributed File System)是一种容许文件通过网络在多台主机上共享的文件系统,能够让多机器上的多用户进行文件分享和存储。在这样的文件系统中,客户端并非间接拜访底层的数据存储区块,而是通过网络,以特定的通信协议和服务器沟通。DFS 为散布在网络上任意地位的资源提供一个逻辑上的树形文件系统构造,让用户拜访散布在网络上的共享文件更加简便。所有高层次的文件系统都是以低层次的传统文件系统为根底,实现了更高级的性能。

特点:在传统文件系统上,通过额定模块实现数据跨服务器散布,并且本身集成 RAID 爱护性能,能够保障多台服务器同时拜访、批改同一个文件系统。性能优越,扩展性强,可靠性高。

毛病:局部类型存在单点故障危险。

代表:HDFS(ASF)、MogileFS(LiveJournal)、FastDFS(余庆)、Lustre(Oracle)、GlusterFS(RedHat)等等。

通用型

通用分布式文件系统和传统的本地文件系统(如 EXT4、NTFS 等)绝对应。典型代表:Lustre、MooseFS。

长处:传统文件系统的操作形式,对开发者门槛较低。

毛病:零碎复杂性较高,须要反对若干规范的文件操作,如:目录构造、文件读写权限、文件锁等。零碎整体性能有所升高,因为要反对 POSIX 规范(可移植操作系统接口 Portable Operating System Interface of UNIX)。

POSIX 全称:可移植操作系统接口。当 Unix 诞生之后,各个厂商都实现了本人的 Unix 零碎,导致接口不对立,基于不同的操作系统开发变得极其凌乱,为了解决这一问题,便有了 POSIX 规范。

总结:POSIX 规范的诞生就是为了对立操作系统的接口,不便开发者开发应用程序,写出可移植的代码程序。基于 POSIX 规范的库函数都是能够在此规范的操作系统平台上移植。

专用型

专用分布式文件系统基于谷歌文件系统论文(Google File System)的设计思维而来,文件上传后不能批改。应用专有 API 对文件进行拜访,也可称为分布式文件存储服务。典型代表:HDFS、MogileFS、FastDFS。

长处:零碎复杂性较低,不须要反对若干规范的文件操作,如:目录构造、文件读写权限、文件锁等。零碎整体性能较高,因为无需反对 POSIX 规范,零碎更加高效。

毛病 :采纳专有 API 对文件进行拜访,对开发者门槛较高,个别都是 间接封装成工具类 进行应用。

文件服务器的发展史

随着互联网图片、视频时代的到来,对文件的解决成为各个业务零碎面临的微小挑战,亟需搭建特有的文件服务器解决文件共享的问题。

本地文件服务器

特点 :本地文件服务器是指 文件数据间接存储在本地节点 中。比方间接在我的项目目录下建设文件夹寄存我的项目文件资源,如果按不同类型再细分,能够在我的项目目录下持续创立不同的子目录用于辨别。

长处:简略便捷,我的项目能够间接援用,拜访不便。

毛病:文件与代码混合存储不便于管理,随着文件的增多影响我的项目公布上线周期。

独立文件服务器

特点:搭建一台独立的服务器用于文件存储应用,我的项目上传文件时,先通过 ftp 或者 ssh 将文件上传至服务器某个目录下,再通过 Ngnix 或者 Apache Http Server 反向代理此目录,返回一个独立域名的文件 URL 地址,前端通过这个 URL 地址即可间接拜访文件。

长处:独立存储,能够不便扩容、容灾和数据迁徙。不便做图片拜访申请的负载平衡,不便利用各种缓存策略(HTTP Header、Proxy Cache 等),也更加不便迁徙到 CDN。而且图片拜访是很耗费服务器资源的(因为会波及到操作系统的上下文切换和磁盘 I/O 操作),分离出来当前,Web/App 服务器能够更专一施展动静解决的能力。

毛病:单机存在性能瓶颈,容灾、垂直扩展性差。

分布式文件服务器

特点 :分布式文件系统个别包含 拜访的仲裁 文件的存储 文件的容灾 三大块。仲裁模块相当于文件服务器的大脑,依据肯定的算法来决定文件存储的地位。文件存储模块负责保留文件。容灾模块负责文件数据的互相备份。

长处:弹性伸缩,性能优越,扩展性强,可靠性高。

毛病:零碎复杂度稍高,须要更多服务器。

FastDFS 简介

FastDFS 就是咱们上述所说的 专用型分布式文件系统,接下来咱们就具体理解它的外围概念,架构体系及环境的搭建与应用。

FastDFS 是基于 C 语言开发的,是一个轻量级开源的高性能分布式文件系统。次要性能有:文件存储、文件同步、文件拜访(文件上传 / 下载),解决了大容量的文件存储和高并发拜访的问题,文件存取时实现了负载平衡。FastDFS 特地适宜中大型网站以文件为载体的在线服务,适宜存储 4KB ~ 500MB 之间的小文件,如照片共享网站、视频共享网站(图片、文档、音频、视频等等)。

FastDFS 是一款国产开源软件,作者余庆,我的项目开源地址 Github:https://github.com/happyfish1… 官方论坛:http://bbs.chinaunix.net/foru…

FastDFS 架构

Client

客户端,实现文件上传下载的服务器,就是咱们本人的我的项目所部署在的服务器。通过专有接口,应用 TCP/IP 协定与跟踪服务器或存储服务器进行数据交互。FastDFS 向使用者提供根本文件拜访接口,比方 upload、download、append、delete 等,以客户端库的形式提供给用户应用。

Tracker Server

跟踪服务器,负责文件拜访的调度和负载平衡,负责管理所有的 Storage Server 和 group 组 / 卷。

Storage Server

存储服务器,负责文件存储,文件同步 / 备份,提供文件拜访接口,文件元数据管理。以 group 为单位,每个 group 内能够有多台 Storage Server,数据互为备份,达到容灾的目标。每个 Storage 在启动当前会被动连贯 Tracker,告知本人所属 group 等存储相干信息,并放弃周期性心跳。

Group

,也可称为 Volume 卷。同组内服务器上的文件是完全相同的,同一组内的 Storage Server 之间是对等的,文件上传、删除等操作能够在任意一台 Storage Server 上进行。

Metadata

文件系统中存储的数据分为 数据 元数据 两局部,数据是指文件中的理论数据,即文件的理论内容;而元数据是用来形容一个文件特色的零碎数据,诸如拜访权限、文件拥有者以及文件数据块的散布信息等等。如果文件是一张图片,元数据就是图片的宽,低等等。

FastDFS 存储策略

为了反对大容量存储,Storage 存储服务器采纳了分组(或分卷)的形式。存储系统由一个或多个组组成,组与组之间的文件是互相独立的,所有组的文件容量累加就是整个存储系统中的文件容量。一个组能够由一台或多台存储服务器组成,一个组下的存储服务器中的文件都是雷同的,组中的多台存储服务器起到了冗余备份和负载平衡的作用。

当组中减少了新的服务器时,零碎会主动同步已有的文件,同步实现后,零碎主动将新增的服务器切换至线上提供服务。

当存储空间有余时,能够动静增加组,只须要减少一台或多台服务器,并将它们配置为一个新的组,即可扩充存储系统的容量。当你的某个利用或者模块(对应的 group)的并发过高的时候,能够间接在 group 中减少若干个 Storage 来实现负载平衡。

为了防止单个目录下的文件数太多,当 Storage 第一次启动时,会在每个数据存储目录中创立 2 级子目录,每级 256 个,总共 65536 个目录,上传的文件会以 hash 的形式被路由到其中某个子目录下,而后将文件数据间接作为一个本地文件存储到该目录。

FastDFS 装置

机器散布

首先要阐明一下:trackerstorage 其实都是 fastdfs,只不过启动时通过不同的配置文件启动,所表演的角色不同而已。也就是说,装置 trackerstorage 就是在装置 fastdfs,而后通过每个角色具体的配置文件启动即可。

IP 角色
192.168.10.101 Tracker
192.168.10.102 Storage

下载资源

间接通过 Github:https://github.com/happyfish100 下载 libfastcommonfastdfsfastdfs-nginx-module 三个我的项目对应的压缩包或者应用 git 命令下载,或者通过资源地址:https://sourceforge.net/proje… 下载。

  • libfastcommon:从 fastdfs 我的项目和 fastdht 我的项目中提取进去的公共 C 函数库。
  • fastdfs:FastDFS 外围我的项目。
  • fastdfs-nginx-module:Nginx 整合 FastDFS 时 Nginx 须要增加的模块资源。

装置依赖

FastDFS 是基于 C 语言开发的,装置它之前必须先装置它所依赖的环境。

yum install -y make cmake gcc gcc-c++

装置公共函数库

上传资源 libfastcommon-master.zip 至服务器 /usr/local/src 目录后并解压。

# 装置 unzip 用于解压
yum install -y unzip
# 解压 libfastcommon 至以后所在目录
unzip libfastcommon-master.zip

编译并装置。

# 进入解压后的 libfastcommon-master 目录
cd libfastcommon-master
# 编译并装置
./make.sh && ./make.sh install

libfastcommon 默认装置在 /usr/lib64/usr/include/fastcommon 两个目录中,并且会在 /usr/lib 目录中创立软链接。

装置 FastDFS

上传资源 fastdfs-master.zip 至服务器 /usr/local/src 目录后并解压。

# 解压 fastdfs 至以后所在目录
unzip fastdfs-master.zip

编译并装置。

# 进入解压后的 libfastcommon-master 目录
cd fastdfs-master
# 编译并装置
./make.sh && ./make.sh install

fastdfs 默认装置在以下地位:

  • /usr/bin:可执行文件
  • /etc/fdfs:配置文件
  • /etc/init.d:主程序代码
  • /usr/include/fastdfs:插件组

启动 Tracker

trackerstorage 其实都是 fastdfs,只不过启动时通过不同的配置文件启动,所表演的角色不同而已。也就是说,装置 trackerstorage 就是在装置 fastdfs,而后通过每个角色具体的配置文件启动即可。

查看 /etc/fdfs 目录下所有配置文件。

[root@localhost ~]# ls /etc/fdfs/
client.conf.sample  storage.conf.sample  storage_ids.conf.sample  tracker.conf.sample
  • client.conf.sample:客户端的配置文件,测试用
  • storage.conf.sample:存储器的配置文件
  • tracker.conf.sample:跟踪器的配置文件

编辑 tracker.conf 配置文件。

# 拷贝文件 tracker.conf.sample 并重命名为 tracker.conf
cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
# 编辑 tracker.conf 配置文件
vi /etc/fdfs/tracker.conf

配置文件中的配置项还是蛮多的,这里暂且关注以下几个即可,前期依据理论状况再对其余配置项作出调整。

# 容许拜访 tracker 服务器的 IP 地址,为空则示意不受限制
bind_addr =

# tracker 服务监听端口
port = 22122

# tracker 服务器的运行数据和日志的存储父门路(须要提前创立好)base_path = /fastdfs/tracker

# tracker 服务器 HTTP 协定下裸露的端口
http.server_port = 8080

启动 tracker 服务。

# 创立 tracker 服务器的运行数据和日志的存储父门路
mkdir -p /fastdfs/tracker
# 启动 tracker 服务
service fdfs_trackerd start
# 查看 tracker 服务状态
service fdfs_trackerd status
# 重启 tracker 服务
service fdfs_trackerd restart
# 进行 tracker 服务
service fdfs_trackerd stop

启动 Storage

编辑 storage.conf 配置文件。

# 拷贝文件 storage.conf.sample 并重命名为 storage.conf
cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
# 编辑 storage.conf 配置文件
vi /etc/fdfs/storage.conf

配置文件中的配置项还是蛮多的,这里暂且关注以下几个即可,前期依据理论状况再对其余配置项作出调整。

# storage 组名 / 卷名,默认为 group1
group_name = group1

# 容许拜访 storage 服务器的 IP 地址,为空则示意不受限制
bind_addr =

# storage 服务器的运行数据和日志的存储父门路(须要提前创立好)base_path = /fastdfs/storage/base

# storage 服务器中客户端上传的文件的存储父门路(须要提前创立好)store_path0 = /fastdfs/storage/store

# storage 服务器 HTTP 协定下裸露的端口
http.server_port = 8888

# tracker 服务器的 IP 和端口
tracker_server = 192.168.10.101:22122

启动 storage 服务。

# 创立 storage 服务器的运行数据和日志的存储父门路
mkdir -p /fastdfs/storage/base
# 创立 storage 服务器中客户端上传的文件的存储父门路
mkdir -p /fastdfs/storage/store
# 启动 storage 服务
service fdfs_storaged start
# 查看 storage 服务状态
service fdfs_storaged status
# 重启 storage 服务
service fdfs_storaged restart
# 进行 storage 服务
service fdfs_storaged stop

查看 /fastdfs/storage/store 目录能够看到 Storage 服务器创立了 65536 个文件夹用于存储客户端上传的文件。

Client 操作

FastDFS 向使用者提供根本文件拜访接口,比方 upload、download、append、delete 等,以客户端库的形式提供给用户应用。

在 Tracker 服务器的机器上编辑 tracker.conf 配置文件。

# 拷贝文件 client.conf.sample 并重命名为 client.conf
cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
# 编辑 client.conf 配置文件
vi /etc/fdfs/client.conf

批改配置文件中以下两处内容即可。

# client 客户端的运行数据和日志的存储父门路(须要提前创立好)base_path = /fastdfs/client

# tracker 服务器的 IP 和端口
tracker_server = 192.168.10.101:22122

记得 mkdir -p /fastdfs/client 创立 Client 目录。

上传

抉择 Tracker Server

如上图所示,Storage Server 会定期向 Tracker Server 发送本人的所属 group 等存储相干信息。如果 Tracker Server 是集群环境,因为各个 Tracker 之间的关系是对等的,所以客户端上传时能够抉择任意一个 Tracker。

抉择 group

当 Tracker 收到客户端上传文件的申请时,会为该文件调配一个可用的 group 用于存储,入选定了 group 当前就要决定给客户端调配 group 中的哪个 Storage Server。

如上图所示,tracker.conf 配置文件中 group 的可选规定有:

  • round robin:所有的 group 间轮询
  • specify group:指定一个具体的 group
  • load balance:优先选择残余存储空间多的 group

抉择 Storage Server

当调配好 Storage Server 当前,客户端会向 Storage Server 发送上传文件申请,Storage Server 会为文件调配一个具体的数据存储目录。

如上图所示,storage.conf 配置文件中文件散发的可选规定有:

  • round robin:在 group 中的所有 Storage 间轮询
  • random:随机,按 hash code 散发

生成 file_id

选定存储目录当前,Storage 会为文件生一个 file_id,由 Storage Server IP、文件创建工夫、文件大小、文件 crc32 和一个随机数组成,而后将这个二进制串进行 base64 编码,转换为字符串。

生成文件名

当文件存储到某个子目录后,即认为该文件存储胜利,接下来会为该文件生成一个文件名,文件名由 group 名称 / 存储目录 / 两级子目录 /file_id. 后缀名 拼接而成。

FastDFS 文件上传返回信息解读

  • group1组名 / 卷名。文件上传胜利当前所在的 Storage 组名称,由 Storage 服务器返回。
  • M00虚构磁盘门路。与 Storage 配置文件中磁盘选项 store_path* 对应。如果配置了 store_path0 则是 M00,如果配置了 store_path1 则是 M01,以此类推。比方:store_path0 = /fastdfs/storage/storeM00 则示意:/fastdfs/storage/store/data
  • /02/44数据两级目录。Storage 服务器在每个虚构磁盘门路下创立的两级目录,用于存储数据文件。
  • wKgDrE34E8wAAAAAAAAGkEIYJK42378:file_id,由 Storage Server IP、文件创建工夫、文件大小、文件 crc32 和一个随机数组成,而后将这个二进制串进行 base64 编码,转换为字符串。
  • group1/M00/02/44/wKgDrE34E8wAAAAAAAAGkEIYJK42378.sh:文件名。

形式一

上传命令格局为:fdfs_upload_file /etc/fdfs/client.conf 要上传的文件

[root@localhost ~]# fdfs_upload_file /etc/fdfs/client.conf /usr/local/src/china.jpg
group1/M00/00/00/wKgKZl9skn6AHZKUAADhaCZ_RF0650.jpg

文件上传胜利当前,会返回该文件在 Storage 服务器中的存储地位及随机生成的文件名。其中 group1 示意 Storage 组名 / 卷名,M00 是一个虚拟目录,示意 /fastdfs/storage/store/data/ 实在门路中的 data 目录。

如下图所示,查看 Storage 服务器发现该文件已胜利上传。

形式二

或者应用:fdfs_test /etc/fdfs/client.conf upload 要上传的文件

[root@localhost ~]# fdfs_test /etc/fdfs/client.conf upload /usr/local/src/china.jpg
This is FastDFS client test program v6.07

Copyright (C) 2008, Happy Fish / YuQing

FastDFS may be copied only under the terms of the GNU General
Public License V3, which may be found in the FastDFS source kit.
Please visit the FastDFS Home Page http://www.fastken.com/ 
for more detail.

[2020-09-24 20:59:11] DEBUG - base_path=/fastdfs/client, connect_timeout=5, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0

tracker_query_storage_store_list_without_group: 
    server 1. group_name=, ip_addr=192.168.10.102, port=23000

group_name=group1, ip_addr=192.168.10.102, port=23000
storage_upload_by_filename
group_name=group1, remote_filename=M00/00/00/wKgKZl9smB-AVBRKAADhaCZ_RF0518.jpg
source ip address: 192.168.10.102
file timestamp=2020-09-24 20:59:11
file size=57704
file crc32=645874781
example file url: http://192.168.10.102/group1/M00/00/00/wKgKZl9smB-AVBRKAADhaCZ_RF0518.jpg
storage_upload_slave_by_filename
group_name=group1, remote_filename=M00/00/00/wKgKZl9smB-AVBRKAADhaCZ_RF0518_big.jpg
source ip address: 192.168.10.102
file timestamp=2020-09-24 20:59:11
file size=57704
file crc32=645874781
example file url: http://192.168.10.102/group1/M00/00/00/wKgKZl9smB-AVBRKAADhaCZ_RF0518_big.jpg

通过 fdfs_test 的形式上传文件,会返回该文件上传胜利当前具体的相干信息。

  • group_name:Storage 组名 / 卷名
  • remote_filename:上传胜利文件的存储门路及文件名
  • source_ip address:上传胜利文件所在的 Storage 服务器的 IP 地址
  • file timestamp:上传胜利文件时的工夫戳
  • file size:上传胜利文件的文件大小
  • example file url:上传胜利文件的 url 地址,配合 Nginx 能够间接拜访
  • storage_upload_slave_by_filename:FastDFS 的文件主 / 从个性,由主文件产生从文件

如下图所示,查看 Storage 服务器发现该文件已胜利上传。后缀为 jpg-m 的文件寄存了上传胜利文件的元数据信息。

查看元数据信息如下:

[root@localhost ~]# more /fastdfs/storage/store/data/00/00/wKgKZl9smB-AVBRKAADhaCZ_RF0518.jpg-m 
ext_namejpgfile_size115120height80width160

下载

客户端 upload file 胜利当前,会拿到一个 Storage 生成的文件名,接下来客户端依据这个文件名即可拜访到该文件。跟 upload file 一样,在 download file 时客户端能够抉择任意 Tracker Server。客户端发送 download 申请给某个 Tracker,必须带上文件名信息,Tracke 从文件名中解析出该文件的 group、大小、创立工夫等信息,而后为该申请抉择一个 Storage 用于提供读取服务。

形式一

下载命令格局为:fdfs_download_file /etc/fdfs/client.conf group_name/remote_filename

fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/wKgKZl9smB-AVBRKAADhaCZ_RF0518.jpg

形式二

或者应用:fdfs_test /etc/fdfs/client.conf download group_name remote_filename

fdfs_test /etc/fdfs/client.conf download group1 M00/00/00/wKgKZl9smB-AVBRKAADhaCZ_RF0518.jpg

删除

形式一

删除命令格局为:fdfs_delete_file /etc/fdfs/client.conf 要删除的文件

fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKgKZl9smB-AVBRKAADhaCZ_RF0518.jpg

Tips:删除文件操作会将元数据文件一并删除。

形式二

或者应用:fdfs_test /etc/fdfs/client.conf delete group_name remote_filename

fdfs_test /etc/fdfs/client.conf delete group1 M00/00/00/wKgKZl9smB-AVBRKAADhaCZ_RF0518_big.jpg

至此 FastDFS 的外围概念,架构体系及环境的搭建与应用就到这里。说到文件服务器的应用,咱们最终的目标是通过 HTTP 实现对文件的拜访,然而此时还无奈通过 HTTP 对文件进行拜访,这就须要借助其余工具来实现了,Nginx 就是一个不错的抉择,它是一个高性能的 HTTP 和反向代理 Web 服务器。下一篇咱们就应用 Nginx 整合 FastDFS 实现文件服务器的搭建。

感激大家的认同与反对,小编会继续转发《乐字节》优质文章

正文完
 0